本文正在参与「金石方案 . 瓜分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 资源仍是暴露在他人面前:
能够看到:资源文件可读性很强,咱们能够很轻松的去找到想要的资源
针对这种状况,能够对 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 脚本,如下图:
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 可视化界面履行相应的使命进行打包:
假如想打 debug 包,则履行 resguardDebug 。
假如想打 release 包,则履行 resguardRelease 。
2)、运用 Gradle 指令进行打包
在 Terminal 履行如下指令:
//打 debug 包
./gradlew resguardDebug
//打 release 包
./gradlew resguardRelease
5、这儿咱们打 release 包,等候使命履行完结,咱们能够在 app的/build/output/apk/release/AndResGuard_{apk_name}/
文件夹中找到混杂后的Apk,如下图:
其中:
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 进行反编译检查,如下图:
能够看到资源文件依照预期作用混杂了。
别的咱们装备的白名单资源没有被混杂,如下图:
至此,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
文件的结构比照如下图所示:
从图中能够看出,*.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
然后挑选 Android App Bundle,点击 next
2、挑选签名文件,假如没有则新建一个,我这儿已经有了:
点击 next
3、挑选打 release 包:
点击 finish
经过上面 3 步,假如没啥问题,咱们就能成功打一个 AAB 包,如下图:
在 app/release/ 目录下生成了一个 app-release.aab 文件
2.3.2、将 AAB 装置到手机
AAB 已经有了,接下来咱们就把它装置到手机上。
咱们知道 APK 能直接装置到手机上,可是 AAB 不行,那假如我将 AAB 转成 APK 然后装置到手机是否可行呢?实践一下。
1、下载 bundletool 东西
要想将 AAB 转成 APK ,这儿咱们需求凭借 Google 供给的 bundletool 东西
下载链接:github.com/google/bund…
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
生成的文件如下:
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
假如没啥问题,你的手机将会收到一个装置的提示,如下图:
点击装置即可
三、AAB 资源混杂
上述 AAB 资源是没有经过混杂的,咱们把它拖入 jadx-gui 即可验证这一点:
接下来咱们运用字节开源的 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 脚本,如下图:
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 ,文章更新可第一时间收到
假如有问题,大众号内有加我微信的入口,在技能学习、个人成长的道路上,咱们一同行进!