Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

Android 资源混淆 AndResGuard


目录

资源混淆工具库简介

AndResGuard

AndResGuard 是一个帮助你缩小 APK 大小的工具,他的原理类似 Java Proguard,但是只针对资源。他会将原本冗长的资源路径变短,例如将 res/drawable/activity_advanced_setting_for_test 变为 r/d/a

AndResGuard不涉及编译过程,只需输入一个 apk(无论签名与否,debug版,release版均可,在处理过程中会直接将原签名删除),可得到一个实现资源混淆后的 apk(若在配置文件中输入签名信息,可自动重签名并对齐,得到可直接发布的 apk)以及对应资源 ID 的 mapping 文件。

底层原理详见 WeMobileDev公众号文章

点击查看 更多细节和命令行使用方法

已知问题:当时在使用7zip压缩的APK时,调用AssetManager#list(String path)返回结果的首个元素为空字符串. #162

最佳实践

  • 如果不是对 APK size 有极致的需求,请不要把 resource.asrc 添加进 compressFilePattern. (#84 #233)
  • 对于发布于 Google Play 的 APP,建议不要使用 7Zip 压缩,因为这个会导致 Google Play 的优化 Patch 算法失效. (#233)

因为 andresGuard 只混淆资源,所以可以和阿里百川的 Hotfix 完美集成(2.0以前的hotfix只能热修复代码)。

使用

配置 build.gradlle

在 module(app) 中的 build.gradlle 中添加以下代码:

apply plugin: 'com.android.application'
apply plugin: 'AndResGuard' //应用AndResGuard插件 buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.13' //添加AndResGuard依赖
}
} android {
signingConfigs { //配置签名信息,注意,要放在buildTypes之前
release {
storeFile file("../keystore/bea.keystore") //签名文件位置,【.】代表当前目录,【..】代表父目录
storePassword "beachinambk"
keyAlias "bea.keystore"
keyPassword "beachinambk"
v2SigningEnabled true
} debug {
storeFile file("../keystore/debug.keystore")
}
} buildTypes {
release { //配置构建选项
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
shrinkResources true
zipAlignEnabled true
pseudoLocalesEnabled true
signingConfig signingConfigs.release //签名文件
}
}
} //-----------------------------配置 AndResGuard-----------------------------
andResGuard {
mappingFile = null // = file("./resource_mapping.txt") //用于keep住资源的路径的mapping文件所在路径
use7zip = true //启用压缩。为true时,useSign必须为true
useSign = true // 启用签名。为true时,需要配置signConfig
keepRoot = false // 为true时,会keep住所有资源的原始路径,只混淆资源的名字
whiteList = [ //白名单,支持通配符,【+】代表1个或多个,【?】代表0个或1个,【*】代表0个或多个
"R.mipmap.ic_launcher", "R.drawable.icon",// for your icon
"R.string.com.crashlytics.*",// for fabric,详见https://docs.fabric.io/android/crashlytics/build-tools.html
"R.string.google_app_id",// for google-services
"R.id.*",//任意id
]
compressFilePattern = [ //需要压缩的文件的匹配规则,一般这里不需要动。支持 ? + * 通配符
"*.png",
"*.jpg",
"*.jpeg",
"*.gif",
"resources.arsc"
]
sevenzip { //配置7Zip,只需设置 artifact 或 path;支持同时设置,但此时以 path 的值为优先
artifact = 'com.tencent.mm:SevenZip:1.2.13'
//path = "/usr/local/bin/7za" //path指本地安装的7za(7zip命令行工具)
} // finalApkBackupPath = "${project.rootDir}/final.apk" //可选,指定生成的apk的保存路径
// digestalg = "SHA-256" //可选: 指定v1签名时生成jar文件的摘要算法,默认值为“SHA-1”
}

配置 whiteList 与 mappingFile

默认 andResGuard 会混淆所有资源文件,而白名单则允许我们指定不被混淆的资源文件。

例如友盟、融云在 sdk 里面写死了资源名,所以如果被我们混淆之后就找不到指定资源,则运行时就会崩溃。

另外,所有使用 getIdentifier 访问的资源也都需要加入白名单。

getResources().getIdentifier(“com.test.demo:drawable/icon”,null,null);//包名 : 资源文件夹名 / 资源名
getResources().getIdentifier(“icon”, “drawable”, “com.test.demo”);//ID名,资源属性,包名

可以在 white_list.md 查看更多第三方 sdk 的白名单配置。

白名单机制只作用于资源的 specsName,不会 keep 住资源的路径。如果想 keep 住资源的路径,可以使用 mappingFile。

例如我想 keep 住所有 folder 中的 icon,可以在 mappingFile 指向的文件添加:

res path mapping:
res/mipmap-hdpi-v4 -> res/mipmap-hdpi-v4
res/mipmap-mdpi-v4 -> res/mipmap-mdpi-v4
res/mipmap-xhdpi-v4 -> res/mipmap-xhdpi-v4
res/mipmap-xxhdpi-v4 -> res/mipmap-xxhdpi-v4
res/mipmap-xxxhdpi-v4 -> res/mipmap-xxxhdpi-v4

启动任务

使用 Android Studio 的同学可以在 andresguard 下找到相关的构建任务,命令行可直接运行./gradlew resguard[BuildType | Flavor],如:

gradlew.bat resguardRelsese    //Windows
./gradlew reguardRelease //OS X or Linux

这里的任务命令规则和 build 中的 assemble 一致。

双击或右键 Run... 下图中的选中任务,构建以及混淆就会开始:

完成后会提示你混淆后的 apk 生成目录:

Backup Final APk(V2) to ..\Test\app\build\outputs\apk\release\app-release.apk

