XmlClassGuard是一款在GooglePlay上架的杀手级工具,可以对任意类进行混淆。

访客 211 0

XmlClassGuard是一款在GooglePlay上架的杀手级工具,可以对任意类进行混淆。-第1张图片-谷歌商店上架

1、前言

亲爱的同学们,好久不见!今天我给大家介绍一个非常实用的插件——XmlClassGuard。它可以混淆Android四大组件、自定义View等任意类。也许你会对它的作用产生疑问,但是如果你曾经在Google Play上架过应用,看到这个标题可能已经迫不及待地想要了解XmlClassGuard了。简单来说,如果你的应用被Google Play下架或封号后想要重新上架,就必须手动改一堆包名和类名。这项工作量少则需要2-3天,多则需要一个礼拜甚至更长时间,并且容易出错。然而使用XmlClassGuard只需执行一个任务,在30秒内就能搞定而且不会出错。简单来说,XmlClassGuard就是为了解放你双手、助你成功上架Google Play而存在的插件。

好的,接下来我们直接进入正题!

请添加我的微信 ljx-studio,并备注来意,我会拉你进XmlClassGuard交流群。请注意,如果没有备注来意,将不会通过申请。

2、XmlClassGuard 简介

  • “XmlClassGuard”是一个插件,可以对Android的四大组件、自定义View等任意类进行混淆。

  • XmlClassGuardProGuard的补充,与ProGuard无关且不会产生冲突。

  • 可以迅速修改manifest文件中的package属性,并将其同步到其他文件中。

  • 能够迅速将n个目录移动到其他目录,并实现与其他文件的同步。

  • 可查找constraint_referenced_ids属性的值,并自动添加到AabResGuard的白名单中

  • XmlClassGuard的主要功能是对xml文件中使用的类进行混淆,因此被命名为XmlClassGuard,以与AndResGuard和AabResGuard相对应。

3、有什么用?

  • 解决ProGuard无法对4大组件等类进行混淆的问题

  • 提高aab和apk反编译的难度

  • 为了避免上架Google Play时因查重率过高而导致下架或封号问题,我们可以采取措施来极大降低aab包的查重率。

关于第三点,如果之前的应用在Google Play商店被下架或封号,想要再次上架的话,99%的概率是会再次被封号。其中一个很大的原因就是之前提到过的代码未经混淆处理,这样很容易让Google认定为包重复,从而导致再次封号。因此,如果想要成功再次上架应用,就必须修改四大组件、自定义View等部分的包名和类名以降低查重率。然而,如果手动去完成这项任务的话,估计会累死一个程序员。所以就有了XmlClassGuard插件来完成这个繁琐任务,并且只需要一个插件便可搞定一切。

4、原理

XmlClassGuard不同于AndResGuard(apk资源混淆)、AadResGuard(aab资源混淆)侵入打包流程的方案,XmlClassGuard需要在打包前执行xmlClassGuard任务,该任务会检索AndroidManifest.xmlnavigation、layout文件夹下的xml,找出xml文件中引用的类,如4大组件及自定义View等,更改其包名+类名,并将更改后的内容同步到其他文件中,说直白点,就是在打包前,在本地更改包名+类名

重要提示:请注意!由于此操作是在本地进行的,任务执行后将无法撤销。因此,请务必提前做好代码备份,否则将很难恢复代码。

5、上手

1、在build.gradle(root project)中配置

修改后的文案如下:

在 `build.gradle(application)` 中进行以下配置:

```
buildscript {
    repositories {
        maven { url 'https://jitpack.io' }
    }
    dependencies {
        classpath com.github.liujingxing:XmlClassGuard:1.0.1
    }
}
``` 
apply plugin: "xml-class-guard"//以下均为非必须xmlClassGuard {    /*     * 是否查找约束布局的constraint_referenced_ids属性的值,并添加到AabResGuard的白名单中,     * true的话,要求你在XmlClassGuard前依赖AabResGuard插件,默认false     */    findConstraintReferencedIds = true    //用于增量混淆的 mapping 文件    mappingFile = file("xml-class-mapping.txt")    //更改manifest文件的package属性,即包名    packageChange = ["com.ljx.example": "ab.cd"]    //移动目录    moveDir = ["com.ljx.example": "ef.gh"]}复制代码

