【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )
文章目录
- 一、AAPT2 资源编译工具
- 二、resources.arsc 资源映射表 工作机制
- 三、参考资料
一、AAPT2 资源编译工具
资源的编译 , 生成 R.java 文件 , 都是通过 AAPT 工具生成的 ;
AAPT2 工具官方文档 : https://developer.android.google.cn/studio/command-line/aapt2?hl=zh_cn
Java 文件是由 javac 工具编译成 .class 字节码文件 , 然后通过 dx 工具打包到 dex 文件中 ;
清单文件 AndroidManifest.xml , Drawable XML 图片资源 , 布局 XML 资源 , 都是由 AAPT2 工具将 XML 文本文件 编译成 二进制的资源文件 , 并打包到 APK 安装包 中 ;
AAPT2 工作原理 :
打包编译 :
assets 和 res/raw 目录下的文件虽然不需要编译 , 但是也会 被 AAPT2 工具 采集出来进行打包 ;
清单文件 , XML 资源文件 , 会被 AAPT2 工具编译成一个 " *.ap_ " 二进制文件 , 在 debug 模式下 , 在 " app\build\intermediates\processed_res\debug\out " 目录下生成 " resources-debug.ap_ " 文件 ;
res 目录下的其它文件 , 根据文件类型不同 , 进行不同的处理 , 如压缩 ;
该 " resources-debug.ap_ " 文件是一个压缩文件 , 可以使用 7-Zip 工具打开 ;
生成资源 ID 并赋值给资源 :
AAPT2 会对除 Assets 之外的其它资源 , 都生成一个对应的资源 ID , 该 ID 是一个 int 类型常量 , 占 444 字节 ;
这些生成的 ID 常量值 , 会存放在 resources.arsc 资源映射表 中 ,
参考 【Android 安装包优化】资源打包配置 ( resources.arsc 资源映射表 | 配置国际化资源 ) 一、resources.arsc 资源映射表 博客章节 ;
二、resources.arsc 资源映射表 工作机制
特别注意 AAPT2 工具编译生成的 resources.arsc 资源映射表 , Android 应用中查找资源 , 就是根据该 resources.arsc 资源映射表 查找资源 ;
resources.arsc 资源映射表 提供了 资源 ID 与 资源文件路径 之间的映射表 , 可以根据资源 ID 查询到对应的资源文件 ;
Android 应用中 , 调用 R.mipmap.ic_launcher 资源 , 假设 其对应的资源 ID 是 0x7f010000 , 对应的资源路径是 res/mipmap/ic_launcher.png ;
首先通过 ID R.mipmap.ic_launcher 到 resources.arsc 资源映射表 中查找对应的文件名称 , 然后找到对应的路径 ;
Android 通过 AssetManager 获取 assets 目录中的资源 , 具体是通过文件名来查找资源的 ;
Android 通过 Resources 获取 res 目录下的资源 , 通过资源 ID 查找资源 ; 传递一个 ID 给 Resources , Resources 根据该 ID , 从 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
参考之前的博客资源 :
- 【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 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )相关推荐
- 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )
文章目录 一.resources.arsc 资源映射表 混淆 二.resources.arsc 资源映射表二进制格式分析 三.参考资料 资源混淆时 , 需要修改混淆 resources.arsc 资源 ...
- 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )
文章目录 一.resources.arsc 资源映射表文件格式 二.头文件 数据格式 三.全局字符串池 数据格式 四.包数据 数据格式 1.包头 数据格式 2.资源类型字符串池 数据格式 3.资源名称 ...
- 【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 安装包优化】使用 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.执行结果 四.参考资料 前置博客 : [ ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )
文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.完整代码示例 1.Java 层代码 2.JNI 层代码 3.日志头文件 4.执行结果 四.参考资料 前置博客 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.配置 CMakeLists.txt 构建脚本 1.导入动态库 2.导入头文件 三.完整 CMakeLists ...
最新文章
- Python培训教程之Python基础知识点梳理
- swift_044(Swift 计算属性和存储属性的概念以及使用)
- double类型数值计算出现误差的解决办法
- 西电计算机本科学费,陕西高校学费大比拼!你当年的学费现在涨了多少
- 文巾解题 627. 变更性别
- python调研报告总结体会_调研报告心得(多篇)
- 逆向 EasyBase64
- logstash 获取多个kafka_logstash 配置详解
- redis在linux命令行下连续进行命令操作
- 在 .NET 6 Preview 3 ASP.NET Core 更新
- selenium模拟登陆去哪儿网
- solr4.2增量索引之同步(修改,删除,新增)
- 通信工程师考试新手报考指南
- 解决局域网共享文件夹要求输入用户名密码访问的问题
- mxplayer battle游戏接入
- Latex algorithm Input Output
- 老旧小区改造浪潮下的智慧安防市场发展机遇
- mysql 家谱树查询_无限级分类之查找子孙树和家谱树
- NVCC Fatal
- 电脑小问题七:台式机连接无线网络+无线网卡
热门文章
- poj 3006 java
- [Ubuntu] 如何在Ubuntu11.04将PHP5.3降级到PHP5.2
- ubuntu16.04上安装valgrind
- Dynamics CRM中的操作(action)是否是一个事务(transaction)?
- 1-3_基本概念_程序进程
- node_modules
- Delphi调用REST
- opencv7-ml之svm
- ArcGIS.Server.9.3和ArcGIS API for Flex的GeometryService和buffer分析(十)
- 课后练习----实现窗口的切换