APK混淆第二弹

348 阅读2分钟

本以为把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文件成功运行,可结果却是失败的。

Snipaste_2023-06-08_11-46-21.png

将所有的混淆规则都加在主模块的混淆文件中是没有问题的,但这样会使主模块的混淆规则过于庞大,而且GPT的回答也表示把jar文件的混淆规则放在对应的子模块中是没有问题的。

可能,就这个jar文件比较特殊,需要把混淆规则加在主模块中吧?