本文正在参与「金石方案 . 瓜分6万现金大奖」

前语

很快乐遇见你~

在本系列的上一篇文章中,咱们讲了:

1、反编译东西 jadx 的装置与运用

jadx 相当所以 apktool + dex2jar + jd-gui 的结合体,既能反编译代码也能反编译资源,必定程度上提高了咱们的开发效率

2、混杂 APK 代码

1、准备了一些类(自定义编写的类,第三方库的类)用于混杂后的作用验证

2、在 app -> build.gradle -> android 闭包 -> release 闭包将 minifyEnabled 设为 true 开启代码混杂

3、运用 AndroidStudio 导航栏上 Generate Signed Bundle or APK 的方法打 release 包

4、在 app 的 build.gradle 文件中装备签名文件,方便后续运用 gradle 指令或 gradle 可视化界面打包

5、逐行介绍了默许混杂规矩文件 proguard-android-optimize.txt 中的装备

6、Proguard 疑难语法介绍

7、自定义混杂规矩保存类(自定义编写的类,第三方库的类)不被混杂

还没有看过上一篇的朋友,主张先去阅读Android 逆向系列(二):Android APK 代码混杂

接下来咱们介绍一下 APK,AAB 资源混杂

留意

1、下面演示均是在 mac 下进行

2、AndroidStudio 版别:Android Studio Dolphin | 2021.3.1 Patch 1

3、AGP 版别:7.3.1

4、Gradle 版别:7.4

Github Demo 地址:github.com/sweetying52…

一、APK 资源混杂

上篇文章咱们对 APK 的代码进行了混杂,可是 APK 资源仍是暴露在他人面前:

image-20221203180325392.png

能够看到:资源文件可读性很强,咱们能够很轻松的去找到想要的资源

针对这种状况,能够对 APK 的资源进行混杂。那要怎么混杂呢?🤔️

答:运用微信开源的 AndResGuard 结构进行混杂

1.1、AndResGuard 介绍

Github 地址:github.com/shwenzhang/…

1)、AndResGuard 是微信开源的一个资源混杂结构,工作方法类似于咱们前面所讲的 APK 代码混杂。

2)、它会对咱们的文件进行重命名,例如:activity_main.xml => a.xml,在必定程度上增加了他人窃取你资源的难度,另一方面减小了包体积

1.2、AndResGuard 运用

1、在项目的根 build.gradle 增加如下装备:

//一、假如是 AGP 7.0 以下,运用如下装备:
buildscript {
    repositories {
      	//增加仓库地址:jcenter 在阿里云的镜像仓库
        maven {
            url 'https://maven.aliyun.com/repository/jcenter'
        }
    }
    dependencies {
        //增加 AndResGuard 依靠
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.21'
    }
}
//二、假如是 AGP 7.0 以上,运用如下装备:
//第一步
buildscript {
    repositories {
      	mavenCentral()
    }
    dependencies {
        //增加兼容 AGP 7.0 的 AndResGuard 依靠
      	//Github:https://github.com/Leon406/AndResGuard
        classpath 'io.github.leon406:AndResGuard-gradle-plugin:1.2.22.6'
    }
}
//第二步:在 gradle.properties 增加如下装备
//关闭系统自带的资源紧缩
android.enableResourceOptimizations=false

留意:

1、因为 jcenter 彻底关服,它里边一切的库都访问不了了,因而上面咱们增加了 jcenter 在阿里云的镜像仓库

2、腾讯的 AndResGuard 未做 AGP 7.0 兼容,假如要在 AGP 7.0 上运用,请运用上述装备二

2、在 app 的 build.gradle 中增加相关装备

主张新建一个 gradle 脚本文件,然后在 app 的 build.gradle 中引入该 gradle 脚本,如下图:

image-20221203114342414.png

3、接着咱们对 andresguard.gradle 进行装备,里边写了具体的注释

