【Android笔记】Apktool 回编出现 “找不到 lStar 属性” 错误时可能的解决方法

6 阅读2分钟

前情提要

在使用 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 而引入的。

解决过程

我查询并尝试了以下方式,均未有效解决问题:

  1. 升级 Apktool 到最新版本;
  2. 回编时指定高于 API 31 的 framework 版本;
  3. 将报错文件中的 @android 替换为 @*android;
  4. 直接删除 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),重新回编试试。