2016-12-01 76 views
1

我想提供一个使用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 <fields>; 
} 
-keepclassmembers class **.R$* { 
    public static <fields>; 
} 
-keep class android.databinding.** { *; } 
-keep class * extends android.databinding.** { *; } 
-keep class com.example.lib.databinding.** { *; } 

回答

1

我设法使其在同时运行,但“解决方案”是如此怪异,我真的不想把它转移到生产版本...

当比较模糊和是非模糊的LIB的AAR文件,我注意到,是非模糊的一个的classes.jar包含这三个文件:

  • /COM /例如/ LIB/com.example.lib-BR。斌
  • /com/example/lib/com.example.lib-layoutinfo.bin
  • /com/example/lib/com.example.lib-setter_store.bin

这些二进制文件包含一些我的数据绑定类名称,显然对代码生成过程很重要。我只是试图将这些文件复制到我混淆的AAR的相应位置,并且......它工作了!

但这不可能是最终的解决方案。如果我能说服ProGuard简单地将这些非类文件保存在classes.jar中,至少它会比应付更可靠。任何想法如何做到这一点?

更多我希望得到关于这个机制的背景的一些信息,以及是否有可能避免这种丑陋的低级操作来解决实际上应该是标准的问题。

在此先感谢您的任何答案!

+0

我已经在Android团队提交了一个关于此问题的错误: –

+0

https://code.google.com/p/android/issues/detail?id=229684 –

+0

有没有可以做到这一点的Gradle任务..这是超级讨厌的:-( – Angad