webentwicklung-frage-antwort-db.com.de

Unterschied zwischen den Verzeichnissen / res und / assets

Ich weiß, dass auf Dateien im Verzeichnis res über R.class Zugegriffen werden kann, während sich Assets wie ein Dateisystem verhalten, aber ich möchte im Allgemeinen wissen, wann es am besten ist, das eine oder das andere zu verwenden.
Kann mir jemand helfen, die tatsächlichen Unterschiede zwischen res und asset zu erkennen?

259
Cris

Bei den Ressourcen ist die Unterstützung für die Bereitstellung von Alternativen für verschiedene Sprachen, Betriebssystemversionen, Bildschirmausrichtungen usw. integriert, wie beschrieben hier . Nichts davon ist mit Assets verfügbar. Außerdem unterstützen viele Teile der API die Verwendung von Ressourcen-IDs. Schließlich werden die Namen der Ressourcen in konstante Feldnamen umgewandelt, die zum Zeitpunkt der Kompilierung überprüft werden, sodass die Möglichkeit von Inkongruenzen zwischen dem Code und den Ressourcen selbst geringer ist. Nichts davon gilt für Vermögenswerte.

Warum also überhaupt einen Assets-Ordner? Wenn Sie das Asset berechnen möchten, das Sie zur Laufzeit verwenden möchten, ist dies ziemlich einfach. Bei Ressourcen müssten Sie eine Liste aller Ressourcen-IDs deklarieren, die möglicherweise verwendet werden, und einen Index in der Liste berechnen. (Dies ist etwas umständlich und führt zu Fehlern, wenn sich die Ressourcen im Entwicklungszyklus ändern.) (BEARBEITEN: Mit getIdentifier können Sie eine Ressourcen-ID anhand des Namens abrufen Dies verliert jedoch die Vorteile der Prüfung zur Kompilierungszeit.) Assets können auch in einer Ordnerhierarchie organisiert werden, die nicht von Ressourcen unterstützt wird. Es ist eine andere Art, Daten zu verwalten. Obwohl Ressourcen die meisten Fälle abdecken, werden sie gelegentlich verwendet.

Ein weiterer Unterschied: In einem Bibliotheksprojekt definierte Ressourcen werden automatisch in Anwendungsprojekte importiert, die von der Bibliothek abhängig sind. Bei Assets passiert das nicht. Asset-Dateien müssen im Asset-Verzeichnis des Anwendungsprojekts (der Anwendungsprojekte) vorhanden sein. [BEARBEITEN: Mit dem neuen Gradle-basierten Build-System von Android (verwendet mit Android Studio)) ist dies nicht mehr der Fall. Asset-Verzeichnisse für Bibliotheksprojekte werden in gepackt Die .aar-Dateien, also in Bibliotheksprojekten definierte Assets, werden zu Anwendungsprojekten zusammengeführt (sie müssen also nicht im Verzeichnis /assets der Anwendung vorhanden sein, wenn sie sich in einer Bibliothek befinden, auf die verwiesen wird).

BEARBEITEN: Ein weiterer Unterschied ergibt sich, wenn Sie eine benutzerdefinierte Schriftart mit Ihrer App packen möchten. Es gibt API-Aufrufe zum Erstellen eines Typeface aus einer Schriftartdatei, die im Dateisystem oder im Verzeichnis assets/ Ihrer App gespeichert ist. Es gibt jedoch keine API zum Erstellen eines Typeface aus einer Schriftartdatei, die im Verzeichnis res/ Gespeichert ist (oder aus einem InputStream, das die Verwendung des res/ Verzeichnis). [ HINWEIS: Mit Android O (jetzt in der Alpha-Vorschau verfügbar) können Sie benutzerdefinierte Schriftarten als Ressourcen hinzufügen Siehe die Beschreibung hier dieser längst überfälligen Funktion. Solange Ihre Mindest-API-Stufe 25 oder weniger beträgt, müssen Sie benutzerdefinierte Schriftarten nicht als Ressourcen, sondern als Ressourcen verpacken.]

275
Ted Hopp

Beide sind ziemlich ähnlich. Der eigentliche Hauptunterschied zwischen den beiden besteht darin, dass jede Datei im Verzeichnis res ein vorkompiliertes ID erhält, auf das mit R.id.[res id] Problemlos zugegriffen werden kann. Dies ist nützlich, um schnell und einfach auf Bilder, Sounds, Symbole ... zuzugreifen.

Das assets -Verzeichnis ähnelt eher einem Dateisystem und bietet mehr Freiheit, alle gewünschten Dateien dort abzulegen. Sie können dann auf jede der Dateien in diesem System wie beim Zugriff auf eine beliebige Datei in einem beliebigen Dateisystem über Java zugreifen. Dieses Verzeichnis eignet sich beispielsweise für Spieledetails, Wörterbücher usw. Ich hoffe, das hilft.

60
DRiFTy

Ich weiß, dass dies alt ist, aber um es klar zu machen, gibt es in der offiziellen Android Dokumentation:

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

assets/

