背景
使用 jadx 反编译工具或者是 android studio IDE 都无法查看 Android framework-res.apk 中 resources.arsc 的配置内容详情。

为什么 jadx 无法:
是 系统资源包,它里边的
framework-res.apk
很多时候经过了 非标准编译/压缩(Sparse Encoding、二进制优化),跟第三方 App 不太一样(可能还有压缩优化),Jadx 面向的是反编译 App 而不是系统包,所以常失败。Android 10 之后
resources.arsc
结构有所变化,很多通用的反编译工具(特別是面向 App 的 Jadx)都不能正确解析系统 framework 资源。它的
resources.arsc
结构用 apktool/aapt2 这种专门的资源解析工具可以避免这个坑
resources.arsc
代码编译逻辑
framework-res.apk 资源应用介绍:Android device/xxx/system/common/overlay 编译产物介绍与验证https://blog.csdn.net/qq_38666896/article/details/139789004
Android 源码树里 frameworks/base 模块的资源目录,它是系统 Framework 层的默认资源包的一部分。
下的 XML/图片等资源会在 Android 编译时被
frameworks/base/core/res/res/…
编进一个专门的
aapt
包里面。这个
framework-res.apk
是系统启动时由
framework-res.apk
加载的,它包含了所有
/system/framework/framework-res.apk
的字符串、布局、样式等。如
android.R.*
是一个带有 MCC/MNC 限定符的资源目录,表示这是一组针对特定国家码 (Mobile Country Code) 460 和网络码 (Mobile Network Code) 01 的资源覆盖文件。比如 MCC 460 对应塞尔维亚等地区,MNC 01 是具体的运营商代码。系统开机检测到 SIM 卡的 MCC/MNC 匹配时,会优先加载这一目录里的资源来替换默认 values/ 里的同名资源。
values-mcc460-mnc01
如需验证,可以解包
查找 assets/resources.arsc 里对应的字符串内容。这样就能确认修改的内容是否编译进去了。
out/target/product/<device>/system/framework/framework-res.apk
另外,framework-res.apk是支持模块单编的:
make framwork-res #对应模块名

解决方案
使用 appt 解包 dump
aapt2 dump resources framework-res.apk | grep -i 目标字符串
Note:
是 AOSP 自带的编译工具,它可以正确解析新格式的
aapt2
。另外也可以使用 apktool 进行解包
resources.arsc
Output Example:

单独字符串输出的时候,基本看不到 overlay 针对 MCCMNC的配置,那么可以将输出值打印到本地文本便于查看。
比如下面是查找到 config_mobile_mtu 对 SIM 的差异化资源 overlay 整型值:

工具匹配
直接在 cmd 桌面路径窗口执行appt会有问题,是因为 appt 并不是全局变量。


Q:那么如何找到 appt 呢?
A1:如果有 Android SDK → 在
目录里能找到
build-tools/<版本>/aapt2(.exe)

A2:如果是自己编译 AOSP → 在
里
out/soong/host/linux-x86/bin/aapt2
如果不想配置环境,可以:
1. 将 apk 和 appt2.exe 放置在目录(),直接执行 appt2。

2. 不移动任何apk和exe,使用绝对路径执行 appt 分析apk
总之就是路径和命令相结合。