前情提要
在使用 Apktool 对 apk 进行反编译后,发现即便没有修改任何内容直接进行回编,依然出现了错误,检查控制台输出日志发现输出了这样的错误日志:
E:\outputs\myapp\res\color-v31\xxx.xml:4:
error: No resource identifier found for attribute 'lStar' in package 'android'
或是这样的日志:
Unresolved attr reference: ns=android, name=lStar, id=0x01010647
问题分析
这是 Apktool 在回编处理资源时,识别不了 color 资源目录中的 'lStar' 属性而产生的错误,而 'lStar' 是 Android 12(API 31)引入的动态颜色属性,应该是我在源工程中使用了 Material 3 而引入的。
解决过程
我查询并尝试了以下方式,均未有效解决问题:
- 升级 Apktool 到最新版本;
- 回编时指定高于 API 31 的 framework 版本;
- 将报错文件中的 @android 替换为 @*android;
- 直接删除 res/colors-v31 目录。
即便方式 3 或 4 能绕过报错,也难以保证应用在运行时不会出现问题。
问题的根源在于 'lStar' 是 API 31 引入的属性,需要较新版本的 Apktool 才能支持。然而,在使用最新工具并指定高版本 framework 后,回编依然报错。
进一步排查发现,Apktool 的缓存目录(默认路径:C:\Users\用户名\AppData\Local\apktool\framework)中有一个创建日期非常古早的 1.apk 框架文件,相当于 Apktool 的解析字典,包含解析编译过程中的资源属性。推测有可能该缓存文件过于老旧,无法识别新属性,因此我尝试删除该缓存,让新版 Apktool 在下次编译时自动生成新的框架文件,这次问题解决了。
总结
当回编 apk 过程中出现类似 error: No resource identifier found for attribute 'lStar' in package 'android' 的错误,即无法识别的资源属性,在尝试其他方式无果时,不妨试试升级 Apktool 工具并清理 framework 框架文件缓存(默认路径:C:\Users\用户名\AppData\Local\apktool\framework),重新回编试试。