Multidex issue for androidTest with gradle plugin 3.0.0 - android

Once I updated my app to gradle plugin 3.0.0 I started having issue with multidex, but only when I run androidTest.
My app was already multidex and with gradle plugin 2.3.3 both assembleDebug and assembleDebugAndroidTest were working fine. Then I just updated gradle plugin to 3.0.0 and I started receiving the following exception:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
I tried different options like defining custom multidex runner for tests, adding androidTestCompile 'com.android.support:multidex-instrumentation:1.0.2' dependency, but nothing helped. I also didn't find in release notes of gradle plugin 3.0.0, if something changed there for android tests.
Does anybody have similar issue for androidTest?

I believe it is a known issue: https://issuetracker.google.com/issues/37324038
The issue is that legacy multidex (min API < 21) is not supported in Android Gradle plugin 3.0.0 for androidTest APK's specifically. I was able to get it working by making a product flavor with min API >= 21 like so:
productFlavors {
local {
minSdkVersion 21
}
ci {
minSdkVersion 17
}
}
And then running androidTests using the connectedLocalDebugAndroidTest task

Related

Unable to load class AndroidComponentsExtension after upgrading the Android Gradle Plugin 7.1

I recently downloaded Android Studio Bumblebee and it helpfully asked whether I wanted to upgrade to Android Gradle Plugin 7.1.0, the version that shipped alongside Android Studio Bumblebee.
After upgrading, I get a build error:
Unable to load class 'com.android.build.api.extension.AndroidComponentsExtension'.
This is an unexpected error. Please file a bug containing the idea.log file.
And looking at the idea.log file, I see:
A problem occurred evaluating project ':main'.
at org.gradle.initialization.exception.DefaultExceptionAnalyser.transform(DefaultExceptionAnalyser.java:103)
...
Caused by: org.gradle.api.GradleScriptException: A problem occurred evaluating project ':main'.
at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:93)
...
Caused by: java.lang.NoClassDefFoundError: com/android/build/api/extension/AndroidComponentsExtension
at androidx.navigation.safeargs.gradle.SafeArgsPlugin.apply(SafeArgsPlugin.kt:73)
at androidx.navigation.safeargs.gradle.SafeArgsPlugin.apply(SafeArgsPlugin.kt:42)
...
Caused by: java.lang.ClassNotFoundException: com.android.build.api.extension.AndroidComponentsExtension
Which means I can't run my app and I need to downgrade the AGP 7.0 to get things working again. How do I fix this and upgrade to Android Gradle Plugin 7.1.0?
Updating Navigation Safe Args
These lines are the important ones to look at:
Caused by: java.lang.NoClassDefFoundError: com/android/build/api/extension/AndroidComponentsExtension
at androidx.navigation.safeargs.gradle.SafeArgsPlugin.apply(SafeArgsPlugin.kt:73)
at androidx.navigation.safeargs.gradle.SafeArgsPlugin.apply(SafeArgsPlugin.kt:42)
This indicates that the error is coming from the Navigation Safe Args plugin.
As per the Android Gradle Plugin 7.1.0 release notes:
AGP APIs that the Navigation Safe Args Gradle plugin depend on have been removed. AGP 7.1 does not work with Navigation Safe Args versions 2.4.0-rc1 or 2.4.0, but will work with versions 2.5.0-alpha01 and 2.4.1. In the meantime, as a workaround, you can use AGP 7.1 with a snapshot build of Navigation Safe Args, Navigation 2.5.0-SNAPSHOT. To use the snapshot build, follow the snapshot instructions with build id #8054565.
As Navigation 2.4.1 is now available, you can upgrade to that version of Navigation to gain the fix:
Backported from Navigation 2.5.0-alpha01: Safe Args now depends on Android Gradle Plugin version 7.0.4. This means that Navigation Safe Args will no longer be compatible with Android Studio versions prior to 7.0, but is now compatible with Android Gradle Plugin 7.1.0 and higher.
dependencies {
classpath 'com.android.tools.build:gradle:7.1.0'
// Update this line to use 2.4.1
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.4.1"
}
Note that you should always use the same version of the Navigation library as the Safe Args plugin (i.e., your app should also use Navigation 2.4.1): you should not try to use the Navigation 2.4.1+ Safe Args plugin with an earlier version of Navigation (such as 2.3.5).
Note on Firebase Perf Plugin
Note that you might see this same error when you are using:
classpath "com.google.firebase:perf-plugin:1.4.0"
With an idea.log of that states:
Caused by: java.lang.NoClassDefFoundError: com/android/build/api/extension/AndroidComponentsExtension
at com.google.firebase.perf.plugin.FirebasePerfClassVisitorFactory.registerForProject(FirebasePerfClassVisitorFactory.java:54)
at com.google.firebase.perf.plugin.FirebasePerfPlugin.perform(FirebasePerfPlugin.java:145)
at com.google.firebase.perf.plugin.FirebasePerfPlugin.lambda$apply$0(FirebasePerfPlugin.java:107)
As per the Firebase Perf Plugin 1.4.1 Release Notes:
Migrated away from the deprecated Android Gradle plugin APIs.
So you should upgrade to 1.4.1:
classpath "com.google.firebase:perf-plugin:1.4.1"
In my case, the problem was with hilt version. I've updated to the last 2.40.5 and it's work.
If you don't have hilt dependency in your project the best way to find a library that throws the exception during gradle sync it's to check idea.log file.
And find something like that.
Caused by: java.lang.NoClassDefFoundError: com/android/build/api/extension/AndroidComponentsExtension
at dagger.hilt.android.plugin.HiltGradlePlugin.configureBytecodeTransformASM(HiltGradlePlugin.kt:257)
Have a good coding :)
Update: the issue is now fixed in AGP 7.1.2.
Firebase perf plugin 1.4.1 will only work with AGP 7.1 if your project doesn't depend on any library that uses multi-release JARs, aka MRJARs.
A popular dependency that uses MRJARs is moshi.
The root cause of the issue lies in the Android Gradle Plugin.
The Firebase Perf team made the following statement:
Here are some updates:
AGP v7.2.0-beta01 was made available last week and will work with the latest perf plugin v1.4.1.
AGP v7.2 RC1 is scheduled to release on the 1st of March and AGP v7.2 final is scheduled on the 9th of March.
In the meantime, here are some workarounds worth trying out:
Use perf plugin v1.3.5 with AGP v6.8.3. Perf plugin v1.3.5 and below is not compatible with AGP v7.0.0+; in order for the perf plugin to be compatible with AGP v7.0.0+, we have to use the new transform API, which introduces the build failure where even if the perf plugin filters out classes in the META-INF/ directory from instrumentation, AGP still tries to visit the class to collect information about it. However, AGP is working on a more permanent fix for this where we will have an option to filter out failed classes completely.
Wait until March 9 to integrate the latest perf plugin version and AGP.
Try a beta version of AGP with the latest perf plugin version and move to the production version after March 9th.
Stack trace:
org.gradle.api.GradleScriptException: A problem occurred evaluating project ':app'.
at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:93)
at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.lambda$apply$0(DefaultScriptPluginFactory.java:133)
at ...
Caused by: java.lang.NoClassDefFoundError: com/android/build/api/extension/AndroidComponentsExtension
at com.google.firebase.perf.plugin.FirebasePerfClassVisitorFactory.registerForProject(FirebasePerfClassVisitorFactory.java:54)
at com.google.firebase.perf.plugin.FirebasePerfPlugin.perform(FirebasePerfPlugin.java:145)
at com.google.firebase.perf.plugin.FirebasePerfPlugin.lambda$apply$0(FirebasePerfPlugin.java:107)
at org.gradle.api.internal.plugins.DefaultPluginManager$2.execute(DefaultPluginManager.java:258)
at ...
You can do this thing. Perfectly working for me
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '7.1.0' apply false
id 'com.android.library' version '7.1.0' apply false
id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
id "com.google.dagger.hilt.android" version '2.41' apply false
id 'androidx.navigation.safeargs.kotlin' version '2.4.0' apply false // use this one
// classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.4.0" (will not work now)
}
task clean(type: Delete) {
delete rootProject.buildDir
}
Updating Hilt to '2.40.5' and firebase:perf-plugin to '1.4.1' worked for me.
In my case I faced issue on secrets-gradle-plugin. Initially I used version 2.0.1(latest). After I downgrade into 1.3.0. It worked for me.
In project's root build.gradle file:
dependencies {
classpath 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:1.3.0'
}
In app-level build.gradle file:
plugins {
id 'com.android.application'
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
I fixed the issue by downgrading the version of navigation to 2.3.5
def nav_version = "2.3.5"
after testing, use navigation 2.4.0 and AGP 7.0.4 work fine
In my case i had to update Maps plugin..
Upgrade your navigation safeargs version to latest and everything will be fine. It worked for me. Here is [the link ] (https://developer.android.com/jetpack/androidx/releases/navigation "Navigation safeargs google documentation")! to get latest safeargs version.

Adding Gradle Dependency Breaks Gradle Build

I added the stripe sdk to my kotlin app and can no longer build my application.
Addition to grade file:
implementation 'com.stripe:stripe-android:16.8.2'
Build error:
/Users/username/.gradle/caches/transforms-2/files-2.1/6fabb8e15860d0b2ea75a56e95ee9aa5/jetified-kotlin-stdlib-common-1.5.0.jar!/META-INF/kotlin-stdlib-common.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.1, expected version is 1.1.16.
Removing the stripe dependency fixes the issue. I also tried deleting the cache folder referenced in the error message and it was just recreated and the issue persisted.
The problem seems to be a mismatch between the kotlin library used in your project and the version of the plugin that is not compatible.
Upgrade your Gradle version by going to File>Project Structure.
Ps:(also try downgrading your kotlin version to one of the 1.4.x versions)
Another developer ran into this same issue and solved it by upgrading Gradle
I updated my gradle like this
// id 'org.jetbrains.kotlin.android.extensions' deprecated
id 'kotlin-parcelize'
and in project gradle add this
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.32"
so now it works.

Old version of gradle is required error

I had a three year old Android Studio which I just upgraded to the latest version(3.2).
I opened a project and tried to run it, but I got this error:
Gradle project sync failed. Basic functionality (e.g. editing, debugging) will not work properly.
Then, I saw this in gradle-wrapper.properties:
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2-all.zip
From what I understand Gradle 2.2 is not compatible with Android Studio 3.2.
distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip
Now however, if I try building again, I get this error:
Gradle version 2.2 is required. Current version is 4.9.
Why does it ask me for an old version of Gradle?
There are TWO places to be aware of:
Android Gradle Plugin version.
Android wrapper version and Gradle version
Each version of Android Gradle Plugin version requires a minimum version of gradle version. For your case, it looks these two versions are not in sync. So, try to modify your files as below:
Top level build.gradle
buildscript {
repositories {
...
}
dependencies {
// This is the Android Gradle Plugin version
classpath 'com.android.tools.build:gradle:3.1.3'
}
}
gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip
Android studio doesn't support that version unfortunately. My advice is using 4.4, that's last full supported version.

Stop working project with vector drawables after update build.gradle on API < 21

I have working project.
minSdkVersion 17
com.android.tools.build:gradle:2.3.3
gradle 4.1
Android Studio 3 Canary 6
I have in my gradle files:
defaultConfig {
vectorDrawables.useSupportLibrary = true
vectorDrawables.generatedDensities = []
}
I call in activity too:
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
Application works perfectly. Now change to:
com.android.tools.build:gradle:3.0.0-alpha6
add to repositories google() line
Execute gradle clean assembleDebug.
App continue works on devices with API > 20. But for API < 21 (google android emulator) get crash on start application.
I see in logcat error: Resources$NotFoundException: Resource ID #0x7f080058 (0x7f080058 is drawable abc_vector_test).
Why?
UPD 2017-07-19: It was fixed and released in com.android.tools.build:gradle:3.0.0-alpha7
I'm add to gradle.properties line
android.enableAapt2=false
and it's solve my error.
UPD 2017-07-19: It was fixed and released in com.android.tools.build:gradle:3.0.0-alpha7
Gradle plugin from version 3 use new AAPT, that have some bugs.
After reading some issues on bug tracker, I've found that Gradle has option for full disable AAPT2: android.enableAapt2=false
Also from release notes to alpha5:
AAPT2. We are continuing to stabilize AAPT2 which enables incremental resource processing. If your build fails due to resource
processing issue, please send us a bug report. To temporarily disable
AAPT, set android.enableAapt2=false in your gradle.properties file.
Roboelectric is currently not compatible with AAPT2
I am facing the same problem, downgrade Android Studio to previous version canary5 and write the following in your build.gradle
buildscript {
...
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0-alpha5'
...

How to make my Gradle build file to always use the newest available Android Build Tools

I have a Gradle build file that contains the following section:
android {
compileSdkVersion 18
buildToolsVersion "18.0.0"
This defines the exact version of build tools to use. Is it possible to specify this as a min requirement as it is for dependencies?
I tried:
android {
compileSdkVersion 18
buildToolsVersion "18.0.+"
to automatically use minor updates of the build tools if available but that isn't working.
It produces the following error:
A problem occurred evaluating root project '####'.
Invalid full revision: 18.0.+
This is an intentional choice. The idea is that your build should be perfectly repeatable, and if you build on a different machine that may have a later version of the build tools, it won't suddenly start having errors. I could see an argument for wildcarding to the latest bugfix release ala 18.0.+ the way it does for other version strings in Gradle, but even then that breaks repeatability if there's a regression in the newer version of the build tools.
The relevant feature request for this is at https://code.google.com/p/android/issues/detail?id=59550

Categories

Resources