Status Update
Comments
go...@jakewharton.com <go...@jakewharton.com> #2
Yeah notably Retrofit uses Method.getGenericParameterTypes
which is framework code which then parses the signature and invokes Class.forName
.
Caused by: java.lang.ClassNotFoundException: Didn't find class "java.time.LocalDate" on path: DexPathList[[zip file "/data/app/com.paulwoitaschek.agptest-1/base.apk"],nativeLibraryDirectories=[/data/app/com.paulwoitaschek.agptest-1/lib/x86_64, /vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:324)
at libcore.reflect.ParameterizedTypeImpl.getRawType(ParameterizedTypeImpl.java:65)
at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:76)
at libcore.reflect.ListOfTypes.resolveTypes(ListOfTypes.java:70)
at libcore.reflect.ListOfTypes.getResolvedTypes(ListOfTypes.java:55)
at libcore.reflect.Types.getTypeArray(Types.java:50)
at java.lang.reflect.Method.getGenericParameterTypes(Method.java:246)
at retrofit2.RequestFactory$Builder.<init>(RequestFactory.java:175)
at retrofit2.RequestFactory.parseAnnotations(RequestFactory.java:67)
at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:26)
at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:202)
at retrofit2.Retrofit.validateServiceInterface(Retrofit.java:189)
at retrofit2.Retrofit.create(Retrofit.java:141)
at com.paulwoitaschek.agptest.MainActivity.onCreate(MainActivity.kt:18)
ch...@google.com <ch...@google.com>
mk...@google.com <mk...@google.com> #3
L8 is currently not rewriting generic signatures. Will update this when it does.
ap...@google.com <ap...@google.com> #4
Branch: master
commit 5fd84f7950df411df1cad25f654b3ff016ea4d7c
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Wed Jun 10 13:56:38 2020
Add test reproducing lack of signature rewriting when desugaring
Bug: 158124557
Change-Id: Iecfae87c7b7783832999752be5166d057a91235e
A src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java
ap...@google.com <ap...@google.com> #5
Branch: master
commit 0c54dd2edb4fd81073cdac5ff487dd1a37330fba
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Thu Jun 11 12:41:11 2020
Change GenericSignatureRewriter to use a naming lens
Bug: 158124557
Change-Id: Ic52380ad05a952188fd2618e6a8dae93c92ce53c
M src/main/java/com/android/tools/r8/D8.java
M src/main/java/com/android/tools/r8/L8.java
M src/main/java/com/android/tools/r8/R8.java
M src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
M src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
M src/main/java/com/android/tools/r8/relocator/Relocator.java
M src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java
wo...@gmail.com <wo...@gmail.com> #6
Nice! Is it possible to cherry pic this into a 4.0.x release?
mk...@google.com <mk...@google.com> #7
I hope that it is - it will be updated here when cherry-picked.
mk...@google.com <mk...@google.com> #8
woitaschek@, could I ask you to verify that the fix works on your project by adding the following to your top-level build.gradle file:
buildscript {
repositories {
maven {
url "https://storage.googleapis.com/r8-releases/raw/master"
}
}
dependencies {
classpath 'com.android.tools:r8:0c54dd2edb4fd81073cdac5ff487dd1a37330fba' // Must be before the Gradle Plugin for Android.
classpath 'com.android.tools.build:gradle:X.Y.Z' // Your current AGP version.
}
}
wo...@gmail.com <wo...@gmail.com> #9
Nice, it works!
.method public abstract test(Lj$/time/LocalDate;)Lretrofit2/Call;
.param p1 # Lj$/time/LocalDate;
.annotation runtime Lretrofit2/http/Query;
value = "meop"
.end annotation
.end param
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Lj$/time/LocalDate;",
")",
"Lretrofit2/Call<",
"Ljava/lang/Void;",
">;"
}
.end annotation
.annotation runtime Lretrofit2/http/GET;
value = "meop"
.end annotation
.end method
ap...@google.com <ap...@google.com> #10
Branch: master
commit 83a57cd2d05c53d9e9c3b8a55bff7a6de20bd6f3
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Thu Jun 11 13:24:23 2020
Model kotlin annotation arguments
Bug: 158124557
Bug: 155053894
Change-Id: I7d57209f149e891c0f2c68494c44b6381ab2798f
M src/main/java/com/android/tools/r8/kotlin/Kotlin.java
A src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationArgumentInfo.java
M src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationInfo.java
M src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAnnotationTest.java
M src/test/java/com/android/tools/r8/kotlin/metadata/annotation_app/main.kt
M src/test/java/com/android/tools/r8/kotlin/metadata/annotation_lib/lib.kt
ap...@google.com <ap...@google.com> #11
Branch: master
commit 5bf93ee76297281f54e38f1abd3d469dfca8933d
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Thu Jun 11 10:02:32 2020
Add test for modeling kotlin metadata annotations and arguments
Bug: 158124557
Change-Id: Id98e33df1171eedcfbd12c31bc4236bde6926189
M src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
A src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAnnotationTest.java
M src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteCrossinlineAnonFunctionTest.java
A src/test/java/com/android/tools/r8/kotlin/metadata/annotation_app/main.kt
A src/test/java/com/android/tools/r8/kotlin/metadata/annotation_lib/lib.kt
M src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
M src/test/java/com/android/tools/r8/utils/codeinspector/AbsentKmTypeAliasSubject.java
M src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
M src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
M src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmTypeAliasSubject.java
M src/test/java/com/android/tools/r8/utils/codeinspector/KmTypeAliasSubject.java
ap...@google.com <ap...@google.com> #12
Branch: master
commit 9b1e91926ef7e02a27ef11a28955d22e0432be77
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Fri Jun 12 13:38:57 2020
Should not use withLiveness as input to GenericSignatureRewriter
In particular not D8.
Bug: 158124557
Change-Id: Id8e8e3dfc922639ae4f4a42be4bf0c7a7a9b24c6
M src/main/java/com/android/tools/r8/D8.java
M src/main/java/com/android/tools/r8/R8.java
ap...@google.com <ap...@google.com> #13
Branch: 2.0
commit fee959778e107ec9d2a90df9af3759f5b825c98e
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Fri Jun 12 14:26:21 2020
Version 2.0.85
Cherry pick: Add test reproducing lack of signature rewriting when
desugaring
CL:
Cherry pick: Change GenericSignatureRewriter to use a naming lens
CL:
Cherry pick: Should not use withLiveness as input to GenericSignatureRewriter
CL:
Bug: 158124557
Change-Id: Ib475c534bc3e5f5bd7aba54d50ea33dbe2a72c3f
M src/main/java/com/android/tools/r8/D8.java
M src/main/java/com/android/tools/r8/L8.java
M src/main/java/com/android/tools/r8/R8.java
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
M src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
A src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java
ap...@google.com <ap...@google.com> #14
Branch: 2.1
commit e1b70d664133e1a5d3bb5a48cd4d4c583ce43931
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Fri Jun 12 13:46:22 2020
Version 2.1.40
Cherry pick: Add test reproducing lack of signature rewriting when
desugaring
CL:
Cherry pick: Change GenericSignatureRewriter to use a naming lens
CL:
Cherry pick: Should not use withLiveness as input to GenericSignatureRewriter
CL:
Bug: 158124557
Change-Id: I3300ba93b09b514cd2ab19d21d1ddf3c4c6ae9fc
M src/main/java/com/android/tools/r8/D8.java
M src/main/java/com/android/tools/r8/L8.java
M src/main/java/com/android/tools/r8/R8.java
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
M src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
M src/main/java/com/android/tools/r8/relocator/Relocator.java
A src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java
mk...@google.com <mk...@google.com> #15
This will hopefully make the next point release for AGP 4.0, but you can try it out by adding the following to your top-level build.gradle:
buildscript {
repositories {
maven {
url 'https://storage.googleapis.com/r8-releases/raw'
}
}
dependencies {
classpath 'com.android.tools:r8:2.0.85' // Must be before the Gradle Plugin for Android.
classpath 'com.android.tools.build:gradle:X.Y.Z' // Your current AGP version.
}
}
wo...@gmail.com <wo...@gmail.com> #16
Is this identially to the r8 version bundled in 4.0.0 besides the generic signature rewrite? Do you think this is safe to be used in production?
mk...@google.com <mk...@google.com> #17
The version in AGP is 2.0.74. 2.0.85 is build on top of 2.0.74 by cherry-picking various bug-fixes. Version 2.0.85 (or perhaps a later version) will probably be in the next point release. So I regard all 2.0.X versions for X > 74 to be stable.
And if you have problems with that version, please let us know.
Description
The generic signature is not rewritten correctly when desugaring
I'm using agp 4.0.0 and the interface here:
Produces the following bytecode:
This crashes immediately on api 23 because the retrofit proxy uses Class.forName on java.time.LocalDate.