Unterschied zwischen / res und / Assets-Verzeichnissen


266

Ich weiß, dass auf Dateien im resVerzeichnis zugegriffen werden kann, R.classwährend sich Assets wie ein Dateisystem verhalten, aber ich möchte im Allgemeinen wissen, wann es am besten ist, das eine und das andere zu verwenden.
Kann mir jemand helfen, die wirklichen Unterschiede zwischen Res und Assets zu erkennen?

Antworten:


284

Mit den Ressourcen ist die Unterstützung für die Bereitstellung von Alternativen für verschiedene Sprachen, Betriebssystemversionen, Bildschirmausrichtungen usw. integriert, wie hier beschrieben . Nichts davon ist mit Vermögenswerten 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 beim Kompilieren überprüft werden, sodass die Wahrscheinlichkeit von Fehlanpassungen 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 möglicherweise verwendeten Ressourcen-IDs deklarieren und einen Index in die Liste berechnen. (Dies ist etwas umständlich und führt zu Fehlermöglichkeiten, wenn sich die Ressourcen im Entwicklungszyklus ändern.) (BEARBEITEN: Sie können eine Ressourcen-ID mit Namen abrufen getIdentifier, dies verliert jedoch die Vorteile der Überprüfung zur Kompilierungszeit.) Assets können auch in einer Ordnerhierarchie organisiert sein, die von Ressourcen nicht unterstützt wird. Es ist eine andere Art, Daten zu verwalten. Obwohl Ressourcen die meisten Fälle abdecken, werden Vermögenswerte gelegentlich verwendet.

Ein weiterer Unterschied: In einem Bibliotheksprojekt definierte Ressourcen werden automatisch in Anwendungsprojekte importiert, die von der Bibliothek abhängen. Bei Vermögenswerten passiert das nicht. Asset-Dateien müssen im Assets-Verzeichnis 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 die .aar-Dateien gepackt, sodass in Bibliotheksprojekten definierte Assets in Anwendungsprojekte zusammengeführt werden (sodass sie nicht im Anwendungsverzeichnis vorhanden sein müssen, /assetswenn sie sich in einer referenzierten Bibliothek befinden).]

BEARBEITEN: Ein weiterer Unterschied ergibt sich, wenn Sie eine benutzerdefinierte Schriftart in Ihre App packen möchten. Es gibt API-Aufrufe zum Erstellen einer Typefaceaus einer im Dateisystem oder im assets/Verzeichnis Ihrer App gespeicherten Schriftartdatei . Es gibt jedoch keine API zum Erstellen einer Typefaceaus einer im res/Verzeichnis gespeicherten Schriftartdatei (oder aus einer InputStream, die die Verwendung des res/Verzeichnisses ermöglichen würde). [ HINWEIS: Mit Android O (jetzt in der Alpha-Vorschau verfügbar) können Sie benutzerdefinierte Schriftarten als Ressourcen hinzufügen. Siehe die Beschreibung hier diese längst überfälligen Funktion. Solange Ihre Mindest-API-Stufe 25 oder weniger beträgt, müssen Sie sich jedoch daran halten, benutzerdefinierte Schriftarten als Assets und nicht als Ressourcen zu verpacken.]


1
ressteht für Ressourcen, wofür assetssteht dann?
Vivek Warde

40
@vwvwvwvwvwvwvwvwvw - Ähm ... es "steht" für nichts; es bedeutet einfach "Vermögenswerte" (wie im Plural des englischen Wortes " Aktiva : eine nützliche oder wertvolle Sache" ).
Ted Hopp

1
Ist es möglich, in die Dateien im raw/Verzeichnis zu schreiben ?
Prinz

6
@Prince - Nein. Alles in den /resVerzeichnissen und '/ Assets' ist schreibgeschützt, da sie in der APK-Datei gepackt sind.
Ted Hopp

Können wir die Apk-Datei in den Assets-Ordner legen und wenn der Benutzer auf diese Benutzeroberfläche klickt, diese Apk installieren?
Vivek Mishra

