Fixed
Status Update
Comments
js...@google.com <js...@google.com> #2
Could you let us know which version of AGP you're using?
Also, could you please try the latest version of R8? You need to change the top-level build.gradle as follows:
buildscript {
repositories {
maven {
url 'http://storage.googleapis.com/r8-releases/raw '
}
}
dependencies {
classpath 'com.android.tools:r8:1.4.71' // Must be before the Gradle Plugin for Android.
classpath 'com.android.tools.build:gradle:...'
}
}
Also, could you please try the latest version of R8? You need to change the top-level build.gradle as follows:
buildscript {
repositories {
maven {
url '
}
}
dependencies {
classpath 'com.android.tools:r8:1.4.71' // Must be before the Gradle Plugin for Android.
classpath 'com.android.tools.build:gradle:...'
}
}
js...@google.com <js...@google.com> #3
Btw, thank you for the report!
According to the stack trace, I can spot `com.example...` Do you have a reproducible sample project that you can share with us? That would be really helpful. If it's not a sample, but your own project, and if you don't prefer to post it publicly, you can send a project to jsjeon@google.com.
Thanks!
According to the stack trace, I can spot `com.example...` Do you have a reproducible sample project that you can share with us? That would be really helpful. If it's not a sample, but your own project, and if you don't prefer to post it publicly, you can send a project to jsjeon@google.com.
Thanks!
js...@google.com <js...@google.com> #4
Just for the records. We had an issue regarding slf4j a year ago: issue 76025099 , but at that time, it was IllegalAccessError. At least, similar instance field `name` does matter here: https://www.slf4j.org/api/org/slf4j/impl/JDK14LoggerAdapter.html#name (or https://android.googlesource.com/platform/external/slf4j/+/495cf23/src/java/org/slf4j/impl/JDK14LoggerAdapter.java#58 )
The stack trace and the workaround (-keepnames) reminded me of issue 123068484 (similar workaround until the fix is ready: https://issuetracker.google.com/issues/123068484#comment7 ) So, depending on the AGP/R8 version, this might be a dup of that issue.
The stack trace and the workaround (-keepnames) reminded me of
ni...@gmail.com <ni...@gmail.com> #5
AGP version is 3.3.2.
I don't have a sample. I renamed the package to com.example.
I'll see if I can create a sample project that reproduces the issue.
I tried the latest R8 version you referred and now the app crashes at startup with the following stacktrace:
2019-03-11 09:57:52.532 14065-14065/com.example. W/id..debu: Zip open failed: Failure to verify dex file '/data/app/com.example.-9uMWDOxoF68ciHzJS2zc7A==/base.apk!classes3.dex': Out-of-order field_ids
2019-03-11 09:57:52.571 14065-14065/com.example. E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example., PID: 14065
java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/j/b/a/d/b;
at kotlin.j.b.a.r.<clinit>(kClassCache.kt:27)
at kotlin.j.b.a.r.a(Unknown Source:0)
at kotlin.j.b.a._a.a(ReflectionFactoryImpl.java:45)
at kotlin.f.b.D.a(Reflection.java:50)
at com.example.Application.<clinit>(Unknown Source:7)
at java.lang.Class.newInstance(Native Method)
at android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:50)
at androidx.core.app.CoreComponentFactory.instantiateApplication(CoreComponentFactory.java:49)
at android.app.Instrumentation.newApplication(Instrumentation.java:1120)
at android.app.LoadedApk.makeApplication(LoadedApk.java:1061)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5891)
at android.app.ActivityThread.access$1100(ActivityThread.java:200)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6718)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.ClassNotFoundException: Didn't find class "kotlin.j.b.a.d.b" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.example.-9uMWDOxoF68ciHzJS2zc7A==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.-9uMWDOxoF68ciHzJS2zc7A==/lib/arm, /data/app/com.example.-9uMWDOxoF68ciHzJS2zc7A==/base.apk!/lib/armeabi-v7a, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at kotlin.j.b.a.r.<clinit>(kClassCache.kt:27)
at kotlin.j.b.a.r.a(Unknown Source:0)
at kotlin.j.b.a._a.a(ReflectionFactoryImpl.java:45)
at kotlin.f.b.D.a(Reflection.java:50)
at com.example.Application.<clinit>(Unknown Source:7)
at java.lang.Class.newInstance(Native Method)
at android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:50)
at androidx.core.app.CoreComponentFactory.instantiateApplication(CoreComponentFactory.java:49)
at android.app.Instrumentation.newApplication(Instrumentation.java:1120)
at android.app.LoadedApk.makeApplication(LoadedApk.java:1061)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5891)
at android.app.ActivityThread.access$1100(ActivityThread.java:200)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6718)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
I don't have a sample. I renamed the package to com.example.
I'll see if I can create a sample project that reproduces the issue.
I tried the latest R8 version you referred and now the app crashes at startup with the following stacktrace:
2019-03-11 09:57:52.532 14065-14065/com.example. W/id..debu: Zip open failed: Failure to verify dex file '/data/app/com.example.-9uMWDOxoF68ciHzJS2zc7A==/base.apk!classes3.dex': Out-of-order field_ids
2019-03-11 09:57:52.571 14065-14065/com.example. E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example., PID: 14065
java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/j/b/a/d/b;
at kotlin.j.b.a.r.<clinit>(kClassCache.kt:27)
at kotlin.j.b.a.r.a(Unknown Source:0)
at kotlin.j.b.a._a.a(ReflectionFactoryImpl.java:45)
at kotlin.f.b.D.a(Reflection.java:50)
at com.example.Application.<clinit>(Unknown Source:7)
at java.lang.Class.newInstance(Native Method)
at android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:50)
at androidx.core.app.CoreComponentFactory.instantiateApplication(CoreComponentFactory.java:49)
at android.app.Instrumentation.newApplication(Instrumentation.java:1120)
at android.app.LoadedApk.makeApplication(LoadedApk.java:1061)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5891)
at android.app.ActivityThread.access$1100(ActivityThread.java:200)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6718)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.ClassNotFoundException: Didn't find class "kotlin.j.b.a.d.b" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.example.-9uMWDOxoF68ciHzJS2zc7A==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.-9uMWDOxoF68ciHzJS2zc7A==/lib/arm, /data/app/com.example.-9uMWDOxoF68ciHzJS2zc7A==/base.apk!/lib/armeabi-v7a, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at kotlin.j.b.a.r.<clinit>(kClassCache.kt:27)
at kotlin.j.b.a.r.a(Unknown Source:0)
at kotlin.j.b.a._a.a(ReflectionFactoryImpl.java:45)
at kotlin.f.b.D.a(Reflection.java:50)
at com.example.Application.<clinit>(Unknown Source:7)
at java.lang.Class.newInstance(Native Method)
at android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:50)
at androidx.core.app.CoreComponentFactory.instantiateApplication(CoreComponentFactory.java:49)
at android.app.Instrumentation.newApplication(Instrumentation.java:1120)
at android.app.LoadedApk.makeApplication(LoadedApk.java:1061)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5891)
at android.app.ActivityThread.access$1100(ActivityThread.java:200)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6718)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
ap...@google.com <ap...@google.com> #6
Project: r8
Branch: master
commit 7e2e1235f3d029ebdd4c006bce0b3db38d66ffdb
Author: Jinseong Jeon <jsjeon@google.com>
Date: Tue Mar 12 13:02:35 2019
Disallow direct manipulation of field arrays.
Also, verify the absence of duplicate fields.
These are `field` version of the followings:
*https://r8-review.googlesource.com/c/r8/+/33929
*https://r8-review.googlesource.com/c/r8/+/33930
*https://r8-review.googlesource.com/c/r8/+/34123
plus a couple more clean up regarding array copy/manipulation.
Bug: 127932803
Change-Id: Id246f1a725a567a5b3d24f2bbfb6ef83cc4bf9ad
M src/main/java/com/android/tools/r8/ResourceShrinker.java
M src/main/java/com/android/tools/r8/dex/FileWriter.java
M src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java
M src/main/java/com/android/tools/r8/graph/DexClass.java
M src/main/java/com/android/tools/r8/graph/DexProgramClass.java
M src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
M src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/CaptureSignature.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaGroup.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/JStyleLambdaGroup.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaClassValidator.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupIdFactory.java
M src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
M src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
M src/main/java/com/android/tools/r8/naming/MinifiedNameMapPrinter.java
M src/main/java/com/android/tools/r8/shaking/StaticClassMerger.java
M src/main/java/com/android/tools/r8/shaking/TreePruner.java
M src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
M src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java
M src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java
M src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
M src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
https://r8-review.googlesource.com/35700
Branch: master
commit 7e2e1235f3d029ebdd4c006bce0b3db38d66ffdb
Author: Jinseong Jeon <jsjeon@google.com>
Date: Tue Mar 12 13:02:35 2019
Disallow direct manipulation of field arrays.
Also, verify the absence of duplicate fields.
These are `field` version of the followings:
*
*
*
plus a couple more clean up regarding array copy/manipulation.
Bug: 127932803
Change-Id: Id246f1a725a567a5b3d24f2bbfb6ef83cc4bf9ad
M src/main/java/com/android/tools/r8/ResourceShrinker.java
M src/main/java/com/android/tools/r8/dex/FileWriter.java
M src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java
M src/main/java/com/android/tools/r8/graph/DexClass.java
M src/main/java/com/android/tools/r8/graph/DexProgramClass.java
M src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
M src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/CaptureSignature.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaGroup.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/JStyleLambdaGroup.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaClassValidator.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupIdFactory.java
M src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
M src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
M src/main/java/com/android/tools/r8/naming/MinifiedNameMapPrinter.java
M src/main/java/com/android/tools/r8/shaking/StaticClassMerger.java
M src/main/java/com/android/tools/r8/shaking/TreePruner.java
M src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
M src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java
M src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java
M src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
M src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
js...@google.com <js...@google.com> #7
Thank you for trying the R8 version I mentioned. It seems to me that your initial issue ( comment #1 ) is fixed between 1.3 and 1.4, so I believe it *was* a dup of issue 123068484 .
Now, in 1.4, it seems there are two issues.
* Out-of-order field_ids
comment #6 is trying to nail down in which step we may introduce duplicate fields. I'm afraid if it's accidentally fixed in master (1.5), so, instead of using comment #6 , could you please find the attached r8.jar and run it with assertion enabled? You can use the pre-built r8.jar as follows:
buildscript {
repositories {
maven {
url 'https://kotlin.bintray.com/kotlinx/ '
}
}
dependencies {
classpath files($PATH_TO_R8_JAR) // Must be before the Gradle Plugin for Android.
classpath 'com.android.tools.build:gradle:3.0.1'
}
}
$ JAVA_OPTS="-ea" ./gradlew clean assembleRelease --no-daemon --stacktrace
Just to note, that one is built withhttps://r8-review.googlesource.com/c/r8/+/35800 (R8 version 1.4.73, cherry-picking comment #6 )
* NoClassDefFoundError
According to the stack trace, it looks like Kotlin reflection failed to find some of its own class, `kotlin.reflect.jvm.internal.pcollections.HashPMap`:
https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/jvm/runtime/kotlin/jvm/internal/Reflection.java#L46
-->https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/kClassCache.kt#L27
But I'm not sure how this is possible. According to the following lines, though, I suspect you have a static field that stores Kotlin class name or something?
at kotlin.f.b.D.a(Reflection.java:50)
at com.example.Application.<clinit>(Unknown Source:7)
If you don't mind, is it possible for you to share how the code around that place looks like? Again, you can send an email to me directly. Thanks!
Now, in 1.4, it seems there are two issues.
* Out-of-order field_ids
buildscript {
repositories {
maven {
url '
}
}
dependencies {
classpath files($PATH_TO_R8_JAR) // Must be before the Gradle Plugin for Android.
classpath 'com.android.tools.build:gradle:3.0.1'
}
}
$ JAVA_OPTS="-ea" ./gradlew clean assembleRelease --no-daemon --stacktrace
Just to note, that one is built with
* NoClassDefFoundError
According to the stack trace, it looks like Kotlin reflection failed to find some of its own class, `kotlin.reflect.jvm.internal.pcollections.HashPMap`:
-->
But I'm not sure how this is possible. According to the following lines, though, I suspect you have a static field that stores Kotlin class name or something?
at kotlin.f.b.D.a(Reflection.java:50)
at com.example.Application.<clinit>(Unknown Source:7)
If you don't mind, is it possible for you to share how the code around that place looks like? Again, you can send an email to me directly. Thanks!
js...@google.com <js...@google.com> #8
> classpath 'com.android.tools.build:gradle:3.0.1'
Oops, pointed too old version. As long as the path to r8.jar appears before AGP, you can use any versions you want.
Oops, pointed too old version. As long as the path to r8.jar appears before AGP, you can use any versions you want.
ni...@gmail.com <ni...@gmail.com> #9
I sent you an email with the result. Shortly, the crash still occurs with the r8.jar you attached.
ni...@gmail.com <ni...@gmail.com> #10
I haven't mentioned it, but the way I'm testing R8 is with debug build where I have the following Gradle setup:
app/build.gradle:
buildTypes {
debug {
minifyEnabled true
useProguard = false
proguardFiles = proguardFilenames()
proguardFile getDefaultProguardFile("proguard-android.txt")
My gradle.properties:
org.gradle.jvmargs=-Dfile.encoding=UTF-8 -Xmx9g -Xms512m -XX:MaxPermSize=1024m
org.gradle.parallel=true
org.gradle.daemon=true
org.gradle.caching=true
org.gradle.configureondemand=false
kapt.use.worker.api=true
android.useAndroidX=true
android.enableJetifier=true
android.enableUnitTestBinaryResources=true
android.enableSeparateAnnotationProcessing=true
android.enableSeparateRClassCompilation=true
android.enableR8 = true
app/build.gradle:
buildTypes {
debug {
minifyEnabled true
useProguard = false
proguardFiles = proguardFilenames()
proguardFile getDefaultProguardFile("proguard-android.txt")
My gradle.properties:
org.gradle.jvmargs=-Dfile.encoding=UTF-8 -Xmx9g -Xms512m -XX:MaxPermSize=1024m
org.gradle.parallel=true
org.gradle.daemon=true
org.gradle.caching=true
org.gradle.configureondemand=false
kapt.use.worker.api=true
android.useAndroidX=true
android.enableJetifier=true
android.enableUnitTestBinaryResources=true
android.enableSeparateAnnotationProcessing=true
android.enableSeparateRClassCompilation=true
android.enableR8 = true
ap...@google.com <ap...@google.com> #11
Project: r8
Branch: d8-1.4
commit fd9fcdf19cb6600145852215dd45f7ecbb949255
Author: Jinseong Jeon <jsjeon@google.com>
Date: Wed Mar 13 14:24:48 2019
Version 1.4.75
Cherry-pick:
Disallow direct manipulation of field arrays.
Also, verify the absence of duplicate fields.
CL:https://r8-review.googlesource.com/35700
Cherry-pick:
Remove a wrong logging.
CL:https://r8-review.googlesource.com/c/r8/+/35801
Bug: 127932803
Change-Id: I7ba45c73fe7b464ab271194acf737e6aa1da023e
M src/main/java/com/android/tools/r8/ResourceShrinker.java
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/dex/FileWriter.java
M src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java
M src/main/java/com/android/tools/r8/graph/DexClass.java
M src/main/java/com/android/tools/r8/graph/DexProgramClass.java
M src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
M src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/CaptureSignature.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaGroup.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/JStyleLambdaGroup.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaClassValidator.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupIdFactory.java
M src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
M src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
M src/main/java/com/android/tools/r8/naming/MinifiedNameMapPrinter.java
M src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java
M src/main/java/com/android/tools/r8/shaking/StaticClassMerger.java
M src/main/java/com/android/tools/r8/shaking/TreePruner.java
M src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
M src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java
M src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java
M src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
M src/test/java/com/android/tools/r8/shaking/PrintUsageTest.java
M src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
https://r8-review.googlesource.com/35800
Branch: d8-1.4
commit fd9fcdf19cb6600145852215dd45f7ecbb949255
Author: Jinseong Jeon <jsjeon@google.com>
Date: Wed Mar 13 14:24:48 2019
Version 1.4.75
Cherry-pick:
Disallow direct manipulation of field arrays.
Also, verify the absence of duplicate fields.
CL:
Cherry-pick:
Remove a wrong logging.
CL:
Bug: 127932803
Change-Id: I7ba45c73fe7b464ab271194acf737e6aa1da023e
M src/main/java/com/android/tools/r8/ResourceShrinker.java
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/dex/FileWriter.java
M src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java
M src/main/java/com/android/tools/r8/graph/DexClass.java
M src/main/java/com/android/tools/r8/graph/DexProgramClass.java
M src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
M src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/CaptureSignature.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaGroup.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/JStyleLambdaGroup.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaClassValidator.java
M src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupIdFactory.java
M src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
M src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
M src/main/java/com/android/tools/r8/naming/MinifiedNameMapPrinter.java
M src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java
M src/main/java/com/android/tools/r8/shaking/StaticClassMerger.java
M src/main/java/com/android/tools/r8/shaking/TreePruner.java
M src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
M src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java
M src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java
M src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
M src/test/java/com/android/tools/r8/shaking/PrintUsageTest.java
M src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
ap...@google.com <ap...@google.com> #12
Project: r8
Branch: master
commit 726699812df490fe2e907da17ec671632e22bc95
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Thu Mar 14 12:58:32 2019
Verify order of field ids
Bug: 127932803
Change-Id: If72fb5cf51cd6721d94498240fa1da9f6daa3aef
M src/main/java/com/android/tools/r8/dex/DexParser.java
https://r8-review.googlesource.com/35922
Branch: master
commit 726699812df490fe2e907da17ec671632e22bc95
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Thu Mar 14 12:58:32 2019
Verify order of field ids
Bug: 127932803
Change-Id: If72fb5cf51cd6721d94498240fa1da9f6daa3aef
M src/main/java/com/android/tools/r8/dex/DexParser.java
ap...@google.com <ap...@google.com> #13
Project: r8
Branch: master
commit a419118a876157efb9b02f74e42fc249f6d9d4d9
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Fri Mar 15 08:47:25 2019
Verify minifier traversal is consistent with the class hierarchy
Bug: 127932803
Change-Id: Ifb84c442f42abaeac8376e76bc692c062c648d50
M src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java
https://r8-review.googlesource.com/35943
Branch: master
commit a419118a876157efb9b02f74e42fc249f6d9d4d9
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Fri Mar 15 08:47:25 2019
Verify minifier traversal is consistent with the class hierarchy
Bug: 127932803
Change-Id: Ifb84c442f42abaeac8376e76bc692c062c648d50
M src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java
ap...@google.com <ap...@google.com> #14
Project: r8
Branch: master
commit 983508b3490eea7b8665f80e3f26871cae6b7ef2
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Fri Mar 15 13:06:05 2019
Enable logging of field minification states
Bug: 127932803
Change-Id: I784b8bd5414617976f4a07f737e59c6da574d46d
M src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java
M src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
M src/main/java/com/android/tools/r8/naming/Minifier.java
M src/main/java/com/android/tools/r8/naming/NamingState.java
M src/main/java/com/android/tools/r8/utils/InternalOptions.java
https://r8-review.googlesource.com/35980
Branch: master
commit 983508b3490eea7b8665f80e3f26871cae6b7ef2
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Fri Mar 15 13:06:05 2019
Enable logging of field minification states
Bug: 127932803
Change-Id: I784b8bd5414617976f4a07f737e59c6da574d46d
M src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java
M src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
M src/main/java/com/android/tools/r8/naming/Minifier.java
M src/main/java/com/android/tools/r8/naming/NamingState.java
M src/main/java/com/android/tools/r8/utils/InternalOptions.java
js...@google.com <js...@google.com> #15
Thank you Nimrod for running ToT R8 with extensive field minification logging. It seems to me that there are no more duplicate fields, and the apk built on ToT doesn't have duplicate fields anymore:
$ ~/projects/d8/tools/dex2oat.py based-on-983508b3490eea7b8665f80e3f26871cae6b7ef2.apk
Running: /usr/local/google/home/jsjeon/projects/d8/tools/linux/art/bin/dex2oat --android-root=/usr/local/google/home/jsjeon/projects/d8/tools/linux/art/product/angler/system --runtime-arg -Xnorelocate --dex-file=based-on-983508b3490eea7b8665f80e3f26871cae6b7ef2.apk --oat-file=/tmp/tmp9mrNpc/out.oat --instruction-set=arm64
dex2oat I 03-15 14:52:19 48660 48660 dex2oat.cc:3108] /usr/local/google/home/jsjeon/projects/d8/tools/linux/art/bin/dex2oat --android-root=/usr/local/google/home/jsjeon/projects/d8/tools/linux/art/product/angler/system --runtime-arg -Xnorelocate --dex-file=based-on-983508b3490eea7b8665f80e3f26871cae6b7ef2.apk --oat-file=/tmp/tmp9mrNpc/out.oat --instruction-set=arm64
dex2oat I 03-15 14:52:21 48660 48660 dex2oat.cc:2808] dex2oat took 2.137s (52.051s cpu) (threads: 72) arena alloc=40MB (42973392B) java alloc=22MB (23607088B) native alloc=97MB (102247648B) free=67MB (70779680B)
To make sure comment #13 fixed the issue, could you try running the attached r8.jar one more time? It's simply manual cherry-picking of comment #14 to add logging messages regarding field minification. Just in case, I attached the diff as well. Please refer to comment #7 about how to use local r8.jar. Also, refer to Christoffer's email about running r8 while leaving specific logging message for field minification.
Thanks!
$ ~/projects/d8/tools/dex2oat.py based-on-983508b3490eea7b8665f80e3f26871cae6b7ef2.apk
Running: /usr/local/google/home/jsjeon/projects/d8/tools/linux/art/bin/dex2oat --android-root=/usr/local/google/home/jsjeon/projects/d8/tools/linux/art/product/angler/system --runtime-arg -Xnorelocate --dex-file=based-on-983508b3490eea7b8665f80e3f26871cae6b7ef2.apk --oat-file=/tmp/tmp9mrNpc/out.oat --instruction-set=arm64
dex2oat I 03-15 14:52:19 48660 48660 dex2oat.cc:3108] /usr/local/google/home/jsjeon/projects/d8/tools/linux/art/bin/dex2oat --android-root=/usr/local/google/home/jsjeon/projects/d8/tools/linux/art/product/angler/system --runtime-arg -Xnorelocate --dex-file=based-on-983508b3490eea7b8665f80e3f26871cae6b7ef2.apk --oat-file=/tmp/tmp9mrNpc/out.oat --instruction-set=arm64
dex2oat I 03-15 14:52:21 48660 48660 dex2oat.cc:2808] dex2oat took 2.137s (52.051s cpu) (threads: 72) arena alloc=40MB (42973392B) java alloc=22MB (23607088B) native alloc=97MB (102247648B) free=67MB (70779680B)
To make sure
Thanks!
js...@google.com <js...@google.com>
ap...@google.com <ap...@google.com> #16
Project: r8
Branch: master
commit a6631581394f6851eb8f09ffed688a11bd15c16b
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Mon Mar 18 14:54:00 2019
Reproduce collision bug in field name minifier
Bug: 127932803
Change-Id: Ic54e42d7290ada97ea6ed974deddd28f88df7393
A src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java
https://r8-review.googlesource.com/36012
Branch: master
commit a6631581394f6851eb8f09ffed688a11bd15c16b
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Mon Mar 18 14:54:00 2019
Reproduce collision bug in field name minifier
Bug: 127932803
Change-Id: Ic54e42d7290ada97ea6ed974deddd28f88df7393
A src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java
ap...@google.com <ap...@google.com> #17
Project: r8
Branch: master
commit 10c83b9dbd149cb7839a95fb255a7c54a006ce13
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Thu Mar 21 08:59:20 2019
Tests for field minification in presence of reserved names
The tests verify that names that are explicitly reserved via keep rules are taken into account by the field name minifier, and that field names in the library are also treated as being implicitly reserved.
Bug: 128973195, 127932803, 128656974, 128600647
Change-Id: Ic7560780cafadbbc8543d86dd8628e2866fc508a
A src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubClassTest.java
A src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubInterfaceTest.java
A src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperClassTest.java
A src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperInterfaceTest.java
https://r8-review.googlesource.com/36106
Branch: master
commit 10c83b9dbd149cb7839a95fb255a7c54a006ce13
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Thu Mar 21 08:59:20 2019
Tests for field minification in presence of reserved names
The tests verify that names that are explicitly reserved via keep rules are taken into account by the field name minifier, and that field names in the library are also treated as being implicitly reserved.
Bug: 128973195, 127932803, 128656974, 128600647
Change-Id: Ic7560780cafadbbc8543d86dd8628e2866fc508a
A src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubClassTest.java
A src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubInterfaceTest.java
A src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperClassTest.java
A src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperInterfaceTest.java
ap...@google.com <ap...@google.com> #18
Project: r8
Branch: master
commit 86d6e8b1a1df654f2a50bb48a24f1a0d0be3eb61
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Thu Apr 11 13:28:33 2019
Compute max nameCount in NamingState#incrementAndGet()
This is a workaround for a bug that causes the nameCount of a naming state to be less than the nameCount of the corresponding parent naming state.
Bug: 127932803
Change-Id: I93d3ced4962861fdcf9ef9168e61341a173d62ec
M src/main/java/com/android/tools/r8/naming/NamingState.java
M src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java
https://r8-review.googlesource.com/36942
Branch: master
commit 86d6e8b1a1df654f2a50bb48a24f1a0d0be3eb61
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Thu Apr 11 13:28:33 2019
Compute max nameCount in NamingState#incrementAndGet()
This is a workaround for a bug that causes the nameCount of a naming state to be less than the nameCount of the corresponding parent naming state.
Bug: 127932803
Change-Id: I93d3ced4962861fdcf9ef9168e61341a173d62ec
M src/main/java/com/android/tools/r8/naming/NamingState.java
M src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java
ap...@google.com <ap...@google.com> #19
Project: r8
Branch: d8-1.4
commit d33415efca832aa9ad92998f3edfc1b4466dccd5
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Fri Apr 12 09:15:29 2019
Version 1.4.85
Cherry pick: Compute max nameCount in NamingState#incrementAndGet()
CL:https://r8-review.googlesource.com/c/r8/+/36942/
Cherry pick: Reproduce collision bug in field name minifier
CL:https://r8-review.googlesource.com/c/r8/+/36012/
Bug: 127932803
Change-Id: I2592c9adb3154643900951964f83ede531a42c1c
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/naming/NamingState.java
A src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java
https://r8-review.googlesource.com/36953
Branch: d8-1.4
commit d33415efca832aa9ad92998f3edfc1b4466dccd5
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Fri Apr 12 09:15:29 2019
Version 1.4.85
Cherry pick: Compute max nameCount in NamingState#incrementAndGet()
CL:
Cherry pick: Reproduce collision bug in field name minifier
CL:
Bug: 127932803
Change-Id: I2592c9adb3154643900951964f83ede531a42c1c
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/naming/NamingState.java
A src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java
ap...@google.com <ap...@google.com> #20
Project: r8
Branch: master
commit 6358b07f8b2e966489c1bb3ba727ff074b1e8339
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Fri Apr 12 11:39:03 2019
Introduce new field name minifier
Bug: 128973195, 127932803, 128656974, 128600647
Change-Id: I0f64019de1fe02e3b87ed94bc86b03a2478e3946
M src/main/java/com/android/tools/r8/graph/BottomUpClassHierarchyTraversal.java
M src/main/java/com/android/tools/r8/graph/ClassHierarchyTraversal.java
M src/main/java/com/android/tools/r8/graph/DexClass.java
M src/main/java/com/android/tools/r8/graph/DexType.java
M src/main/java/com/android/tools/r8/graph/TopDownClassHierarchyTraversal.java
M src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java
A src/main/java/com/android/tools/r8/naming/FieldNamingState.java
A src/main/java/com/android/tools/r8/naming/FieldNamingStateBase.java
M src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java
D src/main/java/com/android/tools/r8/naming/MemberNameMinifier.java
A src/main/java/com/android/tools/r8/naming/MemberNamingStrategy.java
M src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
M src/main/java/com/android/tools/r8/naming/MethodNamingState.java
M src/main/java/com/android/tools/r8/naming/Minifier.java
M src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
A src/main/java/com/android/tools/r8/naming/ReservedFieldNamingState.java
M src/test/java/com/android/tools/r8/naming/InterfaceFieldMinificationTest.java
A src/test/java/com/android/tools/r8/naming/OverloadedReservedFieldNamingTest.java
M src/test/java/com/android/tools/r8/naming/ReservedFieldNameInInterfacesWithCommonSubClassTest.java
M src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubClassTest.java
M src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubInterfaceTest.java
M src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperInterfaceTest.java
M src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionTest.java
M src/test/java/com/android/tools/r8/naming/b128656974/B128656974.java
M src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
https://r8-review.googlesource.com/36013
Branch: master
commit 6358b07f8b2e966489c1bb3ba727ff074b1e8339
Author: Christoffer Quist Adamsen <christofferqa@google.com>
Date: Fri Apr 12 11:39:03 2019
Introduce new field name minifier
Bug: 128973195, 127932803, 128656974, 128600647
Change-Id: I0f64019de1fe02e3b87ed94bc86b03a2478e3946
M src/main/java/com/android/tools/r8/graph/BottomUpClassHierarchyTraversal.java
M src/main/java/com/android/tools/r8/graph/ClassHierarchyTraversal.java
M src/main/java/com/android/tools/r8/graph/DexClass.java
M src/main/java/com/android/tools/r8/graph/DexType.java
M src/main/java/com/android/tools/r8/graph/TopDownClassHierarchyTraversal.java
M src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java
A src/main/java/com/android/tools/r8/naming/FieldNamingState.java
A src/main/java/com/android/tools/r8/naming/FieldNamingStateBase.java
M src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java
D src/main/java/com/android/tools/r8/naming/MemberNameMinifier.java
A src/main/java/com/android/tools/r8/naming/MemberNamingStrategy.java
M src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
M src/main/java/com/android/tools/r8/naming/MethodNamingState.java
M src/main/java/com/android/tools/r8/naming/Minifier.java
M src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
A src/main/java/com/android/tools/r8/naming/ReservedFieldNamingState.java
M src/test/java/com/android/tools/r8/naming/InterfaceFieldMinificationTest.java
A src/test/java/com/android/tools/r8/naming/OverloadedReservedFieldNamingTest.java
M src/test/java/com/android/tools/r8/naming/ReservedFieldNameInInterfacesWithCommonSubClassTest.java
M src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubClassTest.java
M src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubInterfaceTest.java
M src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperInterfaceTest.java
M src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionTest.java
M src/test/java/com/android/tools/r8/naming/b128656974/B128656974.java
M src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
ch...@google.com <ch...@google.com> #21
This was fixed in R8 version 1.4.85. It is possible to build with this version of R8 by making the following changes to build.gradle:
buildscript {
repositories {
maven {
url 'http://storage.googleapis.com/r8-releases/raw '
}
}
dependencies {
classpath 'com.android.tools:r8:1.4.85' // Must be before the Gradle Plugin for Android.
classpath 'com.android.tools.build:gradle:...'
}
}
buildscript {
repositories {
maven {
url '
}
}
dependencies {
classpath 'com.android.tools:r8:1.4.85' // Must be before the Gradle Plugin for Android.
classpath 'com.android.tools.build:gradle:...'
}
}
ni...@gmail.com <ni...@gmail.com> #22
thanks for the update. will it be part of AGP 3.4.0 release?
ch...@google.com <ch...@google.com> #23
Unfortunately this fix didn't make the cut for AGP 3.4.0 -- I believe AGP 3.4.0 will be using R8 version 1.4.77.
ni...@gmail.com <ni...@gmail.com> #24
Thanks! I'll try it out with the specific R8 version you mentioned in comment #21 . Would that version also include the fix for https://issuetracker.google.com/issues/129730297#comment8 ?
ch...@google.com <ch...@google.com> #25
To also get that fix you will need to use `classpath 'com.android.tools:r8:1.4.88'`. Both fixes should become available in AGP 3.4.1.
ri...@google.com <ri...@google.com> #26
re #24: no that is not included, if you also want that, you need to do
classpath 'com.android.tools:r8:1.4.88'
classpath 'com.android.tools:r8:1.4.88'
Description
When I enable R8, I get a runtime crash of missing field in one of slf4j classes.
The issue is not reproducible with Proguard enabled and R8 disabled.
java.lang.NoSuchFieldError: No instance field name of type Ljava/lang/String; in class Ln/d/c/a; or its superclasses (declaration of ‘n.d.c.a’ appears in /data/app/app.debug-fWoqZPIUIUjzRSNCItzISA==/base.apk!classes3.dex)
at n.d.c.a.<init>(JDK14LoggerAdapter.java:57)
at n.d.c.b.a(JDK14LoggerFactory.java:65)
at n.d.c.a(LoggerFactory.java:358)
at n.d.c.a(LoggerFactory.java:383)
at d.d.a.a.i.<init>(StateMachine.java:25)
at com.example.stateMachines.base.StateMachineImplementation.<init>(StateMachineImplementation.java:37)
at com.example.stateMachines.connectionStateMachine.ConnectionStateMachine.<init>(ConnectionStateMachine.java:79)
at com.example.ActiveDevices$DeviceHolder.<init>(ActiveDevices.java:48)
at com.example.ActiveDevices$DeviceHolder.<init>(ActiveDevices.java:40)
at com.example.ActiveDevices.putDevice(ActiveDevices.java:119)
at com.example.ActiveDevices.connectAndActivate(ActiveDevices.java:197)
at com.example.AppRepositoryService.handlePairMessage(AppRepositoryService.java:669)
at com.example.AppRepositoryService$IncomingHandler.handleMessage(AppRepositoryService.java:1403)
at com.example.AppRepositoryService$IncomingHandler.handleMessage(AppRepositoryService.java:1376)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6718)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
When I add extra rules to keep slf4j, the issue is no longer reproducible:
-keepnames class org.slf4j.** { *; }
With Proguard, I don't need the above rule.