WAI
Status Update
Comments
vi...@google.com <vi...@google.com> #2
I'm sorry! More info:
Kotlin 1.3.5.0
lifecyle = 2.2.0-rc02
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:${versions.lifecycle}"
implementation "androidx.lifecycle:lifecycle-extensions:${versions.lifecycle}"
implementation "androidx.lifecycle:lifecycle-common-java8:${versions.lifecycle}"
class VideoModel(val app: Application) : AndroidViewModel(app) {
// do something
}
Kotlin 1.3.5.0
lifecyle = 2.2.0-rc02
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:${versions.lifecycle}"
implementation "androidx.lifecycle:lifecycle-extensions:${versions.lifecycle}"
implementation "androidx.lifecycle:lifecycle-common-java8:${versions.lifecycle}"
class VideoModel(val app: Application) : AndroidViewModel(app) {
// do something
}
na...@gmail.com <na...@gmail.com> #3
This is lifecyle-viewmodel-kts build dependency, where lifecycle-viewmodel is added (as API).
This is lifecycle-viewmodel build, and there proguard rule is applied to all build types.
and finally, this is the configuration:
```
-keepclassmembers,allowobfuscation class * extends androidx.lifecycle.AndroidViewModel {
<init>(android.app.Application);
}
```
Because of that rule, at least instance initializer of your class that extends AndroidViewModel would be kept as long as that class itself is used/kept somehow. That's one notable difference between `-keepclassmemebers` v.s. other keep directives such as `-keep` or `-keepclasseswithmembers`.
But those rules are coming from the library, so I assume it's been there for a while (though you're using lifecycle 2.2.0-rc02, is it something you recently upgraded?) Then, the difference we should track is why `VideoModel` was kept at AGP 3.5.2 and is not now at AGP 3.6.0-beta04.
Could you add the following rule to your `proguard-rules.pro` and build your app again with AGP 3.5.2?
```
-whyareyoukeeping class **.VideoModel
```
To make sure rules from lifecycle-viewmodel is included as well, could you also add the following to literally print all configurations?
```
-printconfiguration all-configurations.txt
```
If you think it reveals too much details of your apps, you can send it to jsjeon@google.com privately, instead of posting it here. Thanks.
vi...@google.com <vi...@google.com> #4
Thank you!
I added printconfiguration all-configurations.txt then compare on AS all-configurations-3.5.2.txt vs all-configurations-3.6.0-beta04.txt. Proguard config of ViewModel was consumed.
The different:
all-configurations-3.6.0-beta04.txt
# When editing this file, update the following files as well:
# - META-INF/com.android.tools/proguard/coroutines.pro
# - META-INF/proguard/coroutines.pro
all-configurations-3.5.2.txt
# Files in this directory will be ignored starting with Android Gradle Plugin 3.6.0+
# When editing this file, update the following files as well for AGP 3.6.0+:
# - META-INF/com.android.tools/proguard/coroutines.pro
# - META-INF/com.android.tools/r8-upto-1.6.0/coroutines.pro
and all-configurations-3.6.0-beta04.txt missed that was added in all-configurations-3.5.2.txt.
This the part missing:
# This is a configuration file for ProGuard.
#http://proguard.sourceforge.net/index.html#manual/usage.html
#
# Starting with version 2.2 of the Android plugin for Gradle, this file is distributed together with
# the plugin and unpacked at build-time. The files in $ANDROID_HOME are no longer maintained and
# will be ignored by new version of the Android plugin for Gradle.
# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize steps (and performs some
# of these optimizations on its own).
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.
-dontoptimize
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
# Preserve some attributes that may be required for reflection.
-keepattributes *Annotation*,Signature,InnerClasses,EnclosingMethod
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keep public class com.google.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService
-dontnote com.google.vending.licensing.ILicensingService
-dontnote com.google.android.vending.licensing.ILicensingService
# For native methods, seehttp://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
native <methods>;
}
# Keep setters in Views so that animations can still work.
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick.
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, seehttp://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final ** CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
# Preserve annotated Javascript interface methods.
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
# The support libraries contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontnote android.support.**
-dontnote androidx.**
-dontwarn android.support.**
-dontwarn androidx.**
# This class is deprecated, but remains for backward compatibility.
-dontwarn android.util.FloatMath
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep class androidx.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keep @androidx.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@androidx.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@androidx.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
-keepclasseswithmembers class * {
@androidx.annotation.Keep <init>(...);
}
# These classes are duplicated between android.jar and org.apache.http.legacy.jar.
-dontnote org.apache.http.**
-dontnote android.net.http.**
# These classes are duplicated between android.jar and core-lambda-stubs.jar.
-dontnote java.lang.invoke.**
I have another project that has the same config but it hadn't the problem with AGP 3.6.0-beta04. I will try to investigate more.
I think it can the same this problem before:https://issuetracker.google.com/issues/112324130
Below is the full log
E/TAG: java.lang.RuntimeException: Cannot create an instance of class com.myapp.screenrecorder.taskmedia.video.s
at androidx.lifecycle.M.a(ViewModelProvider.java:9)
at androidx.lifecycle.I.a(SavedStateViewModelFactory.java:4)
at androidx.lifecycle.Q.a(ViewModelProvider.java:8)
at com.myapp.screenrecorder.taskmedia.video.b.invoke(com.android.tools.r8.jetbrains.kotlin-style lambda group:1)
at kotlin.l.getValue(Lazy.kt:2)
at com.myapp.screenrecorder.taskmedia.video.VideoFragment.e(VideoFragment.kt:1)
at com.myapp.screenrecorder.taskmedia.video.g.c(VideoFragment.kt:11)
at kotlin.coroutines.jvm.internal.a.a(ContinuationImpl.kt:3)
at kotlinx.coroutines.K.a(Dispatched.kt:18)
at com.myapp.simplefilechooser.g.a(Unknown Source:20)
at kotlinx.coroutines.a.a(AbstractCoroutine.kt:21)
at kotlinx.coroutines.d.a(Unknown Source:16)
at com.myapp.screenrecorder.taskmedia.video.VideoFragment.d0(VideoFragment.kt:1)
at com.myapp.screenrecorder.taskmedia.video.VideoFragment.a(VideoFragment.kt:18)
at androidx.fragment.app.T.a(FragmentStateManager.java:51)
at androidx.fragment.app.K.a(FragmentManager.java:176)
at androidx.fragment.app.K.a(FragmentManager.java:426)
at androidx.fragment.app.K.a(FragmentManager.java:373)
at androidx.fragment.app.K.c(FragmentManager.java:38)
at androidx.fragment.app.K.c(FragmentManager.java:22)
at androidx.fragment.app.K.b(FragmentManager.java:49)
at androidx.fragment.app.K.c(FragmentManager.java:42)
at androidx.fragment.app.k.e(Fragment.java:6)
at androidx.fragment.app.T.a(FragmentStateManager.java:56)
at androidx.fragment.app.K.a(FragmentManager.java:177)
at androidx.fragment.app.K.h(FragmentManager.java:4)
at androidx.fragment.app.K.a(FragmentManager.java:257)
at androidx.fragment.app.K.b(FragmentManager.java:47)
at androidx.fragment.app.K.c(FragmentManager.java:42)
at androidx.fragment.app.w.a(FragmentController.java:9)
at androidx.fragment.app.m.onStart(FragmentActivity.java:5)
at androidx.appcompat.app.v.onStart(AppCompatActivity.java:1)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1392)
at android.app.Activity.performStart(Activity.java:7157)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2952)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1823)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:198)
at android.app.ActivityThread.main(ActivityThread.java:6729)
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.NoSuchMethodException: <init> [class android.app.Application]
at java.lang.Class.getConstructor0(Class.java:2327)
at java.lang.Class.getConstructor(Class.java:1725)
at androidx.lifecycle.M.a(ViewModelProvider.java:5)
at androidx.lifecycle.I.a(SavedStateViewModelFactory.java:4)
at androidx.lifecycle.Q.a(ViewModelProvider.java:8)
at com.myapp.screenrecorder.taskmedia.video.b.invoke(com.android.tools.r8.jetbrains.kotlin-style lambda group:1)
at kotlin.l.getValue(Lazy.kt:2)
at com.myapp.screenrecorder.taskmedia.video.VideoFragment.e(VideoFragment.kt:1)
at com.myapp.screenrecorder.taskmedia.video.g.c(VideoFragment.kt:11)
at kotlin.coroutines.jvm.internal.a.a(ContinuationImpl.kt:3)
at kotlinx.coroutines.K.a(Dispatched.kt:18)
at com.myapp.simplefilechooser.g.a(Unknown Source:20)
at kotlinx.coroutines.a.a(AbstractCoroutine.kt:21)
at kotlinx.coroutines.d.a(Unknown Source:16)
at com.myapp.screenrecorder.taskmedia.video.VideoFragment.d0(VideoFragment.kt:1)
at com.myapp.screenrecorder.taskmedia.video.VideoFragment.a(VideoFragment.kt:18)
at androidx.fragment.app.T.a(FragmentStateManager.java:51)
at androidx.fragment.app.K.a(FragmentManager.java:176)
at androidx.fragment.app.K.a(FragmentManager.java:426)
at androidx.fragment.app.K.a(FragmentManager.java:373)
at androidx.fragment.app.K.c(FragmentManager.java:38)
at androidx.fragment.app.K.c(FragmentManager.java:22)
at androidx.fragment.app.K.b(FragmentManager.java:49)
at androidx.fragment.app.K.c(FragmentManager.java:42)
at androidx.fragment.app.k.e(Fragment.java:6)
at androidx.fragment.app.T.a(FragmentStateManager.java:56)
at androidx.fragment.app.K.a(FragmentManager.java:177)
at androidx.fragment.app.K.h(FragmentManager.java:4)
at androidx.fragment.app.K.a(FragmentManager.java:257)
at androidx.fragment.app.K.b(FragmentManager.java:47)
at androidx.fragment.app.K.c(FragmentManager.java:42)
at androidx.fragment.app.w.a(FragmentController.java:9)
at androidx.fragment.app.m.onStart(FragmentActivity.java:5)
at androidx.appcompat.app.v.onStart(AppCompatActivity.java:1)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1392)
at android.app.Activity.performStart(Activity.java:7157)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2952)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1823)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:198)
at android.app.ActivityThread.main(ActivityThread.java:6729)
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 added printconfiguration all-configurations.txt then compare on AS all-configurations-3.5.2.txt vs all-configurations-3.6.0-beta04.txt. Proguard config of ViewModel was consumed.
The different:
all-configurations-3.6.0-beta04.txt
# When editing this file, update the following files as well:
# - META-INF/com.android.tools/proguard/
# - META-INF/proguard/
all-configurations-3.5.2.txt
# Files in this directory will be ignored starting with Android Gradle Plugin 3.6.0+
# When editing this file, update the following files as well for AGP 3.6.0+:
# - META-INF/com.android.tools/proguard/
# - META-INF/com.android.tools/r8-upto-1.6.0/
and all-configurations-3.6.0-beta04.txt missed that was added in all-configurations-3.5.2.txt.
This the part missing:
# This is a configuration file for ProGuard.
#
#
# Starting with version 2.2 of the Android plugin for Gradle, this file is distributed together with
# the plugin and unpacked at build-time. The files in $ANDROID_HOME are no longer maintained and
# will be ignored by new version of the Android plugin for Gradle.
# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize steps (and performs some
# of these optimizations on its own).
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.
-dontoptimize
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
# Preserve some attributes that may be required for reflection.
-keepattributes *Annotation*,Signature,InnerClasses,EnclosingMethod
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keep public class com.google.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService
-dontnote com.google.vending.licensing.ILicensingService
-dontnote com.google.android.vending.licensing.ILicensingService
# For native methods, see
-keepclasseswithmembernames class * {
native <methods>;
}
# Keep setters in Views so that animations can still work.
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick.
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final ** CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
# Preserve annotated Javascript interface methods.
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
# The support libraries contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontnote android.support.**
-dontnote androidx.**
-dontwarn android.support.**
-dontwarn androidx.**
# This class is deprecated, but remains for backward compatibility.
-dontwarn android.util.FloatMath
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep class androidx.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keep @androidx.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@androidx.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@androidx.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
-keepclasseswithmembers class * {
@androidx.annotation.Keep <init>(...);
}
# These classes are duplicated between android.jar and org.apache.http.legacy.jar.
-dontnote org.apache.http.**
-dontnote android.net.http.**
# These classes are duplicated between android.jar and core-lambda-stubs.jar.
-dontnote java.lang.invoke.**
I have another project that has the same config but it hadn't the problem with AGP 3.6.0-beta04. I will try to investigate more.
I think it can the same this problem before:
Below is the full log
E/TAG: java.lang.RuntimeException: Cannot create an instance of class com.myapp.screenrecorder.taskmedia.video.s
at androidx.lifecycle.M.a(ViewModelProvider.java:9)
at androidx.lifecycle.I.a(SavedStateViewModelFactory.java:4)
at androidx.lifecycle.Q.a(ViewModelProvider.java:8)
at com.myapp.screenrecorder.taskmedia.video.b.invoke(com.android.tools.r8.jetbrains.kotlin-style lambda group:1)
at kotlin.l.getValue(Lazy.kt:2)
at com.myapp.screenrecorder.taskmedia.video.VideoFragment.e(VideoFragment.kt:1)
at com.myapp.screenrecorder.taskmedia.video.g.c(VideoFragment.kt:11)
at kotlin.coroutines.jvm.internal.a.a(ContinuationImpl.kt:3)
at kotlinx.coroutines.K.a(Dispatched.kt:18)
at com.myapp.simplefilechooser.g.a(Unknown Source:20)
at kotlinx.coroutines.a.a(AbstractCoroutine.kt:21)
at kotlinx.coroutines.d.a(Unknown Source:16)
at com.myapp.screenrecorder.taskmedia.video.VideoFragment.d0(VideoFragment.kt:1)
at com.myapp.screenrecorder.taskmedia.video.VideoFragment.a(VideoFragment.kt:18)
at androidx.fragment.app.T.a(FragmentStateManager.java:51)
at androidx.fragment.app.K.a(FragmentManager.java:176)
at androidx.fragment.app.K.a(FragmentManager.java:426)
at androidx.fragment.app.K.a(FragmentManager.java:373)
at androidx.fragment.app.K.c(FragmentManager.java:38)
at androidx.fragment.app.K.c(FragmentManager.java:22)
at androidx.fragment.app.K.b(FragmentManager.java:49)
at androidx.fragment.app.K.c(FragmentManager.java:42)
at androidx.fragment.app.k.e(Fragment.java:6)
at androidx.fragment.app.T.a(FragmentStateManager.java:56)
at androidx.fragment.app.K.a(FragmentManager.java:177)
at androidx.fragment.app.K.h(FragmentManager.java:4)
at androidx.fragment.app.K.a(FragmentManager.java:257)
at androidx.fragment.app.K.b(FragmentManager.java:47)
at androidx.fragment.app.K.c(FragmentManager.java:42)
at androidx.fragment.app.w.a(FragmentController.java:9)
at androidx.fragment.app.m.onStart(FragmentActivity.java:5)
at androidx.appcompat.app.v.onStart(AppCompatActivity.java:1)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1392)
at android.app.Activity.performStart(Activity.java:7157)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2952)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1823)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:198)
at android.app.ActivityThread.main(ActivityThread.java:6729)
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.NoSuchMethodException: <init> [class android.app.Application]
at java.lang.Class.getConstructor0(Class.java:2327)
at java.lang.Class.getConstructor(Class.java:1725)
at androidx.lifecycle.M.a(ViewModelProvider.java:5)
at androidx.lifecycle.I.a(SavedStateViewModelFactory.java:4)
at androidx.lifecycle.Q.a(ViewModelProvider.java:8)
at com.myapp.screenrecorder.taskmedia.video.b.invoke(com.android.tools.r8.jetbrains.kotlin-style lambda group:1)
at kotlin.l.getValue(Lazy.kt:2)
at com.myapp.screenrecorder.taskmedia.video.VideoFragment.e(VideoFragment.kt:1)
at com.myapp.screenrecorder.taskmedia.video.g.c(VideoFragment.kt:11)
at kotlin.coroutines.jvm.internal.a.a(ContinuationImpl.kt:3)
at kotlinx.coroutines.K.a(Dispatched.kt:18)
at com.myapp.simplefilechooser.g.a(Unknown Source:20)
at kotlinx.coroutines.a.a(AbstractCoroutine.kt:21)
at kotlinx.coroutines.d.a(Unknown Source:16)
at com.myapp.screenrecorder.taskmedia.video.VideoFragment.d0(VideoFragment.kt:1)
at com.myapp.screenrecorder.taskmedia.video.VideoFragment.a(VideoFragment.kt:18)
at androidx.fragment.app.T.a(FragmentStateManager.java:51)
at androidx.fragment.app.K.a(FragmentManager.java:176)
at androidx.fragment.app.K.a(FragmentManager.java:426)
at androidx.fragment.app.K.a(FragmentManager.java:373)
at androidx.fragment.app.K.c(FragmentManager.java:38)
at androidx.fragment.app.K.c(FragmentManager.java:22)
at androidx.fragment.app.K.b(FragmentManager.java:49)
at androidx.fragment.app.K.c(FragmentManager.java:42)
at androidx.fragment.app.k.e(Fragment.java:6)
at androidx.fragment.app.T.a(FragmentStateManager.java:56)
at androidx.fragment.app.K.a(FragmentManager.java:177)
at androidx.fragment.app.K.h(FragmentManager.java:4)
at androidx.fragment.app.K.a(FragmentManager.java:257)
at androidx.fragment.app.K.b(FragmentManager.java:47)
at androidx.fragment.app.K.c(FragmentManager.java:42)
at androidx.fragment.app.w.a(FragmentController.java:9)
at androidx.fragment.app.m.onStart(FragmentActivity.java:5)
at androidx.appcompat.app.v.onStart(AppCompatActivity.java:1)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1392)
at android.app.Activity.performStart(Activity.java:7157)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2952)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1823)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:198)
at android.app.ActivityThread.main(ActivityThread.java:6729)
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)
lb...@gmail.com <lb...@gmail.com> #5
The different file size after exported
lb...@gmail.com <lb...@gmail.com> #6
The problem was resolved after clear project + rebuild and add the rule -keep class **VideoModel. But I hope this can add or process automatically as AGP 3.5.2 instead of manual adding,
The finally file size is 4,179KB. I don't know why before file size is 3804KB, maybe the cause is the part missing of proguard.
Thank you!
The finally file size is 4,179KB. I don't know why before file size is 3804KB, maybe the cause is the part missing of proguard.
Thank you!
ma...@gmail.com <ma...@gmail.com> #7
Thanks for reporting back, that you found a workaround. I still wonder why an additional rule was needed.
As jsjeon@google.com mentioned in b/144514795#comment3 the rule:
-keepclassmembers,allowobfuscation class * extends androidx.lifecycle.AndroidViewModel {
<init>(android.app.Application);
}
should come from the aar, but it does not show up in your -printconfiguration output, which seems strange.
To test I created a "Basic Activity" app, and added
dependencies {
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-rc02"
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0-rc02"
implementation "androidx.lifecycle:lifecycle-common-java8:2.2.0-rc02"
}
and when I add -printconfiguration the rule above is in the file - you should see that as well.
It would be interesting to understand why this does not work. I am not that familiar with androidx.lifecycle, but I don't think you should need the rule '-keep class **VideoModel'. I wonder if you could try the following without that rule:
1. Add the rule '-whyareyoukeeping class **VideoModel' and build release. The output from -whyareyoukeeping goes to stdout for the build.
2. Look at the mapping file app/build/outputs/mapping/release/mapping.txt for the build from 1), and look for you ViewModel class.
3. If the above still crash at runtime try the rule '-keep,allowobfuscation class **VideoModel'
4. Look at the mapping file app/build/outputs/mapping/release/mapping.txt for the build from 3), and look for you ViewModel class.
As jsjeon@google.com mentioned in
-keepclassmembers,allowobfuscation class * extends androidx.lifecycle.AndroidViewModel {
<init>(android.app.Application);
}
should come from the aar, but it does not show up in your -printconfiguration output, which seems strange.
To test I created a "Basic Activity" app, and added
dependencies {
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-rc02"
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0-rc02"
implementation "androidx.lifecycle:lifecycle-common-java8:2.2.0-rc02"
}
and when I add -printconfiguration the rule above is in the file - you should see that as well.
It would be interesting to understand why this does not work. I am not that familiar with androidx.lifecycle, but I don't think you should need the rule '-keep class **VideoModel'. I wonder if you could try the following without that rule:
1. Add the rule '-whyareyoukeeping class **VideoModel' and build release. The output from -whyareyoukeeping goes to stdout for the build.
2. Look at the mapping file app/build/outputs/mapping/release/mapping.txt for the build from 1), and look for you ViewModel class.
3. If the above still crash at runtime try the rule '-keep,allowobfuscation class **VideoModel'
4. Look at the mapping file app/build/outputs/mapping/release/mapping.txt for the build from 3), and look for you ViewModel class.
ma...@gmail.com <ma...@gmail.com> #8
Thank you!
I build all cases with AGP 3.6.0-beta04 and this the result:
-keepclassmembers,allowobfuscation class * extends androidx.lifecycle.AndroidViewModel {
<init>(android.app.Application);
}
or '-whyareyoukeeping class **VideoModel
But it still crashed at runtime because it missed this in the mapping.txt
android.app.Application app -> c
1:1:void <init>(android.app.Application):17:17 -> <init>
.........................................................
When adding rule '-keep,allowobfuscation class **VideoModel'. It worked fine because it added full.
I build all cases with AGP 3.6.0-beta04 and this the result:
-keepclassmembers,allowobfuscation class * extends androidx.lifecycle.AndroidViewModel {
<init>(android.app.Application);
}
or '-whyareyoukeeping class **VideoModel
But it still crashed at runtime because it missed this in the mapping.txt
android.app.Application app -> c
1:1:void <init>(android.app.Application):17:17 -> <init>
.........................................................
When adding rule '-keep,allowobfuscation class **VideoModel'. It worked fine because it added full.
Description
This is good, and I've reported about it when it wasn't as such:
Thing is, one of the reasons I did it, is because the Play Policy claims that it's possible to use these functions without MANAGE_EXTERNAL_STORAGE. They claim it's possible to do it using MediaStore API, instead.
Today, as I've tried to publish my app, targeting Android 13 and using the new permission, it was denied by the policy team, with the same reason being mentioned.
They claim 2 things which are wrong:
1. Not a core feature. That's despite the fact that the app had this functionality of import&backup of the current wallpaper for a very long time, and it helps with migration from the previous wallpaper to my app (which is a live wallpaper app).
2. App can use MediaStore API to get the current wallpaper. This is also incorrect, and I've shown them the updated documentation about it.
I've already tried to convince them about this for many months already.
I don't want to ruin my app's experience and lose users just because of this.
Currently I can only update the app to use the old READ_EXTERNAL_STORAGE and target Android 12 because of it.
I already told them again and again: If I could use a different permission I would have. I already tried. There is no alternative to it for fetching the current wallpaper. I even requested to have better alternatives on Android 14 for this, once I've found out that Android 13 became a problem:
Please contact the policy team and tell them to stop claiming the wrong things. Make sure they are in-sync because currently they give wrong information to developers and there is nobody else to talk to about it.
There is no other hope, as I'm stuck now in a loop and targeting Android 13 is required soon.