文章目录

  • 一、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 类型常量 , 占 4 4 4 字节 ;

这些生成的 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

  • 下载地址 :

更多相关文章

  1. Android中从本地未安装的APK动态加载类和资源
  2. android之resources资源
  3. Android工程中R.java文件的重新生成——(注意资源文件的错误)
  4. 分享自学Java,Web,Android视频教程资源(自学Android,有这些就够了)
  5. Android工程源文件结构
  6. Android(安卓)Resource
  7. android内所使用的资源类型
  8. android资源
  9. Android中的资源与国际化

随机推荐

  1. 用 NodeJS 重命名系统文件[每日前端夜话0
  2. 什么?你项目还在用Date表示时间?!
  3. CSS3 全屏大气手风琴图片展示插件
  4. 嗯,用了一下Kotlin编程语言,真香!
  5. 纯CSS3骏马奔腾动画特效
  6. 用 Jest 进行 JavaScript 测试[每日前端
  7. CSS3实现摩天轮动画特效
  8. CSS3和SVG实现的圆环菜单动画
  9. 膜拜!感谢大佬们赏饭吃,向你们致敬!
  10. 使用 React 要懂的 JavaScript 特性[每日