63

Beide sind ziemlich ähnlich. Der eigentliche Hauptunterschied zwischen beiden besteht darin, dass resjede Datei im Verzeichnis eine vorkompilierte Datei erhält, auf ID die problemlos zugegriffen werden kann R.id.[res id]. Dies ist nützlich, um schnell und einfach auf Bilder, Sounds, Symbole ... zuzugreifen.

Das assetsVerzeichnis ähnelt eher einem Dateisystem und bietet mehr Freiheit, um beliebige Dateien dort abzulegen. Sie können dann auf jede der Dateien in diesem System zugreifen, wie Sie es tun würden, wenn Sie über Java auf eine Datei in einem beliebigen Dateisystem zugreifen. Dieses Verzeichnis ist gut für Dinge wie Spieldetails, Wörterbücher, ... usw. Hoffentlich hilft das.


5
Wenn wir unserer App external_fonts hinzufügen möchten, legen wir sie im Asset-Ordner ab.
Tushar Pandey

1
@TusharPandey Jetzt müssen wir die Schriftarten nicht mehr im AssetsOrdner ablegen , das Android-System enthält jetzt ein fontsVerzeichnis und wir können unsere benutzerdefinierte Schriftartendatei dort ablegen oder Android Studio kann sie für uns herunterladen.
CopsOnRoad

@ Jack, es ist für Oreo.
Tushar Pandey

1
@TusharPandey Es wurde in Oreo hinzugefügt, aber es wurde zurück in die Android Support Library portiert, weit zurück auf API Level 16.
CopsOnRoad

36

Ich weiß, dass dies alt ist, aber um es klar zu machen, gibt es in der offiziellen Android-Dokumentation jeweils eine Erklärung:

von http://developer.android.com/tools/projects/index.html

assets/

Das ist leer. Sie können es zum Speichern von Rohdaten 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 dem AssetManager als Bytestrom lesen. Dies ist beispielsweise ein guter Ort für Texturen und Spieldaten.

res/raw/

Für beliebige Rohdaten. Das Speichern von Asset-Dateien hier anstelle des Assets / Verzeichnisses unterscheidet sich nur in der Art und Weise, wie Sie darauf zugreifen. Diese Dateien werden von aapt verarbeitet und müssen von der Anwendung mithilfe einer Ressourcen-ID in der R-Klasse referenziert werden. Dies ist beispielsweise ein guter Ort für Medien wie MP3- oder Ogg-Dateien.


4
Ich denke, dies verwirrt das Problem tatsächlich - sowohl Texturen als auch OGG-Dateien sind große Datenmengen, die Sie einer Userland-API (openGL / MediaPlayer) zuführen ... warum sollten sie hier diskriminieren?

9

Im Folgenden sind einige wichtige Punkte aufgeführt:

  1. Rohdateien müssen Namen haben, die gültige Java-Bezeichner sind, während Dateien in Assets keine Speicherort- und Namensbeschränkungen haben. Mit anderen Worten, sie können in beliebigen Verzeichnissen zusammengefasst werden
  2. Rohdateien können sowohl aus Java als auch aus XML leicht referenziert werden (dh Sie können eine Rohdatei aus einem Manifest oder einer anderen XML-Datei referenzieren).
  3. Das Speichern von Asset-Dateien hier anstelle des Assets / Verzeichnisses unterscheidet sich nur darin, wie Sie darauf zugreifen, wie hier dokumentiert: 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 Vermögenswerten passiert das nicht. Asset-Dateien müssen im Assets-Verzeichnis der Anwendungsprojekte vorhanden sein.
  5. Das Assets-Verzeichnis ähnelt eher einem Dateisystem, das mehr Freiheit bietet, beliebige Dateien dort abzulegen. Sie können dann auf jede der Dateien in diesem System zugreifen, wie Sie es tun würden, wenn Sie über Java auf eine Datei in einem beliebigen Dateisystem zugreifen. wie Spieledatendateien, Schriftarten, Texturen usw.
  6. Im Gegensatz zu Ressourcen können Assets in Unterordnern im Assets-Verzeichnis organisiert werden. Mit einem Asset können Sie jedoch nur einen Eingabestream abrufen. Daher ist es nicht sehr sinnvoll, Ihre Zeichenfolgen oder Bitmaps in Assets zu speichern. Sie können jedoch Daten im benutzerdefinierten Format wie Eingabekorrekturwörterbücher oder Spielkarten speichern.
  7. Raw kann Ihnen eine Überprüfung der Kompilierungszeit geben, indem Sie Ihre R.java-Datei generieren. 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 wo immer möglich zu verwenden.
  2. Wenn Sie jedoch mehr Flexibilität für Ihren speziellen Fall benötigen, bietet Ihnen Assets eine niedrigere API, mit der Sie Ihre Ressourcen mit einem höheren Freiheitsgrad organisieren und verarbeiten können.

