web-dev-qa-db-ja.com

/ resディレクトリと/ assetsディレクトリの違い

resディレクトリ内のファイルはR.classからアクセスできますが、アセットはファイルシステムのように動作しますが、一般的に、どちらを使用するのが最適かを知りたいと思います。
解像度と資産の本当の違いを知るのに役立つ人はいますか?

257
Cris

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

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

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

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

274
Ted Hopp

どちらもかなり似ています。 2つの間の主な違いは、resディレクトリで、各ファイルにプリコンパイルされたIDが与えられ、R.id.[res id]から簡単にアクセスできることです。これは、画像、音声、アイコンにすばやく簡単にアクセスするのに便利です...

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

58
DRiFTy

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

from http://developer.Android.com/tools/projects/index.html

assets/

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

res/raw/

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

33
AntonyMCs

重要なポイントは次のとおりです。

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

結論

  1. Android APIには、非常に快適なリソースフレームワークが含まれており、さまざまなモバイルアプリの最も一般的な使用例にも最適化されています。リソースを習得し、可能な限り使用するようにしてください。
  2. ただし、特別な場合により高い柔軟性が必要な場合は、Assetsを使用して、より自由度の高いリソースの整理と処理を可能にする低レベルのAPIを提供します。
9

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

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

4
L.Butz

ファイルシステムのようなアセットを使用して、あらゆる種類のファイルをダンプします。そして、resを使用して、その目的、レイアウト、画像、値を保存します。

1
Bajji

テッド・ホップはこれに非常にうまく答えました。 OpenGLテクスチャおよびシェーダーファイルにres/rawを使用しています。階層的な組織を提供するために、それらをアセットディレクトリに移動することを考えていました。

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

0
dturvene