资源可以以各种方式打包,从原始资产到优化图像到打包的字节数据。所有这些都压缩成一个 apk 文件。资源的 id
是帮助找回它的关键。在开发过程中,构建工具 (aapt
) 不断扫描 res
目录中的 xml、图像等,并在 R.java
中生成数字常量。有关 Android 构建过程的详细信息,请参阅此处。
运行时,Resources
实例根据调用其哪个 get 方法来决定在哪里查找。数字 id
帮助它查询资源映射并找到正确的资源。实际数据加载由本地低级代码处理。
调试器可以显示对象及其字段。要找出缺少了什么,请读取 logcat 中的 NotFoundException
跟踪错误消息。它列出了资源 id 的十六进制值。
ApkTool 可让您解压缩 apk 文件并重建 res
目录。
更新:
资源如何打包:
如果您有一个 apk 文件并想查看完整的资源表,请在 SDK 中运行 aapt
工具,例如:
aapt list -v myApp.apk
它将显示以下细节:
Archive: ./myApp.apk
Length Method Size Ratio Offset Date Time CRC-32 Name
-------- ------ ------- ----- ------- ---- ---- ------ ----
468 Deflate 228 51% 0 11-07-12 23:25 29fb0660 res/color/abs__primary_text_disable_only_holo_dark.xml
468 Deflate 228 51% 332 11-07-12 23:25 bae4791a res/color/abs__primary_text_disable_only_holo_light.xml
2942 Stored 2942 0% 280417 10-27-12 16:52 9b5af43b res/drawable-xhdpi/ic_mus.png
2330 Stored 2330 0% 283418 10-27-12 16:52 21f5ba4d res/drawable-xhdpi/ic_pic.png
1556 Stored 1556 0% 285810 10-27-12 16:52 31c3402b res/drawable-xhdpi/ic_vid.png
你可以在二进制数据中看到存储资源的方法(deflate、stored等)和偏移量,长度表示在偏移量之后读取多少字节才能获取该资源。
Resources.NotFoundException 打印什么信息:
下面是生成它的代码:
public void getValue(int id, TypedValue outValue, boolean resolveRefs)
throws NotFoundException {
boolean found = mAssets.getResourceValue(id, 0, outValue, resolveRefs);
if (found) {
return;
}
throw new NotFoundException("Resource ID #0x"
+ Integer.toHexString(id));
}
因此,它将打印出请求Resources
实例加载的Id
的十六进制值。
下面是R.java
的一部分:
public static int absForceOverflow=0x7f010039;
你可以看到
Id
被分配了类似的十六进制值。
我能解决这个错误吗?
如果编译工具成功编译了您的项目,则不应首先出现此错误。除了清理或重新构建项目外,您无法做太多事情。这代表了构建工具或资源加载器中的错误或设备上apk的数据损坏。