我想提供一个使用Android数据绑定的混淆的AAR库。当我从测试应用程序使用库时,只要库未被ProGuard缩小,一切正常。但是,在启用ProGuard之后,由于无法找到生成的数据绑定类中的BR字段,所以测试应用程序不再编译。Android数据绑定:为混淆的AAR生成错误的BR类
因为我找不到关于这个“特定”主题的任何官方文档,我试图理解Android数据绑定背后的魔力。该机制似乎是这样的(请纠正我,如果我错了):
为了使用AAR库内的数据绑定,嵌入式应用程序也必须启用数据绑定。
这是因为包含数据绑定指令的布局资源在AAR中未经修改就包含在内。
因此,嵌入应用程序的责任是为lib中的布局生成相应的数据绑定类。 (这就是为什么lib的视图模型类不能被模糊处理的原因)。
Android数据绑定生成器面临的挑战是将程序包名称与库和嵌入应用程序区分开来:必须生成库的BR类在库的包中(例如com.example.lib.databinding),因为这个类是从库的视图模型类访问的。另一方面,嵌入式应用程序的BR类通常应该在应用程序的包中生成(com.example.app.databinding)。
这正是我的问题开始的地方。我不知道Android正好迎接这个挑战,我只知道在我的情况下,它适用于未混淆的库,并且它不适用于混淆的库。当我看着嵌入应用程序生成的源,我看到:
当使用是非模糊的lib下,无论是BR和所有* Binding.java类库的包内产生,并且应用程序编译。
使用混淆的库时,BR和所有* Binding.java类都在应用程序的包中生成。更糟糕的是,BR仅包含XML资源中模型变量名称的常量,而不包含视图模型类中的属性。因此,该应用程序不编译。
我试图在XML声明中将数据绑定类的包明确地设置到lib的包中,但这并不能解决不完整BR类的问题。
我不知道这些地方的差异来自于和我已经在担心,唯一的解决办法是去除所有我的漂亮数据从LIB结合的东西...是否有人提出了类似的经验,可以给我一个提示, 请?
这些ProGuard的例外,我已经加入到我的lib:
-keep public class **.BR { public *; }
-keep public class **.BR$* { public *; }
-keepclassmembers class **.BR$* {
public static ;
}
-keepclassmembers class **.R$* {
public static ;
}
-keep class android.databinding.** { *; }
-keep class * extends android.databinding.** { *; }
-keep class com.example.lib.databinding.** { *; }