深入解析APK:resources.arsc文件结构与解析

4星 · 超过85%的资源 需积分: 47 153 下载量 153 浏览量 更新于2024-07-22 5 收藏 810KB PPTX 举报
"APK XML解析及反编译之resources.arsc" 在Android应用开发中,APK文件是应用程序的打包格式,包含了运行所需的所有组件,包括代码、资源、图片等。resources.arsc文件是APK中的核心资源表,它存储了应用的所有资源ID及其对应的字符串值、类型信息等。本文将详细介绍resources.arsc的结构以及解析方法。 1. resources.arsc文件结构 resources.arsc文件通常由多个部分组成,如包信息(packageCount)、字符串池(stringCount)、样式(styleCount)、标志(flags)等。在提供的内容中,可以看到`packageCount=0x00000001`,这意味着APK只有一个包。`stringCount`和`styleCount`分别表示字符串和样式的数量,`flags`指示字符串池的编码格式,这里是UTF8。 2. 字符串池(ResStringPool_header) 字符串池是resources.arsc中的关键部分,它存储了所有资源字符串。如文段所示,`stringsStart`指定了字符串数据的起始位置,而`stylesStart`为0,表示没有样式数据。`ResStringPool_header`后紧随的是字符串的偏移量数组`m_stringOffsets`,用于快速定位字符串数据。 3. 类型和键字符串池 `typeStrings`和`keyStrings`分别表示资源类型的字符串和资源键的字符串。这些字符串常用于资源引用,例如`R.id.my_button`中的`my_button`就是键字符串。它们各自也有相应的`stringCount`和`stringOffsets`。 4. ResTable_typeSpec和ResTable_typeEntry `ResTable_typeSpec`定义了资源类型,包含一个或多个`ResTable_typeEntry`。每个`ResTable_typeEntry`对应于资源ID的一个类型,如`id=0x01`。`entryCount`表示该类型的资源条目数量,`entry`是一个索引,指向实际的资源数据。 5. 资源ID计算 在Android中,资源ID是32位整数,由三部分组成:公共标识符(public flag)、包标识符(package ID)和类型/入口标识符(type/entry ID)。在示例中,`mResId=0x7F010000`,`0x7F`是包ID,`0x01`是类型ID,`0x0000`是入口ID。资源ID的计算公式是`(0xff000000&mResId)|id<<16`,确保了正确的资源定位。 6. 解析与反编译 解析resources.arsc文件通常涉及读取其二进制格式,并将数据转换为可读的文本形式。这涉及到对字符串池、类型和键字符串池以及资源表的解码。反编译过程则进一步将XML资源文件恢复到原始格式,便于开发者查看和修改。 7. 工具与应用 Android社区提供了多种工具进行APK的反编译,如Apktool、dex2jar、JD-GUI等,它们可以帮助开发者分析APK的内部结构,包括resources.arsc,这对于调试、逆向工程和二次开发具有重要意义。 resources.arsc是Android APK中的核心资源文件,包含了应用的所有资源定义。理解其结构和解析机制对于深入理解Android应用的工作原理、调试和优化都至关重要。通过专门的工具和方法,我们可以有效地解析和反编译resources.arsc,以进行更细致的应用分析和修改。
2021-04-02 上传

D:\zzz_aotjs>java -jar apktool.jar d zzz_jjtx.apk -o jjtxApk I: Using Apktool 2.5.0 on zzz_jjtx.apk I: Loading resource table... I: Decoding AndroidManifest.xml with resources... I: Loading resource table from file: C:\Users\Administrator\AppData\Local\apktool\framework\1.apk I: Regular manifest package... I: Decoding file-resources... I: Decoding values */* XMLs... I: Baksmaling classes.dex... I: Baksmaling classes2.dex... I: Copying assets and libs... I: Copying unknown files... I: Copying original files... D:\zzz_aotjs>java -jar apktool.jar b jjtxApk I: Using Apktool 2.5.0 I: Checking whether sources has changed... I: Smaling smali folder into classes.dex... I: Checking whether sources has changed... I: Smaling smali_classes2 folder into classes2.dex... I: Checking whether resources has changed... I: Building resources... W: invalid resource directory name: D:\zzz_aotjs\jjtxApk\res navigation brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1): [C:\Users\ADMINI~1\AppData\Local\Temp\brut_util_Jar_88738392895362090968935970785959065127.tmp, p, --forced-package-id, 127, --min-sdk-version, 21, --target-sdk-version, 28, --version-code, 23053102, --version-name, 1.0.2, --no-version-vectors, -F, C:\Users\ADMINI~1\AppData\Local\Temp\APKTOOL7172915232282895038.tmp, -e, C:\Users\ADMINI~1\AppData\Local\Temp\APKTOOL4592746138281254561.tmp, -0, arsc, -I, C:\Users\Administrator\AppData\Local\apktool\framework\1.apk, -S, D:\zzz_aotjs\jjtxApk\res, -M, D:\zzz_aotjs\jjtxApk\AndroidManifest.xml] D:\zzz_aotjs>

2023-06-02 上传