我想提供一个使用Android数据绑定的混淆AAR库。当我使用测试应用程序中的库时,只要图书馆没有被ProGuard缩小,一切正常。但是,启用ProGuard后,测试应用程序不再编译,因为无法找到生成的数据绑定类中的BR字段。
由于我无法找到关于此问题的任何官方文档,因此我们无法找到#34;主题,我试图了解Android数据绑定背后的魔力。机制似乎是这样的(请纠正我,如果我错了):
这正是我的问题开始的地方。我不知道Android确实应对了这个挑战,我只知道在我的情况下,它适用于未经模糊处理的lib,并且它不会被混淆。当我查看嵌入式应用程序的生成源时,我看到:
我不知道这些差异来自哪里,而且我不知道。已经担心唯一的解决办法就是从lib中删除所有我很好的数据绑定内容...有没有人提出类似的经验并且可以给我一个提示,好吗?
这些是我已经添加到我的lib中的ProGuard例外:
-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.** { *; }
答案 0 :(得分:1)
我设法让它在此期间运行,但“解决方案”非常奇怪,我真的不想把它带到一个高效的版本......
比较混淆和未混淆的lib的AAR文件时,我注意到未混淆的文件的classes.jar包含这三个文件:
这些二进制文件包含一些我的数据绑定类名,对代码生成过程显然很重要。我只是试图将这些文件复制到我混淆的AAR的相应位置并且...它工作了!!!
但这不是最终的解决方案。如果我可以说服ProGuard简单地将这些非类文件保存在classes.jar中,那么至少它比应对更可靠。任何想法如何做到这一点?
我更希望获得有关该机制背景的一些信息,以及是否有可能避免这种丑陋的低级操作来解决实际应该是标准的问题。
提前感谢您的回答!
答案 1 :(得分:1)
显然Google已使用Gradle插件2.3.0解决了该问题,请参阅https://code.google.com/p/android/issues/detail?id=229684。