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和朋友保管了。。。