我最近发布了一个Resources $ NotFoundException错误here并得到了关于删除“gen”文件夹,干净,刷新等等的通常建议。有数百(数千?)的其他程序员得到相同的例外,并获得相同的建议和网络。但我似乎找不到任何人在哪里描述错误真正意味着。
文档含糊不清:http://developer.android.com/reference/android/content/res/Resources.NotFoundException.html
资源$ NotFoundException是一个运行时错误,所以可能是在寻找APK文件中的内容。
提前感谢您回答任何问题!
PS - 如果你认为你对原始bug有答案,请在那里发帖并不到这个帖子;这是一个不同的问题。
答案 0 :(得分:7)
资源可以以各种方式打包,从原始资产,优化图像到打包字节数据。全部压缩成一个apk。 Id
资源有助于找回资源。在开发过程中,构建工具(aapt
)不断扫描res
目录中的xml,图像等,并在R.java
中生成数字常量。 Read a detail about android's build process
在运行时,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,存储等)和offset,以及length,表示在偏移后读取多少字节以获取该资源。
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中的数据损坏。
答案 1 :(得分:0)
- 如何在构建时将APK资源内置到APK文件中?我们从XML文件开始,然后是什么......?
醇>
每当您在XML中使用编译器将转换 / res中的所有资源文件夹到一个整数值,然后放入 R.java 。 @+id/
,或将项目放在strings.xml或您的drawable文件夹中时,
2. How are they referenced at runtime?
资源由在 R.java
中查找的整数值引用3.我在调试器中看到的资源ID与它在APK文件中的识别方式之间的关系是什么?
根据我的理解,这种关系是 R.java 中再次发展的关系。
4.我可以使用哪些(Windows)工具检查APK文件以自行查找这些资源?
不确定......
这就是我从理解中收集到的所有内容。如果这里有任何虚假陈述,请告诉我。