【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )
文章目录
- 一、resources.arsc 资源映射表 混淆
- 二、resources.arsc 资源映射表二进制格式分析
- 三、参考资料
资源混淆时 , 需要修改混淆 resources.arsc 资源映射表 的 全局字符串池 和 包数据下的 资源名称字符串池 ;
一、resources.arsc 资源映射表 混淆
在上一篇博客 【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 ) 中分析了 Android 应用根据 ID 查找资源的机制 , 是从 resources.arsc 资源映射表 中查找相应资源的路径 ;
资源混淆 的本质就是将 resources.arsc 资源映射表 中的 资源路径 进行混淆 , 并且相应的将对应的 资源移动到对应的混淆后的路径 中 ;
资源混淆步骤 :
① 解析二进制文件 : 解析 resources.arsc 资源映射表混淆 二进制文件 , 获取字符串池中的资源名称字符串 ;
② 混淆资源路径 : 将字符串池中的资源路径使用无意义的字符串替换 ;
③ 修改资源路径 : 根据 ② 步骤中的无意义字符串路径 , 修改 res 中目录中的资源路径 ;
④ 打包 : 使用 7-Zip 工具进行打包 , 对齐 , 签名 , 然后就可以发布了 ;
ArscBlamer 开源项目 : https://github.com/google/android-arscblamer
;
Google 给出了解析 resources.arsc 资源映射表 的开源项目 ArscBlamer , 该工具一个命令行工具 , 用于解析 Android 应用的 resources.arsc 资源映射表文件 , 并且可以提取其中的相关信息 ;
借助 ArscBlamer 工具 , 可以输出所有资源的配置信息 , 查看 类型 , 变量 , 大小 , 空实例 , 实例个数 , 屏幕像素密度 等资源信息 ;
Android 源码中也有相关内容 : frameworks/base/include/androidfw/ResourceTypes.h
二、resources.arsc 资源映射表二进制格式分析
resources.arsc 资源映射表 二进制文件结构 :
文件头 : 文件开始是 文件头 , 包含 121212 字节的数据 ;
全局字符串池 : 文件头后面是字符串池 , 内容是字符串 , 如 “res/mipmap/ic_launcher.png” , “res/layout/activity_main.xml” 等字符串 ;
包数据 : 字符串池后面是包数据 , 其中包含包名等数据 ;
包数据中包含了 资源类型字符串池 , 资源名称字符串池 , 以及资源分组匹配规范 等数据 , 这里我们关注 资源类型字符串池 和 资源名称字符串池 ;
类型字符串池 : 包含了资源的类型 , “anim” 动画 , “attr” 属性 , “drawable” 图片 , “color” 颜色 , “mipmap” 图片 , “layout” 布局 等类型字符串 ; 是 R.layout.activity_main.xml 中的中间部分组成 ;
名称字符串池 : 资源的名称 , 如 “activity_main” , “ic_launcher” 等资源的名称 , 注意该名称不带后缀 ; 是 R.layout.activity_main.xml 中的后面部分组成 ;
Spec 配置表 : 包含资源类型 ID , 指向资源类型字符串池 , 每个资源类型都有对应的一块配置数据块 , 数据块中的内容就是该类型的具体的每个资源的名称 ; drawable 类型有一个配置数据块 , layout 类型也对应有一个配置数据块 ; 每个资源类型数据块都包含以下内容 , Spec 配置表中有若干如下数据块 ;
Spec 配置表 的 drawable 资源类型对应的数据块中存储这资源 ID , 给定一个资源 ID , 如 R.drawable.ic_launcher , 在该 Spec 配置表 中查找到 该 ID , 然后 查找其对应的路径 , 从 资源名称字符串池 找到 ID 对应的字符串 ic_launcher , 则可以得到其最终路径 res/drawable/ic_launcher ;
resources.arsc 资源映射表格式 :
给定一个 int 类型的 ID 常量 , 到 resources.arsc 资源映射表 中查询对应的文件路径 ;
要查找的文件的实际路径在字符串池中 , 如 “res/mipmap/ic_launcher.png” , “res/layout/activity_main.xml” 等字符串文件路径地址 ;
给定的 ID 如 : “kim.hsl.svg.R.layout.activity_main” , 可以分为 333 部分 ,
- 包数据 “kim.hsl.svg.R” ,
- 资源类型 “layout” ,
- 资源名称 “activity_main”
资源混淆时 , 需要修改混淆 resources.arsc 资源映射表 的 全局字符串池 和 包数据下的 资源名称字符串池 ;
三、参考资料
参考官方文档 :
- 缩减、混淆处理和优化应用 : https://developer.android.google.cn/studio/build/shrink-code
- APK 构建流程 : https://developer.android.google.cn/studio/build
- AAPT2 工具官方文档 : https://developer.android.google.cn/studio/command-line/aapt2?hl=zh_cn
- ArscBlamer 开源项目 : https://github.com/google/android-arscblamer
;
Android 源码中资源类型相关内容 : frameworks/base/include/androidfw/ResourceTypes.h
参考之前的博客资源 :
- 【Android 安全】DEX 加密 ( ProGuard 混淆 | -keepclassmembers 混淆效果 | -keepclasseswithmembernames 混淆效果 )
- 【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt )
- 【Android 安全】DEX 加密 ( Proguard 混淆 | 将混淆后的报错信息转为原始报错信息 | retrace.bat 命令执行目录 | 暴露更少信息 )
- 【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt )
博客资源 :
GitHub 项目源码 : https://github.com/han1202012/SVG
下载地址 :
【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )相关推荐
- 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )
文章目录 一.resources.arsc 资源映射表文件格式 二.头文件 数据格式 三.全局字符串池 数据格式 四.包数据 数据格式 1.包头 数据格式 2.资源类型字符串池 数据格式 3.资源名称 ...
- 【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )
文章目录 一.AAPT2 资源编译工具 二.resources.arsc 资源映射表 工作机制 三.参考资料 一.AAPT2 资源编译工具 资源的编译 , 生成 R.java 文件 , 都是通过 AA ...
- 【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )
文章目录 一.开启资源压缩 二.启用严格模式的资源引用检查 三.自定义保留/移除资源配置 四.资源压缩效果 五.完整配置 1.keep.xml 配置 2.build.gradle 构建脚本 六.参考资 ...
- 【Android 安装包优化】Android 应用中 7zr 可执行程序准备 ( Android Studio 导入可执行 7zr 程序 | 从 Assets 资源文件拷贝 7zr 到内置存储 )
文章目录 一.Android Studio 导入可执行 7zr 程序 二.从 Assets 资源文件拷贝 7zr 到内置存储空间 三.参考资料 一.Android Studio 导入可执行 7zr 程 ...
- 【Android 安装包优化】Android 中使用 SVG 图片 ( Android 5.0 以下的矢量图方案 | 矢量图生成为 PNG 图片 )
文章目录 一.Android 5.0 以下的矢量图方案 二.矢量图生成为 PNG 图片 三.完整的 build.gradle 构建脚本 四.编译效果 五.参考资料 一.Android 5.0 以下的矢 ...
- 【Android 安装包优化】WebP 应用 ( 4.0 以下兼容 WebP | Android Studio 中使用 libwebp.so 库向下兼容版本 | libwebp 库测试可用性 )
文章目录 一. Android Studio 中导入 libwebp.so 库 二. Android Studio 中测试 libwebp.so 库 三.参考资料 一. Android Studio ...
- 【Android 安装包优化】WebP 图片格式性能测试 ( 测试 WebP 图片解码速度 | 测试 WebP 图片编码速度 )
文章目录 一.测试 WebP 图片解码速度 二.测试 WebP 图片编码速度 三.参考资料 测试结果 : WebP 格式图片 , 解码快 , 编码慢 , 占用空间小 ; 在解码速度上 , WebP 格 ...
- 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )
文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.a 静态库 四.Android Studio 导入 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )
文章目录 一.JNI 中 main 函数声明 二.命令字符串切割并传入 main 函数 三.完整代码示例 1.完整 jni 代码 2.完整 java 代码 3.执行结果 四.参考资料 前置博客 : [ ...
最新文章
- 在线作图丨如何画一个优美的相关性热图
- PHP zval内存回收机制和refcount_gc和is_ref_gc
- 风口再起:数据中心建设
- 多个数字数组_1分钟彻底理解JavaScript的数组与函数
- 综保参数如何设定_FANUC主轴速度怎么去设定限制?
- [状压dp] 玉米田(状压dp)
- oracle备份数据exp,oracle数据库备份之exp增量备份
- B站视频下载方法(4K60帧)
- Fedora34/35/36 软件闪退解决
- 基于STM32F103的直流电机调速系统
- python时间索引_Python时间戳作为索引
- 网站优化入门SEO图文五大步骤
- ios 如何在cell中去掉_iOS-UITableViewCell三种常用编辑模式:删除,插入,移动
- 引领时代变化的人都是“骗子”
- 物联网到底是什么,生活中能用得上吗?
- 求四点的交点(两线段的交点)
- autodesk genuine service卸载不掉
- express-ws实现客服聊天功能
- Windows 安装Java (官网下载Java)
- Mac用户速度来看!!Adobe 全家桶关闭自动更新?
热门文章
- [转帖]Linux中的15个基本‘ls’命令示例
- Android SDK更新下载失败以及Studio首次安装取消自动下载SDK
- 动态可订制属性的 PropertyGrid(转载)
- outlook 发送邮件!
- CF(439E - Devu and Birthday Celebration)莫比乌斯容斥
- oracle--表,用户,授权
- 爬虫-基于bs4库的HTML内容查找方法
- BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊
- Lua string库整理
- OpenGL Vertex Array