285

アセットがファイルシステムのように動作resしている間、ディレクトリ内のファイルにアクセスできることは知っていますが、一般的に、どちらを使用するのが最適なのかを知りたいです。 res と assets の本当の違いを知るのを手伝ってくれる人はいますか?R.class

4

8 に答える 8

301

ここで説明するように、リソースを使用すると、さまざまな言語、OSバージョン、画面の向きなどの代替を提供するためのサポートが組み込まれています。そのどれもアセットでは利用できません。また、APIの多くの部分は、リソース識別子の使用をサポートしています。最後に、リソースの名前は、コンパイル時にチェックされる定数フィールド名に変換されるため、コードとリソース自体の不一致の可能性が少なくなります。それは資産には当てはまりません。

では、なぜアセットフォルダがあるのでしょうか。実行時に使用するアセットを計算する場合は、非常に簡単です。リソースを使用する場合は、使用される可能性のあるすべてのリソースIDのリストを宣言し、リストへのインデックスを計算する必要があります。(これはちょっと厄介で、開発サイクルでリソースのセットが変更された場合にエラーが発生する可能性があります。)(編集:を使用して名前でリソースIDを取得できますがgetIdentifier、コンパイル時のチェックの利点が失われます。)また、リソースでサポートされていないフォルダー階層に編成されます。これは、データを管理する別の方法です。リソースはほとんどの場合をカバーしますが、アセットは時折使用されます。

もう1つの違いは、ライブラリプロジェクトで定義されたリソースが、ライブラリに依存するアプリケーションプロジェクトに自動的にインポートされることです。資産の場合、それは起こりません。アセットファイルは、アプリケーションプロジェクトのアセットディレクトリに存在する必要があります。[編集:Androidの新しいGradleベースのビルドシステム(Android Studioで使用)では、これはもはや真実ではありません。/assetsライブラリプロジェクトのアセットディレクトリは.aarファイルにパッケージ化されているため、ライブラリプロジェクトで定義されたアセットはアプリケーションプロジェクトにマージされます(したがって、参照ライブラリにある場合は、アプリケーションのディレクトリに存在する必要はありません)。]

編集:アプリにカスタムフォントをパッケージ化する場合は、さらに別の違いが生じます。ファイルシステムまたはアプリのディレクトリに保存されているフォントファイルからを作成するためのAPI呼び出しがあります。ただし、ディレクトリに保存されているフォントファイルから(またはディレクトリの使用を許可するから)を作成するためのAPIはありません。[注: Android O(現在アルファプレビューで利用可能)を使用すると、リソースとしてカスタムフォントを含めることができます。この長い間延期されていた機能の説明をここで参照してください。ただし、最小APIレベルが25以下である限り、カスタムフォントをリソースとしてではなくアセットとしてパッケージ化する必要があります。]Typefaceassets/Typefaceres/InputStreamres/

于 2011-04-07T15:41:04.410 に答える
71

どちらもよく似ています。この 2 つの実際の主な違いは、ディレクトリ内の各ファイルには、 から簡単にアクセスできるresコンパイル済みファイルが与えられていることです。これは、画像、サウンド、アイコンにすばやく簡単にアクセスするのに便利です...IDR.id.[res id]

ディレクトリはファイルシステムに似ており、assets好きなファイルを自由に配置できます。その後、Java を介して任意のファイル システム内の任意のファイルにアクセスする場合と同様に、そのシステム内の各ファイルにアクセスできます。このディレクトリは、ゲームの詳細、辞書などに適しています。それが役立つことを願っています。

于 2011-04-07T15:34:45.390 に答える
41

これが古いことは知っていますが、明確にするために、Androidの公式ドキュメントにそれぞれの説明があります。

http://developer.android.com/tools/projects/index.htmlから

assets/

これは空です。これを使用して、未加工のアセット ファイルを保存できます。ここで保存したファイルはそのまま .apk ファイルにコンパイルされ、元のファイル名が保持されます。URI を使用して一般的なファイル システムと同じ方法でこのディレクトリをナビゲートし、AssetManager を使用してファイルをバイト ストリームとして読み取ることができます。たとえば、これはテクスチャやゲーム データに適した場所です。

