7

我最近在这里发布了一个 Resources$NotFoundException 错误,并得到了关于删除“gen”文件夹、进行清理、刷新等常见的通用建议。有数百(数千?)其他程序员得到相同的异常和在 SO 和网络上得到相同的建议。但我似乎找不到任何人描述该错误真正含义的地方。

文档含糊不清:http: //developer.android.com/reference/android/content/res/Resources.NotFoundException.html

Resources$NotFoundException 是一个运行时错误,因此推测它正在寻找 APK 文件中的某些内容。

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

提前感谢您对这些问题的回答!

PS - 如果您认为您对原始错误有答案,请将其发布在此处而不是此线程;这是一个不同的问题。

4

2 回答 2

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

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

  3. 调试器可以向您显示对象及其字段。要找出缺少的内容,请阅读NotFoundExceptionlogcat 中的错误消息跟踪。它列出了资源 id 的十六进制值。

  4. 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 中的数据损坏。

于 2013-05-21T14:19:28.723 回答
0
  1. 在构建时如何将资源构建到 APK 文件中?我们从 XML 文件开始,然后……?

每当您@+id/在 XML 中使用,或在 strings.xml 或 drawable 文件夹中放置项目时,编译器会将/res文件夹中的所有资源转换为整数值,然后将其放入R.java中。

2. How are they referenced at runtime?

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

3.我在调试器中看到的资源ID和在APK文件中是如何识别的有什么关系?

据我了解,这种关系又是在R.java中开发的。

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

没有把握...

这是我从我的理解中收集到的全部内容。如果这里有任何虚假陈述,请告诉我。

于 2013-05-21T14:05:41.723 回答