Status Update
Comments
xo...@google.com <xo...@google.com> #2
Thanks for the report. Would it be possible for you to share a zip dump of the inputs to R8, including the app's class files, keep rules, etc.? This should enable us to reproduce the build.
You can generate this by running:
./gradlew assembleRelease --no-daemon -Dcom.android.tools.r8.dumpinputtodirectory=/path/to/r8/dumps
See also
xa...@google.com <xa...@google.com> #3
xo...@google.com <xo...@google.com> #4
Thanks for sharing. Looking at the code from the dump it is not immediately clear why this would fail with a NullPointerException. Would it be possible for you to also share the APK that is not working?
xa...@google.com <xa...@google.com> #5
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at com.google.android.gms.internal.fitness.zzfv.zza(com.google.android.gms:play-services-fitness@@21.1.0:1)
at com.google.android.gms.fitness.data.Session$Builder.setActivity(com.google.android.gms:play-services-fitness@@21.1.0:1)
It happens for example when invoking:
val session = Session.Builder()
.setDescription("our description")
.setIdentifier("our package name")
.setActivity(FitnessActivities.SLEEP)
.setStartTime(startSleepTime, TimeUnit.MILLISECONDS)
.setEndTime(endSleepTime, TimeUnit.MILLISECONDS)
.build()
We tried it with both with R8 fullMode default enabled and with R8 full mode disabled, but in both cases the error occurs.
We also tested this with JavaVersion.VERSION_1_8 and with JavaVersion.VERSION_17 and in both cases the problem occurs.
In all cases it works fine with a debug build.
We we revert to gradle 7.4.2. the problem disappears.
Please let me know how we can help you with additional information.
so...@google.com <so...@google.com> #6
Would it be possible for you to share a small project that reproduces this?
The dump shared in
sp...@google.com <sp...@google.com> #7
A small project reproducing this issue is difficult, it requires the Google Fit integration.
I'm trying to create the code dumps for a release build, but I never use the gradlew command line and it runs with some errors, that I'm not familiar with. I will try it in another way.
xo...@google.com <xo...@google.com> #8
Please let me know if you need more information.
xo...@google.com <xo...@google.com> #9
Branch: main
commit 6c720a541af1562d61ccb0cf0727df6da0d22ba6
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Wed May 10 11:15:30 2023
Fix removal of live array-puts in presence of Assume instruction
Bug:
Change-Id: Ief4e51fcccba7e777f57efe9377ab20e89ca0554
M src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
M src/test/java/com/android/tools/r8/rewrite/arrays/ArrayPutsToArrayAliasTest.java
sp...@google.com <sp...@google.com> #10
Branch: main
commit bed41a13debd0875e508353cf79c33c751e49a22
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Wed May 10 11:01:26 2023
Reproduce removal of live array-puts in presence of Assume instruction
Bug:
Change-Id: I2bb641c28d6b107db2f3daefd4e7fedcf85cbde9
A src/test/java/com/android/tools/r8/rewrite/arrays/ArrayPutsToArrayAliasTest.java
am...@google.com <am...@google.com> #11
Branch: 8.0
commit 6392f0ec0142bd168635cb7b8b7610b343679288
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Wed May 10 11:28:06 2023
Version 8.0.46
Bug:
Change-Id: I98398113ef7db1971e7f91cddf0227d80f715313
M src/main/java/com/android/tools/r8/Version.java
sp...@google.com <sp...@google.com> #12
Branch: 8.0
commit b7985cfb00840d9997e05eb5fa5084df2a7699c4
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Wed May 10 11:28:00 2023
Fix removal of live array-puts in presence of Assume instruction
Bug:
Change-Id: Ief4e51fcccba7e777f57efe9377ab20e89ca0554
M src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
M src/test/java/com/android/tools/r8/rewrite/arrays/ArrayPutsToArrayAliasTest.java
am...@google.com <am...@google.com> #13
Branch: 8.0
commit 38eb966d483268f8f310b741a2652a64adea7d24
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Wed May 10 11:27:54 2023
Reproduce removal of live array-puts in presence of Assume instruction
Bug:
Change-Id: I2bb641c28d6b107db2f3daefd4e7fedcf85cbde9
A src/test/java/com/android/tools/r8/rewrite/arrays/ArrayPutsToArrayAliasTest.java
sp...@google.com <sp...@google.com> #14
Branch: 8.1
commit 1a4e130758d76eca543445eddae6b76e4550fc41
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Wed May 10 11:32:45 2023
Version 8.1.46
Bug:
Change-Id: Ife577927219199e5be967e1a7ad1bf7286214579
M src/main/java/com/android/tools/r8/Version.java
am...@google.com <am...@google.com> #15
Branch: 8.1
commit cc131e0e6d743f357d81802d701b698f1b8aea08
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Wed May 10 11:31:17 2023
Fix removal of live array-puts in presence of Assume instruction
Bug:
Change-Id: Ief4e51fcccba7e777f57efe9377ab20e89ca0554
M src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
M src/test/java/com/android/tools/r8/rewrite/arrays/ArrayPutsToArrayAliasTest.java
sp...@google.com <sp...@google.com> #16
Branch: 8.1
commit 1ea9424e831c7ba9f213df00ac2ae674ea092349
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Wed May 10 11:30:43 2023
Reproduce removal of live array-puts in presence of Assume instruction
Bug:
Change-Id: I2bb641c28d6b107db2f3daefd4e7fedcf85cbde9
A src/test/java/com/android/tools/r8/rewrite/arrays/ArrayPutsToArrayAliasTest.java
xa...@google.com <xa...@google.com> #17
Thanks for sharing the reproduction. This is now fixed in R8 8.0.46 and 8.1.46. R8 8.0.46 and 8.1.46 should make it into AGP 8.0.2 and AGP 8.1.0-beta4, respectively.
Until that is released you can build with R8 8.0.46 by making the following change to settings.gradle
or settings.gradle.kts
.
pluginManagement {
buildscript {
repositories {
mavenCentral()
maven {
url = uri("https://storage.googleapis.com/r8-releases/raw")
}
}
dependencies {
classpath("com.android.tools:r8:8.0.46")
}
}
}
sp...@google.com <sp...@google.com> #18
sp...@google.com <sp...@google.com> #19
I've attached a project which demonstrates when a build will break in case (3) from #16.
In this project, the app gets its namespace ("com.example.namespace"
) from the package
attribute of the AndroidManifest.xml
.
The AndroidTest component gets its namespace from the testApplicationId
, and it's the same namespace as the app's.
The AndroidTest component calls com.example.namespace.R.string.app_android_test_string
in ExampleInstrumentedTest
, which compiles as-is (./gradlew :app:assembleAndroidTest
), but if we add namespace "com.example.namespace"
to the DSL, then it doesn't compile anymore because the AndroidTest component's namespace becomes "com.example.namespace.test".
xo...@google.com <xo...@google.com> #20
Thanks for the test project.
What are the downsides of preserving the workingness of the project by adding testNamespace "com.example.namespace"
in the case that there is a collision, like in this test project? It builds successfully for me, but maybe there are subsequent problems?
xo...@google.com <xo...@google.com> #22
Thanks. (But not in the test project from -alpha09
).
sp...@google.com <sp...@google.com> #23
Ah, yes, looks like that change was merged in -alpha10
.
xo...@google.com <xo...@google.com> #24
OK. I've implemented the behaviour in main
and androidTest
packages we block the upgrade rather than upgrade to something that doesn't work: largely because there's no real way at the moment to conditionally hook the post-upgrade display (given that the post-upgrade display absolutely must display sync status and rollback recommendations/suggestions if appropriate). I think this is probably best (and consistent with other upgrade processors).
I think that's it for Upgrade Assistant support on this, apart from the precise canary when the new behaviour is activated: over to you, Scott.
sp...@google.com <sp...@google.com> #25
Thanks! Closing this bug as I still have
al...@booking.com <al...@booking.com> #26
After upgrading to Android Gradle Plugin 8.0.1 and moving all namespaces from Manifests to build scripts, my android tests started failing, giving me the following error:
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.myapp.android.test.TestApplication"
The problem seems to be related to the namespace: the namespace for android tests is %namespace% + ".test". When the OS tries to load a component that is declared in Manifest with a relative path like android:name=".TestApplication" it uses the test namespace and eventually cannot find it on the classpath.
Is there a way to fix this?
sp...@google.com <sp...@google.com> #27
Is there a way to fix this?
Can you use the fully qualified name instead of ".TestApplication"?
If that doesn't work for you, can you give more details so I can reproduce the issue? IIUC, the actual fully qualified class name is com.myapp.android.TestApplication
, and android:name=".TestApplication
is located in the androidTest
AndroidManifest.xml
... is that correct?
al...@booking.com <al...@booking.com> #28
Using fully qualified name fixes the problem, but it is not an elegant solution for a huge project with hundred of modules with android tests where it all needs to be fixed manually.
It worked well with "package" in Manifest.
Just wonder, is this the only solution?
sp...@google.com <sp...@google.com> #29
Using fully qualified name fixes the problem, but it is not an elegant solution for a huge project with hundred of modules with android tests where it all needs to be fixed manually.
Unfortunately, I can't think of another way to fix the problem.
It worked well with "package" in Manifest.
Yes, but we've opted to (1) disallow setting a value for package that is different than the (test) namespace and (2) disallow having namespace match testNamespace. (1) - because it is confusing, and (2) - because there can be unintended collisions of production vs test android resources.
Very sorry for the breaking change.
al...@booking.com <al...@booking.com> #30
xa...@google.com <xa...@google.com> #31
Isn't this issue more related to the change we made to the test applicationID
as part of this change? It used to be that the test appID was computed badly based on the test package, but we change the computation (I don't remember exactly the change).
The relative path in the manifest is expanded based on testApplicationId
, not the testNamespace
(computed or explicit).
You should configure this to be what you expect it to be.
sp...@google.com <sp...@google.com> #32
The relative path in the manifest is expanded based on testApplicationId, not the testNamespace (computed or explicit).
That was the old behavior, but AGP uses the namespace now, not the application ID. See
Description
See Issue 176931684 for reference.
Basically AndroidTest variants do not the correct value for the package name for their
R
classes. We need to fix this.This would be a source level breaking change for project and we would need support in the Upgrade Assistant to fix it.
We need to discuss timing but in all likelihood that would be done in AGP 8.0