Gemäß der akzeptierten Antwort gilt Punkt 4 für Projekte, die das Gradle-Build-System verwenden, nicht mehr. Assets aus Bibliotheken werden in der Asset-Sammlung des Anwendungsprojekts gebündelt.
Venryx

4

Wenn Sie sie irgendwo im Java-Code referenzieren müssen, legen Sie Ihre Dateien besser im Verzeichnis "res" ab.

Und alle Dateien im res-Ordner werden in der R-Datei indiziert, was das Laden viel schneller (und viel einfacher!) Macht.


6
Sie können auch von Java aus auf die Dateien in Assets zugreifen
Heiko Rupp

2
Ja, aber sie sind nicht indiziert -> Wird langsamer sein, was für ein echtes Problem bei der mobilen Entwicklung ist.
L.Butz

Also, was ist der Unterschied zwischen res / raw und Asset? Wird res / raw auch indiziert?
Anticafe

Überprüfen Sie den Beitrag von @TedHopp - Er bringt die Antwort wirklich klar.
L.Butz

1

Verwenden Sie Assets wie ein Dateisystem, um Dateien aller Art zu sichern. Und verwenden Sie res, um zu speichern, wofür es gemacht ist, Layouts, Bilder, Werte.


0

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 davon überzeugt. Erstens, weil mir die Verwendung einer eindeutigen Ressourcen-ID gefällt. 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 arbeiten zu können.


1
Punkt 2 der Unterstützung von InputStreams und BitmapFactory gilt sowohl für Ressourcen als auch für Assets (siehe hier: stackoverflow.com/a/8501428/2441655 ). Punkt 3 gilt nicht mehr. (siehe akzeptierte Antwort)
Venryx

-5

Assets bieten eine Möglichkeit, beliebige Dateien wie Text, XML, Schriftarten, Musik und Videos in Ihre Anwendung aufzunehmen. Wenn Sie versuchen, diese Dateien als "Ressourcen" einzuschließen, verarbeitet Android sie in seinem Ressourcensystem und Sie können die Rohdaten nicht abrufen. Wenn Sie unberührt auf Daten zugreifen möchten, sind Assets eine Möglichkeit, dies zu tun.


5
Das ist falsch. Wenn Sie Daten res/raweingeben, können Sie mit auf die Rohdaten zugreifen openRawResource(resourceName).
Ted Hopp

Ich habe Opengles-Textur- und Shader-Dateien in einer Bibliothek. Ich muss res / raw verwenden, um sie zu speichern. Ich benutze InputStream und BitmapFactory, um sie zu lesen. Ich werde dies als unabhängigen Kommentar hinzufügen.
Dturvene

Scheint aus Xamarin Microsoft-Dokumenten kopiert zu sein. Geben Sie beim Kopieren von Text Ihre Quelle an. docs.microsoft.com/en-us/xamarin/android/app-fundamentals/…
Sjoerd Pottuit
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.