res/raw/

任意の未加工アセット ファイル用。assets/ ディレクトリの代わりにここにアセット ファイルを保存することは、それらにアクセスする方法のみが異なります。これらのファイルは aapt によって処理され、R クラスのリソース識別子を使用してアプリケーションから参照する必要があります。たとえば、これは MP3 や Ogg ファイルなどのメディアに適しています。

于 2013-07-23T17:29:37.113 に答える
14

重要なポイントを次に示します。

  1. Raw ファイルには有効な Java 識別子である名前が必要ですが、アセット内のファイルには場所と名前の制限はありません。つまり、任意のディレクトリにグループ化できます
  2. Raw ファイル Java や xml から簡単に参照できます (つまり、マニフェストや他の xml ファイルから raw ファイルを参照できます)。
  3. assets/ ディレクトリの代わりにここにアセット ファイルを保存することは、 http://developer.android.com/tools/projects/index.htmlに記載されているように、それらにアクセスする方法のみが異なります。
  4. ライブラリ プロジェクトで定義されたリソースは、ライブラリに依存するアプリケーション プロジェクトに自動的にインポートされます。資産の場合、それは起こりません。アセット ファイルは、アプリケーション プロジェクトの assets ディレクトリに存在する必要があります。
  5. assets ディレクトリはファイルシステムに似ており、そこに好きなファイルを自由に配置できます。その後、Java を介して任意のファイル システム内の任意のファイルにアクセスする場合と同様に、そのシステム内の各ファイルにアクセスできます。ゲームデータファイル、フォント、テクスチャなど。
  6. Resources とは異なり、Assets は assets ディレクトリ内のサブフォルダーに編成できます。ただし、Asset でできることは、入力ストリームを取得することだけです。したがって、文字列やビットマップをアセットに保存することはあまり意味がありませんが、入力修正辞書やゲーム マップなどのカスタム形式のデータを保存することはできます。
  7. Raw は R.java ファイルを生成することでコンパイル時のチェックを行うことができますが、データベースをプライベート ディレクトリにコピーする場合は、ストリーミング用に作成されたアセットを使用できます。

結論

  1. Android API には、さまざまなモバイル アプリのほとんどの典型的なユース ケースにも最適化された、非常に快適な Resources フレームワークが含まれています。リソースをマスターし、可能な限りそれらを使用するようにしてください。
  2. ただし、特殊なケースでさらに柔軟性が必要な場合は、より自由度の高いリソースの編成と処理を可能にする下位レベルの API を提供するアセットがあります。
于 2014-04-23T06:22:55.943 に答える
4

Java コードのどこかでそれらを参照する必要がある場合は、ファイルを「res」ディレクトリに配置する必要があります。

また、res フォルダー内のすべてのファイルは R ファイルでインデックス化されるため、それらのファイルの読み込みがはるかに高速 (かつ簡単!) になります。

于 2011-04-07T15:32:35.437 に答える
0

テッド・ホップはこれに非常にうまく答えました。私は、opengl テクスチャとシェーダー ファイルに res/raw を使用しています。それらを資産ディレクトリに移動して、階層構造を提供することを考えていました。

このスレッドは、そうしないように私に確信させました。まず、一意のリソース ID を使用するのが好きだからです。2 つ目は、InputStream/openRawResource または BitmapFactory を使用してファイルを読み込むのは非常に簡単だからです。3 つ目は、ポータブル ライブラリで使用できると非常に便利だからです。

于 2014-04-03T17:13:58.487 に答える
-5

アセットは、テキスト、xml、フォント、音楽、ビデオなどの任意のファイルをアプリケーションに含める方法を提供します。これらのファイルを「リソース」として含めようとすると、Android はそれらをリソース システムに処理し、生データを取得できなくなります。手つかずのデータにアクセスしたい場合、アセットはそれを行う 1 つの方法です。

于 2013-07-20T16:37:43.013 に答える