在 Android Q 中,当 minifyEnabled = true 时,带有数据绑定的 LiveData 不起作用

Vig*_*han 6 android proguard android-livedata android-10.0

我正在使用LiveData数据绑定。我minifyEnabled=true在发布配置中使用了标准混淆器规则。在 Android 9 及更低版本中一切正常,但在 Android 10(Q) 中,实时数据不会调用观察者。

我根据在互联网上找到的答案尝试了所有不同的规则,但没有解决问题。

# Android data binding
-dontwarn androidx.databinding.**
-keep class androidx.databinding.** { *; }

# Android data binding
-dontwarn com.xxxx.xx.databinding.**
-keep class com.xxxx.xx.databinding.** { *; }
-keepclassmembers class com.xxxx.xx.databinding.** { *; }

-keep class com.xxxx.xx.BindingHelpers.** { *; }
-keepclassmembers class com.xxxx.xx.BindingHelpers.** { *; }
-keep class com.xxxx.xx.DataBinderMapperImpl { *; }


#AndroidX View Model
-keep class * extends androidx.lifecycle.ViewModel { *; }
-keepclassmembers class * extends androidx.lifecycle.ViewModel { *; }

#AndroidX AttributeSet
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
#AndroidX Annotation
-keepattributes *Annotation*

#AndroidX Lifecycle
-keepclassmembers enum androidx.lifecycle.Lifecycle$Event {
    <fields>;
}
-keep !interface * implements androidx.lifecycle.LifecycleObserver {
}
-keep class * implements androidx.lifecycle.GeneratedAdapter {
    <init>(...);
}
-keepclassmembers class ** {
    @androidx.lifecycle.OnLifecycleEvent *;
}


#AndroidX Arch
-keepclassmembers class android.arch.** { *; }
-keep class android.arch.** { *; }
-dontwarn android.arch.**

# ServiceLoader support(coroutines)
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepnames class kotlinx.coroutines.android.AndroidExceptionPreHandler {}
-keepnames class kotlinx.coroutines.android.AndroidDispatcherFactory {}

# Most of volatile fields are updated with AFU and should not be mangled
-keepclassmembernames class kotlinx.** {
    volatile <fields>;
}
Run Code Online (Sandbox Code Playgroud)

当我查看Android 示例时,minifyEnabled=false是在 build.gradle 文件中设置的。

这解决了我的问题。

我想检查其他人是否有类似的问题并通过启用 minify 修复它?

删除缩小可以吗?(我知道缩小可以通过删除未使用的代码来减少 APK 大小,删除它还缺少其他什么吗?)。

Vig*_*han 3

总而言之:

我通过保留所有生命周期类和成员来修复。就像数据绑定规则一样。

-keep class androidx.lifecycle.** { *; }
Run Code Online (Sandbox Code Playgroud)

加长版;

我在调试模式下启用了 minify 并逐步浏览了 Android 源代码,发现LiveData和 都LifecycleBoundObserver被缩小了。因此,检查生命周期观察器是否处于活动状态总是返回 false。

我不需要保留所有文件来解决我面临的问题,但我怀疑缩小这些文件可能会导致未来出现一些问题。

请建议是否有更好的方法来解决这个问题。