<--AndResGuard Done! You can find the output in *\Test\app\build\outputs\apk\release\AndResGuard_app-release

如果不设置 finalApkBackupPath 则会如上面一样默认覆盖 assemble 输出的apk,如果配置则输出至 finalApkBackupPath 配置的路径。

例如配置为【finalApkBackupPath = "${project.rootDir}/final.apk"】后的输出为:

Backup Final APk(V2) to ..\Test\final.apk

<--AndResGuard Done! You can find the output in *\Test\app\build\outputs\apk\release\AndResGuard_app-release

生成的文件

默认会生成4种apk,我们选择签名、压缩、对齐后的 apk 即可,后缀名是*_7zip_aligned_signed.apk

混淆前 apk 解压后的资源文件:

混淆后 apk 解压后的资源文件:

2018-7-11

Android 资源混淆 AndResGuard MD的更多相关文章

  1. Android资源混淆 + 混淆忽略 .so库

    安装包立减1M--微信Android资源混淆打包工具http://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=208135658&idx ...

  2. 转:美团Android资源混淆保护实践

    转自:http://tech.meituan.com/mt-android-resource-obfuscation.html 前言 Android应用中的APK安全性一直遭人诟病,市面上充斥着各种被 ...

  3. 自动化打包资源混淆集成python实践----资源混淆

    前面自动化打包资源混淆集成python实践----打包一文讲述了四种打包方案,以及美团打包方案.apk注释添加渠道号方案的实现.这里讲集成资源混淆. 1.资源混淆带来的好处: 1)对资源文件起一定的保 ...

  4. Android studio混淆

    看了一篇关于Android studio混淆的文章http://blog.csdn.net/qq_23547831/article/details/51581491,感觉有必要总结一个简单的混淆版本设 ...

  5. Android APK代码混淆与资源混淆详解,你确定不看?

    APK的混淆分为资源混淆与代码混淆.一般大部分都使用两者结合.尤其是目前主流的应用. 其中的优点: 防止被恶意破解逆向分析 减少apk体积,也是瘦身的方法 代码可阅读性降低 其中的缺点: 调试不方便( ...

  6. Android项目实战(二十五):Android studio 混淆+打包+验证是否成功

    前言: 单挑Android项目,最近即时通讯用到环信,集成sdk的时候 官方有一句 在 ProGuard 文件中加入以下 keep. -keep class com.hyphenate.** {*;} ...

  7. Android proguard (混淆)

    混淆(Proguard)用法 最近项目中遇到一些混淆相关的问题,由于之前对proguard了解不多,所以每次都是面向Stackoverflow的编程.copy别人的答案内心还可以接受,但是copy了之 ...

  8. Android 代码混淆 混淆方案

    本篇文章:自己在混淆的时候整理出比较全面的混淆方法,比较实用,自己走过的坑,淌出来的路.请大家不要再走回头路,可能只要我们代码加混淆,一点不对就会导致项目运行崩溃等后果,有许多人发现没有打包运行好好地 ...

  9. Android APK 打包过程 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. mysql三大特性、三范式、五大约束

    1.数据库的三大特性 '实体':表 '属性':表中的数据(字段) '关系':表与表之间的关系 2.数据库设计三大范式 a:确保每列保持原子性(即数据库表中的所有字段值是不可分解的原子值) b:确保表中 ...

  2. [Android]对BaseAdapter中ViewHolder编写简化(转)

    来自博客:http://www.cnblogs.com/tiantianbyconan/p/3642849.html 在Android项目中,经常都会用到ListView这个控件,而相应的Adapte ...

  3. 51Nod 1092 回文字符串(LCS + dp)

    51Nod 1092 数据结构暑假作业上出现的一题,学习了一下相关算法之后,找到了oj测试能AC. 1.回文串是一种中心对称的结构,这道题可以转变为求最长回文子序列长度的题目.(子序列:可以不连续) ...

  4. NXP LPC18xx LPC43xx OTP ID Boot

    static LPC_DEVICE_TYPE LPCtypes[] = { { , , , , , , , , , CHIP_VARIANT_NONE }, /* unknown */ // id, ...

  5. 怎么发现RAC环境中&#39;library cache pin&#39;等待事件的堵塞者(Blocker)?

    怎么发现RAC环境中的'library cache pin'等待事件的堵塞者(Blocker) 參考自 How to Find the Blocker of the 'library cache pi ...

  6. delphi 实现文件上传下载

    unit UpDownFile; interface uses Windows, Classes, Idhttp, URLMon, IdMultipartFormData; const UpUrl = ...

  7. java List集合记录 ArrayList和LinkedList的区别

    一般大家都知道ArrayList和LinkedList的大致区别:      1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问 ...

  8. 梅尔罗斯百度云在线观看迅雷下载Patrick Melrose磁力BT下载

    原名:Patrick Melrose 地区:英国 语言:英语 首播:2018-05-12(美国) 电视台:Showtime 类型:剧情 别名:浮生若梦 编剧:大卫·尼克尔森 导演:爱德华·贝尔格 主演 ...

  9. 神盾局特工第一季/全集Agents Of SHIELD迅雷下载

    神盾局特工 Agents of S.H.I.E.L.D. (2013) 本季看点:如果你熟悉Marvel漫画或者看过创造电影票房记录的<复仇者联盟>(The Avengers),你应该对「 ...

  10. 推荐一款移动端的web UI控件 -- mobiscroll

    用mobiscroll 可实现ios系统自带的选择器控件效果,支持几乎所有的移动平台(iOS, Android, BlackBerry, Windows Phone 8, Amazon Kindle) ...