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

LiveData with data binding not working when minifyEnabled = true in Android Q

我正在使用 LiveData 和 DataBinding。我在发布配置中使用了 minifyEnabled=true 并使用了标准混淆器规则。在 Android 9 及以下版本中一切正常,但在 Android 10(Q) 中实时数据未调用观察者。

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

# 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>;
}

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

这解决了我的问题。

我想看看有没有其他人有类似的问题并在启用 minify 的情况下修复了它?

可以删除缩小吗?(我知道缩小通过删除未使用的代码来减少 APK 大小,删除它是否还有其他我遗漏的东西?)。

TLDR:

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

-keep class androidx.lifecycle.** { *; }

更长的版本;

我在调试模式下启用了缩小并单步执行了 Android 源代码,发现 LiveDataLifecycleBoundObserver 被缩小了。因此,查看生命周期观察器是否处于活动状态的检查总是返回 false。

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

如果有更好的解决方法,请提出建议。