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

Android Q中minifyEnabled=true时数据绑定不起作用的LiveData,android,proguard,android-livedata,android-10.0,Android,Proguard,Android Livedata,Android 10.0,我正在使用LiveData进行数据绑定。我在发布配置中使用了minifyEnabled=true,并使用了标准的proguard规则。在安卓9及以下版本中一切正常,但在安卓10(Q)中,实时数据并没有呼叫观察者 我根据在互联网上找到的答案尝试了所有不同的规则,但都没有解决问题 # Android data binding -dontwarn androidx.databinding.** -keep class androidx.databinding.** { *; } # Android

我正在使用
LiveData
进行数据绑定。我在发布配置中使用了
minifyEnabled=true
,并使用了标准的proguard规则。在安卓9及以下版本中一切正常,但在安卓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>;
}
Android数据绑定 -dontwarn androidx.databinding** -保持类androidx.databinding.*{*;} #Android数据绑定 -dontwarn com.xxxx.xx.databinding** -保持类com.xxxx.xx.databinding.*{*;} -keepclassmembers类com.xxxx.xx.databinding.*{*;} -保持类com.xxxx.xx.BindingHelpers.*{*;} -keepclassmembers类com.xxxx.xx.BindingHelpers.*{*;} -保持类com.xxxx.xx.DataBinderMapperImpl{*;} #AndroidX视图模型 -keep类*扩展了androidx.lifecycle.ViewModel{*;} -keepclassmembers类*扩展了androidx.lifecycle.ViewModel{*;} #AndroidX属性集 -keepclassswithmembers类*{ public(android.content.Context、android.util.AttributeSet); } -keepclassswithmembers类*{ public(android.content.Context,android.util.AttributeSet,int); } #AndroidX注释 -keepattributes*注释* #AndroidX生命周期 -keepclassmembers枚举androidx.lifecycle.lifecycle$事件{ ; } -继续!接口*实现androidx.lifecycle.LifecycleObserver{ } -keep类*实现androidx.lifecycle.GeneratedAdapter{ (...); } -keepclassmembers类**{ @androidx.lifecycle.OnliFeCycleeEvent*; } #安德洛弓 -keepclassmembers类android.arch.*{*;} -保持类android.arch.*{*;} -dontwarn android.arch** #ServiceLoader支持(协同程序) -keepnames类kotlinx.coroutines.internal.MainDispatcherFactory{} -keepnames类kotlinx.coroutines.CoroutineExceptionHandler{} -keepnames类kotlinx.coroutines.android.AndroidExceptionPreHandler{} -keepnames类kotlinx.coroutines.android.AndroidDispatcherFactory{} #大多数易失性字段都使用AFU更新,不应损坏 -keepclassmembernames类kotlinx。**{ 不稳定的 } 当我查看时,build.gradle文件中设置了
minifyEnabled=false

这解决了我的问题

我想检查是否有其他人有类似的问题,并修复它与迷你启用

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

TLDR:

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

-keep class androidx.lifecycle.** { *; }
较长版本

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

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


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

您使用的是什么版本的Lifecycle?您的
编译器dkversion
是什么?在API 29设备上没有调用观察器时,我们也遇到了同样的问题。启用
minify后
设置为
false
一切正常。我们正在使用以下依赖项:
androidx.lifecycle:lifecycle extensions:2.1.0
androidx.lifecycle:lifecycle viewmodel ktx:2.2.0-rc02
您是否碰巧使用了
androidx.fragment:fragment ktx
依赖项?我刚刚通过将其更新为androidx解决了这个问题。fragment:fragment ktx:1.2.0-rc02@ianhanniballake我们使用的是2.1.0。顺便说一下,启用minifytrue时。让我回答我自己的问题。谢谢@flyingAssistant!从
rc01
更新到
rc03
也为我们解决了这个问题。这是可行的,但是它应该像
-keep class androidx.lifecycle.*{*}
那样编写,注意
-
和lifecycle中的小写L。但同样有效的是更新生命周期依赖关系。我使用的是
2.2.0-rc01
。我将它更新为
2.2.0
,它运行正常(不需要这个proguard规则)。@Kidus。你是对的。我只是凭记忆打字。如果我们对androix片段使用ktx扩展,我们可能不需要它。我没有测试。我很高兴能继续上课。可能有一天。这是有效的,但不应该是必需的。。。为什么我们在项目中需要这个?对我来说毫无意义,那些包裹应该已经由Proguard和朋友保管了。。。