资源可以以各种方式打包,从原始资产到优化的图像再到打包的字节数据。全部压缩到一个 apk 中。Id
资源是什么有助于找回它。在开发过程中,构建工具 ( aapt
) 不断扫描res
目录中的 xml、图像等,并在R.java
. 阅读有关 android 构建过程的详细信息。
在运行时,Resources
实例决定在哪里查找,具体取决于是否调用了它的哪个 get 方法。数字id
帮助它查询资源映射并找到正确的映射。实际数据加载由本机低级代码处理。
调试器可以向您显示对象及其字段。要找出缺少的内容,请阅读NotFoundException
logcat 中的错误消息跟踪。它列出了资源 id 的十六进制值。
ApkTool可让您压缩apk
文件并重新构建res
目录。
更新:
资源如何打包:
如果您有一个 apk 并希望aapt
在 SDK 中查看完整的资源表运行工具:
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
您将在存储资源的二进制数据中看到方法(放气、存储等)和偏移量,以及长度,它表示在偏移量之后要读取多少字节才能获得该资源。
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));
}
因此,它打印请求加载Id
哪个实例的十六进制值。Resources
这是其中的一部分R.java
:
public static int absForceOverflow=0x7f010039;
您可以看到Id
分配了类似的十六进制值。
我可以解决这个错误吗?
如果构建工具成功编译了您的项目,则首先不应发生该错误。除了清理或重建项目之外,您无能为力。这表示构建工具或资源加载器中的错误或设备上 apk 中的数据损坏。