apply plugin: 'AndResGuard'
andResGuard {
    //1、启用签名。为 true 时,需求装备 signConfig
    useSign = true
    //2、keepRoot 为 true 时,会 keep 居处有资源的原始途径,只混杂资源的姓名
  	//实际测验 keepRoot 为 true 和 false 没啥差异
    keepRoot = true
    //3、白名单,指定不被混杂的资源文件,支撑通配符,【+】代表 1 个或多个,【?】代表 0 个或 1 个,【*】代表 0 个或多个
    whiteList = [
           "R.mipmap.ic_launcher"
    ]
    //4、装备需求紧缩的文件的匹配规矩,一般这儿不需求动。支撑 ? + * 通配符
    compressFilePattern = [
            "*.png",
            "*.jpg",
            "*.jpeg",
            "*.gif",
    ]
    //5、装备7zip,只需设置 artifact 或 path;支撑同时设置,但此时以 path 的值为优先
    //    sevenzip {
    //        //artifact = 'com.tencent.mm:SevenZip:1.2.21'
    //        //path = "/usr/local/bin/7za"
    //    }
    //6、用于 keep 住资源途径的 mapping 文件所在途径不被混杂
    //mappingFile = file("./resource_mapping.txt")
    //7、启用 7zip 紧缩。为true时,useSign 有必要为 true
    //use7zip = false
    //8、设置这个值,会把 arsc name 列混杂成相同的姓名,减少 string 常量池的大小
    //fixedResName = "arg"
    //9、为 true 时会兼并一切哈希值相同的资源,但请不要过度依靠这个功能去除掉冗余资源
    //mergeDuplicatedRes = true
    //10、可选,指定生成的apk的保存途径
    // finalApkBackupPath = "${project.rootDir}/final.apk"
    //11、可选: 指定v1签名时生成jar文件的摘要算法,默许值为“SHA-1”
    // digestalg = "SHA-256"
}

4、同步一下项目,就能够进行 resguard 打包了,方法有二:

1)、运用 Gradle 可视化界面履行相应的使命进行打包:

image-20221203192409739.png

假如想打 debug 包,则履行 resguardDebug 。

假如想打 release 包,则履行 resguardRelease 。

2)、运用 Gradle 指令进行打包

在 Terminal 履行如下指令:

//打 debug 包
./gradlew resguardDebug
//打 release 包
./gradlew resguardRelease

5、这儿咱们打 release 包,等候使命履行完结,咱们能够在 app的/build/output/apk/release/AndResGuard_{apk_name}/文件夹中找到混杂后的Apk,如下图:

image-20221203193101190.png

其中:

1、app-release_aligned_signed.apk:为进行对齐混杂并签名过的 apk

2、app-release_aligned_unsigned.apk:为进行对齐混杂但未签名过的 apk

3、app-release_unsigned.apk:为进行混杂但未签名过的apk

2,3 两个包因为没有签名是不能进行装置的,只有 1 能装置

6、作用展示

这儿咱们主要对 1 进行反编译检查,如下图:

image-20221203193839353.png

能够看到资源文件依照预期作用混杂了。

别的咱们装备的白名单资源没有被混杂,如下图:

image-20221203194509171.png

至此,AndResGuard 混杂 APK 资源就介绍完了,假如有疑问,能够参阅我的 demo 工程。

接下来咱们介绍一下混杂 AAB 资源,在此之前,咱们应该先了解一下 AAB 是什么?

二、AAB 介绍

上传过应用到 GooglePlay 的同学必定知道,现在 GooglePlay 强制要求咱们上传 .aab 格局的文件,那你心中是否会有一些疑问呢?

什么是 AAB?AAB 和 APK 有啥差异?

2.1、什么是 AAB?

AAB 即 Android App Bundle ,它是 Google 推出的 APK 动态打包,动态组件化的技能,经过一个 .aab 后缀的 bundle 文件拼装一个最适合你手机机型的 APK 来为你的设备装置

简介:Android app bundle

