我想提供一个混淆的AAR库,该库利用Android数据绑定。当我从测试应用程序中使用库时,只要库由proguard缩小,一切都可以正常工作。但是,启用Proguard后,测试应用程序不再编译,因为找不到生成数据绑定类中的BR字段。
由于我找不到有关此"特定"主题的任何正式文档,因此我试图理解Android数据绑定背后的魔力。机制似乎是这样(如果我错了,请纠正我):
- 为了在AAR LIB中使用数据绑定,嵌入式应用也必须启用数据绑定。
- 这是因为包含数据绑定指令的布局资源在AAR中没有修改。
- 因此,嵌入式应用程序的责任是为LIB中的布局生成相应的数据绑定类。(这就是为什么不得不将Lib的视图模型类别混淆,顺便说一句。)
- Android数据绑定生成器的挑战是告诉库和嵌入式应用程序外的软件包名称:库的BR类必须在库的软件包中生成(例如该类可以从库的视图模型类访问。另一方面,嵌入式应用程序的BR类通常应在应用程序软件包(com.example.app.databinding)中生成。
这正是我的问题开始的地方。我不知道Android恰好加剧了这一挑战,我只知道在我的情况下,它可以与毫无疑问的Lib一起使用,并且与一个混淆的Lib一起工作。当我查看嵌入式应用程序的生成源时,我会看到:
- 使用未掺杂的LIB时,BR和ALL *BINDING.JAVA类都是在库的软件包中生成的,并且应用程序编译。
- 使用混淆的LIB时,BR和ALL *BINDING.JAVA类都是在应用程序包中生成的。更糟糕的是,BR仅包含XML资源中的模型变量名称的常数,而不是视图模型类中的属性。因此,该应用不会编译。
- 我试图将数据绑定类的包装包装到XML声明中的LIB包中,但这并不能解决不完整的BR类的问题。
我不知道这些差异的来源,我已经担心唯一的解决方案可以从lib中删除我所有不错的数据绑定的东西……有人做过类似的经历,可以给我一个暗示吗?
这些是我已经添加到我的lib中的前进例外:
-keep public class **.BR { public *; }
-keep public class **.BR$* { public *; }
-keepclassmembers class **.BR$* {
public static <fields>;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
-keep class android.databinding.** { *; }
-keep class * extends android.databinding.** { *; }
-keep class com.example.lib.databinding.** { *; }
我设法使它在此期间运行,但是"解决方案"是如此奇怪,我真的不想将其带到富有成效的版本...
在比较混淆和未撞击的lib的AAR文件时,我注意到class.jar'''''''''''''''''''''''''
- /com/example/lib/com.example.lib-br.bin
- /com/example/lib/com.example.lib-layoutinfo.bin
- /com/example/lib/com.example.lib-setter_store.bin
这些二进制文件包含我的一些数据绑定类名称,对于代码生成过程显然很重要。我只是试图将这些文件复制到我混淆的AAR的相应位置,并且...工作!!!
,但这不是最终解决方案。至少,如果我能说服proguard简单地将这些非级别的文件保留在班级中,那将比应对更可靠。有什么想法如何做?
更多,我希望获得有关此机制背景的一些信息,以及是否有可能避免这种丑陋的低级操作来解决实际应该是标准的问题。
预先感谢您的任何答案!
显然Google已解决了Gradle Plugin 2.3.0的问题,请参阅https://code.google.com/p/android/issues/issues/detail?id=229684.ph>