本以为把APK混淆所有的坑都踩了一遍,才发现自己太年轻了
背景
新项目用dataBinding+MVVM开发,自定义一个onBindingClick在布局中使用点击事件。
混淆bug
开始一切顺利,等到了项目收尾对代码混淆时出现问题。
问题一
混淆报错关键字
1、onClick
2、onBindingClick编译正式包的时候,aapt_rule.txt会报一个错误
-keepclassmembers class * { *** @{click::onClick}(android.view.View); }
这个错误应该是控件调用onBindingClick中的onClick方法出了问题。会不会是View被混淆了,或者View的onClick方法被混淆了?
还有一种可能,会不会是View的Click方法无法识别onBindingClick接口? 先为View添加混淆规则,然后把onBindingCLick也加入混淆规则,结果发现还是没有解决问题。会不会是View.onClick这个方法不能在xml文件中使用? 但结果发现还是不行,仍然报错无法混淆。 难不成,用户点击事件只能用最傻的方法View.setOnClickListener(this)
一个一个赋值,可行是可行,大不了多写几百上千行代码罢了,可是不甘心啊。但是,如果不这么做的话,就无法混淆代码。
我开始从一个个xml布局文件修改代码,把View的onClick方法去掉,在每个activity的onCreate()方法下手动添加View.setOnClickListener(this)
在修改到其中一个布局文件的时候,我终于发现了问题的所在。
原来在大部分xml文件中,View的onClick确实用了@{click::OnClick}来替代点击事件,但是,其中一个xml文件,它的onClick书写不规范,如下 正确的书写:
<View
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{click::onClick}"/>
错误的书写:
<View
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@click::onClick"/>
这里少了一对大括号,但编译器不会提示。至于onClick属性,这里就不介绍了。
问题二
不同module混淆
假设项目中有三个module,一个主module和两个子module(moduleA、moduleB),其中moduleA中有一个jar文件。
混淆后运行moduleA中的jar文件,发现运行不了,或者闪退。于是在moduleA的混淆文件中加入jar文件的混淆规则。结果发现还是有问题。但是,重点来了,在主module的混淆文件中加入jar文件的混淆规则,则jar文件运行成功。 好奇,理论上来说,每个module应该可以混淆自己module中的文件,在moduleA中加入jar文件的混淆规则,那么应该可以使jar文件成功运行,可结果却是失败的。