Tips:.aab 是一种紧缩包的格局(只用于上传 GooglePlay),最终用户下载的时分会经过用户手机机型装备的不同,生成一个最适合该装备的 APK,用户最终装置和下载的是 APK 文件

2.2、AAB 和 APK 差异?

*.aab*.apk 文件的结构比照如下图所示:

img

从图中能够看出,*.aab*.apk 文件结构明显不同,*.aab 文件中的资源索引文件为 resources.pb,而 *.apk 文件中的资源索引文件为 resources.arsc 文件,二者的结构不同,解析天然也不相同,而且 *.aab 中的文件包含 dynamic feature 目录,所以 *.aab 中需求混杂更多的文件内容。

2.3、AAB 打包实践

2.3.1、运用 AndroidStudio 打 AAB 包

之前咱们介绍了怎么运用 AndroidStudio 打一个 APK 包,接下来咱们介绍一下怎么打 AAB 包,流程其实差不多。

1、挑选 AndroidStudio 东西栏的 build,点击 Generate Singed Bundle or Apk

image-20221203203338084.png

然后挑选 Android App Bundle,点击 next

image-20221203203522968.png

2、挑选签名文件,假如没有则新建一个,我这儿已经有了:

image-20221203203733628.png

点击 next

3、挑选打 release 包:

image-20221203203933035.png

点击 finish

经过上面 3 步,假如没啥问题,咱们就能成功打一个 AAB 包,如下图:

image-20221203204127859.png

在 app/release/ 目录下生成了一个 app-release.aab 文件

2.3.2、将 AAB 装置到手机

AAB 已经有了,接下来咱们就把它装置到手机上。

咱们知道 APK 能直接装置到手机上,可是 AAB 不行,那假如我将 AAB 转成 APK 然后装置到手机是否可行呢?实践一下。

1、下载 bundletool 东西

要想将 AAB 转成 APK ,这儿咱们需求凭借 Google 供给的 bundletool 东西

下载链接:github.com/google/bund…

image-20221203205358585.png

2、然后经过 bundletool 将 aab 转为一组 apk,也便是 apks,运用如下指令:

java -jar [ bundletool 文件] build-apks --bundle [ aab 文件] --output [ apks 文件]
 --ks=[签名文件]
 --ks-pass=[pass:签名暗码]
 --ks-key-alias=[别号]
 --key-pass=[pass:别号暗码]

以我的为例:

java -jar bundletool-all-1.13.1.jar build-apks --bundle=app-release.aab --output=app-output.apks --ks=Certificate --ks-pass=pass:erdai666 --ks-key-alias=key0 --key-pass=pass:erdai666

生成的文件如下:

image-20221203210544108.png

3、运用 bundletool 将生成的 app-output.apks 装置到手机,履行如下指令:

java -jar [ bundletool 文件] install-apks --apks=[ apks 文件]

以我的为例:

java -jar bundletool-all-1.13.1.jar install-apks --apks=app-output.apks

假如没啥问题,你的手机将会收到一个装置的提示,如下图:

image-20221203211406390.png

点击装置即可

三、AAB 资源混杂

上述 AAB 资源是没有经过混杂的,咱们把它拖入 jadx-gui 即可验证这一点:

image-20221203211756626.png

接下来咱们运用字节开源的 AabResGuard 结构对 AAB 资源进行混杂。

3.1、AabResGuard 运用

Github 地址:github.com/bytedance/A…

AabResGuard 和咱们上面介绍的 AndResGuard 原理很类似,只不过一个是针对 AAB ,一个是针对 APK。

它的运用有两种方法:

1、Gradle Plugin

2、指令行支撑

3.1.1、Gradle Plugin

留意: aabresguard-plugin 只发布了 0.1.8 版别,0.1.8 版别依靠的 Kotlin 插件的版别为:1.3.61,而 AGP 7.x 版别支撑的 Kotlin 插件版别为:1.5.20 或者更高,因而假如你运用了 AGP 7.x 的版别,主张运用方法二去对 aab 进行资源混杂