此时就可以在Gradle栏中,找到以下4个任务

XmlClassGuard是一款在GooglePlay上架的杀手级工具,可以对任意类进行混淆。-第2张图片-谷歌商店上架

6、任务介绍

共有4个任务的XmlClassGuard插件,它们分别是findConstraintReferencedIds、moveDir、packageChange和xmlClassGuard。这4个任务之间没有任何关系,下面将逐一介绍。

6.1、findConstraintReferencedIds

如果您没有使用AabResGuard插件,可以忽略该任务。

以下是对该段话的改写: 在这里,我们简要介绍一下由于约束布局中的constraint_referenced_ids属性值的限制。内部通过getIdentifier方法获取具体的id,因此我们需要将constraint_referenced_ids属性值添加到AabResGurad白名单中。否则,在打包时,id可能会被混淆,并且打包后constraint_referenced_ids属性将失效,从而导致UI异常。

然而,在项目中可能有许多地方都使用了constraint_referenced_ids属性,并且值非常多。要一个个找出来并手动添加到AabResGuard的白名单中,无疑是一项繁琐的工作。因此,我们可以利用findConstraintReferencedIds任务来解决这个问题。该任务会在打包时自动查找constraint_referenced_ids属性,并将其添加进AabResGuard的白名单中。这是一个非常实用的功能,你只需要在 h,然后再次执行xmlClassGuard任务。这将把com.ljx.example.test目录下的所有类(不包括子目录中的类)移动到h文件夹,并对所有类名进行混淆。以下是再次混淆后的mapping文件:

以下是混淆规则的手动输入示例,请注意以下几点:

dir mapping:
com.ljx.example -> e
com.ljx.example.activity -> dh
com.ljx.example.test -> h

class mapping:
com.ljx.example.AppHolder -> e.B
com.ljx.example.activity.MainActivity -> dh.C
com.ljx.example.test.Test -> h.D 

XmlClassGuard是一款在GooglePlay上架的杀手级工具,可以对任意类进行混淆。-第3张图片-谷歌商店上架

6.6、每次混淆产生不一样的结果

每次混淆都会生成相同的结果,默认情况下。混淆的包名是根据哈希算法计算得出的,而类名则以大写字母A开头,并按照递增顺序进行命名,就像26进制字符串一样:A、B、C...Y、Z、BA、BB...ZY、ZZ、BAA...

只需两步,即可实现每次混淆产生不同的结果。

  • 对于每一个包名,你需要进行配置。

  • 当类名众多时,配置每一个都变得繁琐。然而,我们只需配置一个即可解决问题。

如果我们对上述的mapping文件进行修改,修改后如下所示:

执行xmlClassGuard任务会产生不同的结果,具体如下:

目录映射:
- com.ljx.example -> hh
- com.ljx.example.activity -> jk
- com.ljx.example.test -> et

类映射:
- com.ljx.example.AppHolder -> hh.Z
修改后的文案如下:

```
目录映射:com.ljx.example -> hhcom.ljx.example.activity -> jkcom.ljx.example.test -> et
类映射:com.ljx.example.AppHolder -> hh.Zcom.ljx.example.activity.MainActivity -> jk.BAcom.ljx.example.test.Test -> et.BC
可以观察到,包名完全是根据自定义生成的结果,而类名则从Z开始依次递增,如Z BA BC...。在这里,可以将包名视为26进制字符串依次递增。
``` 

7、注意事项⚠️

  • 为了避免误杀情况,我们应该避免与其他类同名的混淆类。因此,在进行类名替换时,需要特别注意。

  • 当进行类混淆时,类的包名(路径)也会被混淆。因此,如果你在使用某些第三方库时需要配置包名,请记得手动进行相应更改。

  • 请手动更改proguard-rules.pro文件的内容,因为XmlClassGuard不会自动更改。如果在类混淆后,该文件中仍然包含未混淆的类或目录,请记得进行相应的手动修改。

  • XmlClassGuard只会帮你更改包名+类名,并同步带其他文件中,不会更改你的任何代码逻辑,如混淆后,出现部分功能不正常问题,需要你自己查找原因,如果是XmlClassGuard的问题,欢迎提issue或PR


作者:刘一刀
链接:https://juejin.cn/post/7079955014822674468
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签: 文件 任务 属性 代码

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~