Resources $ NotFoundException是什么意思?

我最近在这里发布了一个Resources $ NotFoundException的错误,并得到了关于删除“gen”文件夹,做一个干净的,做一个刷新等等的常见的一般性build议。有数百(数千?)的其他程序员得到相同的exception得到和所有的相同的build议和networking。 但我似乎无法find任何人描述这个错误真正意义的地方

该文档是模糊的: http : //developer.android.com/reference/android/content/res/Resources.NotFoundException.html

资源$ NotFoundException是一个运行时错误,所以大概是在找APK文件中的东西。

  1. 在构build时如何将资源内置到APK文件中? 我们从XML文件开始,然后是什么…?
  2. 它们在运行时如何被引用?
  3. 在debugging器中看到的资源ID与在APK文件中如何识别资源ID之间有什么关系?
  4. 我可以使用哪些(Windows)工具来检查APK文件以自己查找这些资源?

预先感谢任何这些问题的答案!

PS – 如果你认为你有一个原始错误的答案请张贴在那里,而不是这个线程; 这是一个不同的问题。

Solutions Collecting From Web of "Resources $ NotFoundException是什么意思?"

  1. 资源可以通过各种方式从原始资源打包到优化的图像打包的字节数据。 全部压缩成一个apk。 一个资源的Id是什么帮助找回它。 在开发过程中,构build工具( aapt )不断扫描res目录中的xml,图像等,并在R.java生成数字常量。 阅读关于android构build过程的细节 。

  2. 在运行时, Resources实例决定在哪里查找,具体取决于是否调用哪个get方法。 数字id有助于查询资源映射并find正确的资源映射。 实际的数据加载是由本地低级代码处理的。

  3. debugging器可以显示对象及其字段。 要找出缺less的东西,请在logcat中读取错误消息NotFoundException痕迹。 它列出资源ID的hex值。

  4. ApkTool让你压缩一个apk文件并重新构buildres目录。

更新:

如何打包资源:

如果你有一个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 

你会看到存储资源的二进制数据的方法(放气,存储等)和偏移量,以及表示在获得该资源后偏移了多less字节的长度。

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实例的Idhex值。

R.java的一部分:

 public static int absForceOverflow=0x7f010039; 

你可以看到Id被分配了类似的hex值。

我能解决这个错误吗?

如果构build工具编译成功, 则不应该首先发生错误。 除了清理或重build项目外,没有什么可以做的了。 这代表了构build工具或资源加载器或设备上的apk数据损坏的错误。

  1. 在构build时如何将资源内置到APK文件中? 我们从XML文件开始,然后是什么…?

无论何时在XML中使用@+id/或将项目置于strings.xml或可绘制文件夹中,编译器都会将/ res文件夹中的所有资源转换为整数值,然后将其放入R.java中

 2. How are they referenced at runtime? 

这些资源由在R.java中查找的整数值引用

3.我在debugging器中看到的资源ID与APK文件中如何识别资源ID之间的关系是什么?

根据我的理解,这个关系就是在R.java中再次发展起来的关系。

4.我可以使用什么(Windows)工具检查APK文件以自己查找这些资源?

不确定…

这是我从我的理解中得到的一切。 如果在这里有任何虚假的陈述,那么请告诉我。