1、在项目的根 build.gradle 增加如下装备:

buildscript {
    repositories {
      	mavenCentral()
    }
    dependencies {
        classpath "com.bytedance.android:aabresguard-plugin:0.1.8"
    }
}

2、在 app 的 build.gradle 中增加相关装备

主张新建一个 gradle 脚本文件,然后在 app 的 build.gradle 中引入该 gradle 脚本,如下图:

image-20221203215616463.png

3、接着咱们对 aabresguard.gradle 进行装备,里边写了具体的注释

apply plugin: "com.bytedance.android.aabResGuard"
aabResGuard {
    whiteList = [ // 白名单规矩
                  "R.mipmap.ic_launcher"
    ]
    obfuscatedBundleFileName = "duplicated-app.aab" // 混杂后的文件名称,有必要以 `.aab` 结尾
    mergeDuplicatedRes = true // 是否允许去除重复资源
    enableFilterFiles = true // 是否允许过滤文件
    filterList = [ // 文件过滤规矩
                   "*/arm64-v8a/*",
                   "META-INF/*"
    ]
    enableFilterStrings = false // 过滤案牍
    //mappingFile = file("mapping.txt").toPath() // 用于增量混杂的 mapping 文件
    //unusedStringPath = file("unused.txt").toPath() // 过滤案牍列表途径 默许在mapping同目录查找
    //languageWhiteList = ["en", "zh"] // 保存en,en-xx,zh,zh-xx等言语,其他均删去
}

4、同步一下项目,运用如下指令进行混杂

./gradlew clean :app:bundleRelease --stacktrace

5、经过履行 gradle Task 获取混杂后的 bundle 文件途径

def aabResGuardPlugin = project.tasks.getByName("aabresguard${VARIANT_NAME}")
Path bundlePath = aabResGuardPlugin.getObfuscatedBundlePath()

3.1.2、指令行支撑

AabResGuard 供给了 jar 包,咱们能够运用指令直接履行

java -jar [AabResGuard Jar 文件] obfuscate-bundle --bundle=[未资源混杂的 aab] --output=[资源混杂后的 aab] --merge-duplicated-res=true --storeFile=[签名文件] --storePassword=[签名暗码] --keyAlias=[别号] --keyPassword=[别号暗码]

以我的为例:

java -jar AabResGuard-0.1.9.jar obfuscate-bundle --bundle=app-release.aab --output=obfuscated.aab --merge-duplicated-res=true --storeFile=Certificate --storePassword=erdai666 --keyAlias=key0 --keyPassword=erdai666

经过上面的操作,aab 资源混杂的作用和之前 apk 资源混杂的作用是相同的,这儿就不再进行作用验证了

四、总结

本篇文章咱们介绍了:

1、运用 AndResGuard 对 APK 进行资源混杂,需求留意的是:

腾讯供给的 AndResGuard 不兼容 AGP 7.x ,因而假如在 AGP 7.x 中需运用兼容 AndResGuard 的方案去处理

2、什么是 AAB

AAB 是 Google 推出的一种动态打包技能,它会依据用户手机的机型动态下发最合适的 APK 进行装置

3、AAB 和 APK 的差异

1、AAB 的资源索引文件为 .pb 格局,APK 的资源索引文件为 .arsc 格局

2、AAB 中包含了 dynamic feture 模块,APK 中没有

4、经过 AndroidStudio 打 AAB 包并装置到手机上

5、经过字节供给的 AabResGuard 对 AAB 进行资源混杂

好了,本篇文章到这儿就完毕了,希望能给你带来帮助 🤝

感谢你阅读这篇文章

参阅和引荐

AndResGuard

AndResGuard 7.0 适配

AabResGuard

开源 | AabResGuard: AAB 资源混杂东西

你的点赞,谈论,是对我巨大的鼓励!

欢迎重视我的大众号: sweetying ,文章更新可第一时间收到

假如有问题,大众号内有加我微信的入口,在技能学习、个人成长的道路上,咱们一同行进!