7

私は最近 Resources$NotFoundException バグをここに投稿し、「gen」フォルダーの削除、クリーンアップ、リフレッシュなどについての通常の一般的な提案を得ました。他の何百人 (何千人?) のプログラマーが同じ例外を取得し、 SO と Web 全体で同じ提案が得られます。しかし、そのエラーが実際に何を意味するのかを誰かが説明している場所を見つけることができないようです。

ドキュメントはあいまいです: http://developer.android.com/reference/android/content/res/Resources.NotFoundException.html

Resources$NotFoundException は実行時エラーであるため、おそらく APK ファイルで何かを探しています。

  1. ビルド時にリソースは APK ファイルにどのように組み込まれますか? XML ファイルから始めて、次に何を...?
  2. 実行時にどのように参照されますか?
  3. デバッガーに表示されるリソース ID と APK ファイルでの識別方法との関係は?
  4. APK ファイルを調べてこれらのリソースを自分で見つけるには、どの (Windows) ツールを使用できますか?

これらの質問への回答を事前にありがとうございます!

PS - 元のバグに対する回答があると思われる場合は、このスレッドではなくそこに投稿してください。これは別の質問です。

4

2 に答える 2

7
  1. リソースは、未加工のアセットから、最適化されたイメージ、パッケージ化されたバイト データまで、さまざまな方法でパッケージ化できます。すべてが 1 つの APK に圧縮されます。Idリソースの発見は、それを取り戻すのに役立ちます。開発中、ビルド ツール ( )は xml や画像などのディレクトリをaapt継続的にスキャンし、 に数値定数を生成します。Android のビルド プロセスの詳細をお読みくださいresR.java

  2. 実行時に、Resourcesどの get メソッドが呼び出されたかに応じて、インスタンスはどこを探すかを決定します。数値idは、リソース マッピングを照会して正しいマッピングを見つけるのに役立ちます。実際のデータの読み込みは、ネイティブの低レベル コードによって処理されます。

  3. デバッガーは、オブジェクトとそのフィールドを表示できます。何が欠けているかを調べるにはNotFoundException、logcat のエラー メッセージ トレースを参照してください。リソース ID の 16 進値をリストします。

  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

リソースが格納されているバイナリ データのメソッド (deflate、stored など) とオフセット、およびそのリソースを取得するためにオフセットの後に読み取るバイト数を示す長さが表示されます。

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たインスタンスの 16 進値が出力されます。Resources

の一部を次に示しR.javaます。

public static int absForceOverflow=0x7f010039;

Id同様の Hex 値が割り当てられていることがわかります。

このエラーを解決できますか?

ビルド ツールがプロジェクトを正常にコンパイルした場合、エラーはそもそも発生しないはずです。プロジェクトのクリーニングまたは再構築以外にできることはあまりありません。これは、ビルド ツールまたはリソース ローダーのバグ、またはデバイス上の apk のデータ破損を表しています。

于 2013-05-21T14:19:28.723 に答える
0
  1. ビルド時にリソースは APK ファイルにどのように組み込まれますか? XML ファイルから始めて、次に何を...?

XML で使用する@+id/か、strings.xml または drawable フォルダーにアイテムを配置するたびに、コンパイラーは/resフォルダー内のすべてのリソースを整数値に変換し、それをR.javaに配置します。

2. How are they referenced at runtime?

リソースは、 R.javaで検索される整数値によって参照されます。

3.デバッガーに表示されるリソース ID と APK ファイルでの識別方法との関係は?

私の理解では、関係はR.javaで開発されたものです。

4.APK ファイルを調べてこれらのリソースを自分で見つけるには、どの (Windows) ツールを使用できますか?

わからない...

これが私の理解から得たすべてです。ここに虚偽の記述がある場合は、私に知らせてください。

于 2013-05-21T14:05:41.723 に答える