【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )(二)

简介: 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )(二)

三、全局字符串池 数据格式


字符串池混淆注意事项 : 修改 " 全局字符串池 " , " 资源名称字符串池 " 其最终的字符串数据块字节数 必须是 4 44 的整数倍 , 如果最后不足 4 44 字节 , 需要补 0 00 ;



蓝色部分是 全局字符串池 头文件部分 :

image.png




1 . RES_STRING_POOL_TYPE : 字符串池类型 , 2 22 字节 ;



2 . 头大小 : 2 22 字节 ;



3 . 块大小 : 4 44 字节 , 如下数据块大小 ;

image.png




4 . 字符串数 : 4 44 字节 , 字符串个数 ; 包括所有的 图片, 布局 等类型的资源对应的文件路径 , 定义的 strings 字符串资源 , value 值 资源 等 ;



5 . style 数 : 4 44 字节 , 字符串的样式 , 全局字符串池中的字符串样式一般为空 ;



6 . 标记 : 4 44 字节 , 用于标记字符串存储在 resources.arsc 资源映射表 文件中的编码方式 , UTF-8 或 UTF-16 两种编码方式 ;



7 . 字符串起始位置 : 4 44 字节 , 标记 全局字符串池 中的字符串开始位置 , 0 00 索引位置是 RES_STRING_POOL_TYPE 第一个字节位置 ;



8 . style 起始位置 : 4 44 字节 , 标记 全局字符串池 中的字符串风格数据的开始位置 , 0 00 索引位置是 RES_STRING_POOL_TYPE 第一个字节位置 ;



9 . 字符串偏移数组 : int 类型数组 , 每个 index 索引的 int 数组的元素值是 对应 index 索引的 字符串 对应的 首元素位置下标 ;






四、包数据 数据格式




1、包头 数据格式


包数据中的包头数据格式 :


image.png


1 . RES_TABLE_PACKAGE_TYPE : 资源包类型格式 , 2 22 字节 ;



2 . 头大小 : 2 22 字节 ;



3 . 块大小 : 4 44 字节 ;



4 . 包 ID : 4 44 字节 , 包名对应的 ID 常量标识 ;



5 . 包名 : 256 256256 字节 , 解析出来就是对应的再清单文件中配置的包名 , “kim.hsl.svg” ;



6 . 资源类型字符串池偏移 : 4 44 字节 , 从 RES_TABLE_PACKAGE_TYPE 的首字节作为 0 00 位置开始计数 , 到 " 资源类型字符串池 " 的首字节的字节索引值 , 如 : 整个包头占 2000 字节 , 那么包头索引值是 0 00 ~ 1999 19991999 , " 资源类型字符串池 " 的首字节偏移就是 2000 20002000 ;



7 . lastPublicType : 4 44 字节 , 默认为 0 00 , 无意义 ;



8 . 资源关键字字符串池偏移 : 4 44 字节 , 就是 " 资源名称字符串池 " 的偏移 , 从 RES_TABLE_PACKAGE_TYPE 的首字节作为 0 00 位置开始计数 , 中间隔着 包头数据 和 资源类型字符串池 两个数据块 ;



9 . lastPublicType : 4 44 字节 , 默认为 0 00 , 无意义 ;



10 . typeIdOffset : 4 44 字节 ;




2、资源类型字符串池 数据格式


资源类型字符串池 与 " 全局字符串池 " 格式相同 , 参考上面的 " 三、全局字符串池 数据格式 " 章节 ;


image.png




3、资源名称字符串池 数据格式


资源名称字符串池 与 " 全局字符串池 " 格式相同 , 参考上面的 " 三、全局字符串池 数据格式 " 章节 ;



image.png





五、参考资料


参考官方文档 :


缩减、混淆处理和优化应用 : 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


下载地址 :


目录
相关文章
|
3天前
|
Android开发
Android源代码定制:Overlay目录定制|调试Overlay资源是否生效
Android源代码定制:Overlay目录定制|调试Overlay资源是否生效
11 0
|
28天前
|
Java Android开发
Android Studio的使用导入第三方Jar包
Android Studio的使用导入第三方Jar包
12 1
|
8月前
|
Java Android开发
Android 保存资源图片到相册最新写法适用于Android10.0及以上
Android 保存资源图片到相册最新写法适用于Android10.0及以上
587 0
|
8月前
|
编解码 监控 前端开发
Android平台GB28181设备接入端如何降低资源占用和性能消耗
Android平台GB28181设备接入端如何降低资源占用和性能消耗?
|
4月前
|
缓存 安全 Java
安卓现代化开发系列——从生命周期到Lifecycle【扩展包1已更新】-1
安卓现代化开发系列——从生命周期到Lifecycle【扩展包1已更新】
64 0
|
5月前
|
Shell 数据库 开发工具
(超详细)android中SqLite数据库的使用(一文包懂包会)
(超详细)android中SqLite数据库的使用(一文包懂包会)
133 0
|
8月前
|
Java Android开发
Android 中使用数组资源文件定义数组
Android 中使用数组资源文件定义数组
116 0
|
9月前
|
移动开发 编解码 缓存
Android包体积过大,真的会影响绩效
Apk瘦身,做为一个Android开发者,这是多多少少都会接触到的,同样功能的App,200M和150M,给用户的第一直觉是不一样的,如果不是刚需,体积越大,用户的排斥也就越大,所以啊,铁子们,你以为瘦身,是简简单单的把体积变小,殊不知,直接影响着用户的真实体验,在开发中,是很有必要进行实施的,毕竟影响着网络数据流量和下载的等待时间。
100 0
|
10月前
|
资源调度 JavaScript Android开发
webapp打包为Android的apk包的一种方法
webapp打包为Android的apk包的一种方法
|
10月前
|
Java 开发工具 Android开发
Android dx工具(jar包转成dex格式二进制jar包工具)
Android dx工具(jar包转成dex格式二进制jar包工具)
620 0