Resources $ NotFoundException究竟意味着什么?

时间:2013-05-21 13:58:29

标签: android

我最近发布了一个Resources $ NotFoundException错误here并得到了关于删除“gen”文件夹,干净,刷新等等的通常建议。有数百(数千?)的其他程序员得到相同的例外,并获得相同的建议和网络。但我似乎找不到任何人在哪里描述错误真正意味着

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

资源$ NotFoundException是一个运行时错误,所以可能是在寻找APK文件中的内容。

  1. 如何在构建时将APK资源内置到APK文件中?我们开始 用XML文件然后是什么......?
  2. 如何在运行时引用它们?
  3. 我在中看到的资源ID之间的关系是什么 调试器及其在APK文件中的识别方式?
  4. 我可以使用哪些(Windows)工具检查APK文件以查找这些内容 资源自己?
  5. 提前感谢您回答任何问题!

    PS - 如果你认为你对原始bug有答案,请在那里发帖并到这个帖子;这是一个不同的问题。

2 个答案:

答案 0 :(得分:7)

  1. 资源可以以各种方式打包,从原始资产,优化图像到打包字节数据。全部压缩成一个apk。 Id资源有助于找回资源。在开发过程中,构建工具(aapt)不断扫描res目录中的xml,图像等,并在R.java中生成数字常量。 Read a detail about android's build process

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

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

  4. ApkTool允许您放缩apk文件并重新构建res目录。

  5. <强>更新

    如何打包资源:

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

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

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

2. How are they referenced at runtime?

资源由在 R.java

中查找的整数值引用
  

3.我在调试器中看到的资源ID与它在APK文件中的识别方式之间的关系是什么?

根据我的理解,这种关系是 R.java 中再次发展的关系。

  

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

不确定......

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