Das ist leer. Sie können es zum Speichern von Rohdaten-Dateien verwenden. Dateien, die Sie hier speichern, werden unverändert in eine APK-Datei kompiliert, und der ursprüngliche Dateiname bleibt erhalten. Sie können in diesem Verzeichnis wie in einem typischen Dateisystem mithilfe von URIs navigieren und Dateien mit AssetManager als Byte-Datenstrom lesen. Dies ist beispielsweise ein guter Ort für Texturen und Spieldaten.

res/raw/

Für beliebige Rohdatenbestandsdateien. Das Speichern von Asset-Dateien hier statt im Verzeichnis assets/unterscheidet sich nur darin, wie Sie darauf zugreifen. Diese Dateien werden von aapt verarbeitet und müssen mithilfe einer Ressourcen-ID in der R-Klasse aus der Anwendung referenziert werden. Dies ist beispielsweise ein guter Ort für Medien wie MP3- oder Ogg-Dateien.

35
AntonyMCs

Im Folgenden sind einige wichtige Punkte aufgeführt:

  1. RAW-Dateien müssen gültige Namen haben Java Bezeichner, wohingegen Dateien in Assets keine Speicherort- und Namensbeschränkungen haben. Mit anderen Worten, sie können in beliebigen Verzeichnissen gruppiert werden
  2. Raw-Dateien sind sowohl von Java als auch von xml aus leicht zu referenzieren (d. H. Sie können eine Raw-Datei aus Manifest- oder einer anderen xml-Datei referenzieren).
  3. Das Speichern von Asset-Dateien hier statt im Verzeichnis assets/unterscheidet sich nur darin, wie hier dokumentiert auf sie zugegriffen wird http://developer.Android.com/tools/projects/index.html .
  4. In einem Bibliotheksprojekt definierte Ressourcen werden automatisch in Anwendungsprojekte importiert, die von der Bibliothek abhängen. Bei Assets passiert das nicht. Asset-Dateien müssen im Asset-Verzeichnis des Anwendungsprojekts (der Anwendungsprojekte) vorhanden sein.
  5. Das Assets-Verzeichnis ähnelt eher einem Dateisystem und bietet mehr Freiheit, alle gewünschten Dateien dort abzulegen. Sie können dann auf jede der Dateien in diesem System wie beim Zugriff auf eine beliebige Datei in einem beliebigen Dateisystem über Java. Wie Spieledatendateien, Schriftarten, Texturen usw. zugreifen.
  6. Im Gegensatz zu Ressourcen können Assets im Assets-Verzeichnis in Unterordnern organisiert werden. Mit einem Asset können Sie jedoch nur einen Eingabestream abrufen. Aus diesem Grund ist es nicht sinnvoll, Ihre Zeichenfolgen oder Bitmaps in Assets zu speichern. Sie können jedoch Daten im benutzerdefinierten Format wie Eingabekorrekturwörterbücher oder Spielekarten speichern.
  7. Mit Raw können Sie die Kompilierzeit überprüfen, indem Sie eine R.Java-Datei erstellen. Wenn Sie Ihre Datenbank jedoch in ein privates Verzeichnis kopieren möchten, können Sie Assets verwenden, die für das Streaming erstellt wurden.

Fazit

  1. Die Android-API enthält ein sehr komfortables Ressourcen-Framework, das auch für die meisten typischen Anwendungsfälle für verschiedene mobile Apps optimiert ist. Sie sollten Ressourcen beherrschen und versuchen, sie zu verwenden, wo immer dies möglich ist.
  2. Wenn Sie jedoch mehr Flexibilität für Ihren speziellen Fall benötigen, bieten Ihnen Assets eine API auf niedrigerer Ebene, mit der Sie Ihre Ressourcen mit einem höheren Freiheitsgrad organisieren und verarbeiten können.
9

Wenn Sie sie irgendwo im Java Code referenzieren müssen, sollten Sie Ihre Dateien rahter in das "res" -Verzeichnis stellen.

Alle Dateien im Ordner res werden in der R-Datei indiziert, wodurch das Laden erheblich beschleunigt (und vereinfacht) wird.

4
L.Butz

Verwenden Sie Assets wie ein Dateisystem, um alle Arten von Dateien zu sichern. Und verwende res, um zu speichern, wofür es gemacht wurde, Layouts, Bilder, Werte.

1
Bajji

Ted Hopp hat das ganz nett beantwortet. Ich habe res/raw für meine OpenGL-Textur- und Shader-Dateien verwendet. Ich dachte darüber nach, sie in ein Asset-Verzeichnis zu verschieben, um eine hierarchische Organisation bereitzustellen.

Dieser Thread hat mich überzeugt, nicht zu. Erstens, weil ich die Verwendung einer eindeutigen Ressourcen-ID mag. Zweitens, weil es sehr einfach ist, InputStream/openRawResource oder BitmapFactory zum Einlesen der Datei zu verwenden. Drittens, weil es sehr nützlich ist, in einer tragbaren Bibliothek verwendet zu werden.

0
dturvene