Ich weiß, dass Dateien in der res
Verzeichnis zugänglich sind R.class
Während sich Assets wie ein Dateisystem verhalten, würde ich im Allgemeinen gerne 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 kennen?
Unterschied zwischen den Verzeichnissen /res und /assets
Cris
Ted Hopp
Bei den Ressourcen gibt es eine integrierte Unterstützung für die Bereitstellung von Alternativen für verschiedene Sprachen, Betriebssystemversionen, Bildschirmausrichtungen usw., wie beschrieben Hier. Nichts davon ist mit Vermögenswerten verfügbar. Außerdem unterstützen viele Teile der API die Verwendung von Ressourcenkennungen. Schließlich werden die Namen der Ressourcen in konstante Feldnamen umgewandelt, die zur Kompilierzeit überprüft werden, sodass die Wahrscheinlichkeit von Nichtübereinstimmungen zwischen dem Code und den Ressourcen selbst geringer ist. Nichts davon gilt für Vermögenswerte.
Warum also überhaupt einen Assets-Ordner haben? 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 die Liste berechnen. (Dies ist etwas umständlich und führt zu Fehlermöglichkeiten, wenn sich der Satz von Ressourcen im Entwicklungszyklus ändert.) (BEARBEITEN: Sie können eine Ressourcen-ID nach Namen abrufen, indem Sie getIdentifier
, aber dadurch gehen die Vorteile der Überprüfung zur Kompilierzeit verloren.) Assets können auch in einer Ordnerhierarchie organisiert werden, was 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. [EDIT: With Android’s new Gradle-based build system (used with Android Studio), this is no longer true. Asset directories for library projects are packaged into the .aar files, so assets defined in library projects are merged into application projects (so they do not have to be present in the application’s /assets
directory if they are in a referenced library).]
BEARBEITEN: Ein weiterer Unterschied ergibt sich, wenn Sie eine benutzerdefinierte Schriftart mit Ihrer App verpacken möchten. Es gibt API-Aufrufe ein zu erstellen Typeface
aus einer Schriftartdatei, die im Dateisystem oder in Ihrer App gespeichert ist assets/
Verzeichnis. Aber es gibt keine API, um eine zu erstellen Typeface
aus einer Schriftartdatei, die in der res/
Verzeichnis (oder aus einer InputStream
was die Verwendung von ermöglichen würde res/
Verzeichnis). [NOTE: With Android O (now available in alpha preview) you will be able to include custom fonts as resources. See the description here of this long-overdue feature. However, as long as your minimum API level is 25 or less, you’ll have to stick with packaging custom fonts as assets rather than as resources.]
-
res
steht für Ressourcen, was dann bedeutetassets
steht für ??– Vivek Warde
13. Juni 14 um 5:34 Uhr
-
@vwvwvwvwvwvwvwvwvw – Ähm … es “steht für” nichts; es bedeutet einfach “Vermögen” (wie im Plural des englischen Wortes Anlage: eine nützliche oder wertvolle Sache).
–Ted Hopp
13. Juni 14 um 17:12 Uhr
-
Ist es möglich, in die Dateien in der
raw/
Verzeichnis?– Prinz
13. Mai 15 um 7:38 Uhr
-
@Prince – Nein. Alles in der
/res
und „/assets“-Verzeichnisse sind schreibgeschützt, da sie in der .apk-Datei verpackt sind.–Ted Hopp
13. Mai 15 um 15:08 Uhr
-
Können wir die APK-Datei in den Assets-Ordner legen und wenn der Benutzer auf diese Benutzeroberfläche klickt, diese APK installieren?
– Vivek Mischra
1. September 16 um 6:50 Uhr
DRiFTy
Beide sind ziemlich ähnlich. Der wirkliche Hauptunterschied zwischen den beiden ist der in der res
Verzeichnis erhält jede Datei eine vorkompilierte Datei ID
die leicht zugänglich sind R.id.[res id]
. Dies ist nützlich, um schnell und einfach auf Bilder, Sounds, Symbole usw. zuzugreifen.
Der assets
Verzeichnis ist eher wie ein Dateisystem und bietet mehr Freiheit, jede gewünschte Datei dort abzulegen. Sie können dann auf jede der Dateien in diesem System zugreifen, als ob Sie über Java auf eine beliebige Datei in einem beliebigen Dateisystem zugreifen würden. Dieses Verzeichnis ist gut für Dinge wie Spieldetails, Wörterbücher usw. Hoffentlich hilft das.
-
Wenn wir external_fonts in unserer App hinzufügen möchten, legen wir sie im Asset-Ordner ab.
– Tushar Pandey
19. April 14 um 3:58 Uhr
-
@TusharPandey Jetzt müssen wir die Schriftarten nicht einfügen
Assets
Ordner, Android-System enthält jetztfonts
Verzeichnis und wir können unsere Datei mit benutzerdefinierten Schriftarten dort ablegen oder wir können sie von Android Studio für uns herunterladen lassen.– CopsOnRoad
26. September 17 um 15:55 Uhr
-
@Jack, es ist für Oreo.
– Tushar Pandey
27. September 17 um 5:56 Uhr
-
@TusharPandey Es wurde in Oreo hinzugefügt, aber es wurde zurück in die Android Support Library bis zurück zu API-Level 16 portiert.
– CopsOnRoad
27. September 17 um 16:12 Uhr
AntonyMCs
Ich weiß, dass dies alt ist, aber um es klarzustellen, gibt es eine Erklärung für jedes in der offiziellen Android-Dokumentation:
von http://developer.android.com/tools/projects/index.html
assets/
Das ist leer. Sie können es verwenden, um Raw-Asset-Dateien zu speichern. 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 mit URIs navigieren und Dateien mit dem AssetManager als Byte-Stream lesen. Dies ist beispielsweise ein guter Speicherort für Texturen und Spieldaten.
res/raw/
Für beliebige Raw-Asset-Dateien. Das Speichern von Asset-Dateien hier statt im Verzeichnis assets/ unterscheidet sich nur in der Art und Weise, wie Sie darauf zugreifen. Diese Dateien werden von aapt verarbeitet und müssen von der Anwendung unter Verwendung einer Ressourcenkennung in der R-Klasse referenziert werden. Dies ist beispielsweise ein guter Ort für Medien wie MP3- oder Ogg-Dateien.
-
Ich denke, das verwirrt das Problem tatsächlich – sowohl Texturen als auch Ogg-Dateien sind große Datenklumpen, die Sie an eine Userland-API (openGL/MediaPlayer) weitergeben … warum sollten sie hier diskriminieren?
– Benutzer755921
27. September 15 um 18:45 Uhr
Nachfolgend einige Kernpunkte:
- Raw-Dateien müssen Namen haben, die gültige Java-Kennungen sind, während Dateien in Assets keine Standort- und Namensbeschränkungen haben. Mit anderen Worten, sie können in beliebigen Verzeichnissen gruppiert werden
- Raw-Dateien Auf diese kann sowohl von Java als auch von XML aus leicht verwiesen werden (dh Sie können eine Datei in Raw aus dem Manifest oder einer anderen XML-Datei referenzieren).
- Das Speichern von Asset-Dateien hier statt im Verzeichnis assets/ unterscheidet sich nur in der Art und Weise, wie Sie darauf zugreifen, wie hier dokumentiert
http://developer.android.com/tools/projects/index.html. - 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
- Das Assets-Verzeichnis ähnelt eher einem Dateisystem, das mehr Freiheit bietet, jede beliebige Datei dort abzulegen. Sie können dann auf jede der Dateien in diesem System zugreifen, als ob Sie über Java auf jede Datei in einem beliebigen Dateisystem zugreifen würden. wie Spieldatendateien, Schriftarten, Texturen usw.
- Im Gegensatz zu Ressourcen können Assets in Unterordnern im Assets-Verzeichnis organisiert werden. Das einzige, was Sie mit einem Asset tun können, ist jedoch, einen Eingabestrom zu erhalten. Daher ist es nicht sehr sinnvoll, Ihre Zeichenfolgen oder Bitmaps in Assets zu speichern, aber Sie können Daten in benutzerdefinierten Formaten wie Eingabekorrekturwörterbücher oder Spielkarten speichern.
- Raw kann Ihnen eine Überprüfung der Kompilierungszeit geben, indem es Ihre R.java-Datei generiert. 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
- 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 nutzen.
- Wenn Sie jedoch mehr Flexibilität für Ihren speziellen Fall benötigen, bietet Ihnen Assets eine API auf niedrigerer Ebene, die es Ihnen ermöglicht, Ihre Ressourcen mit einem höheren Freiheitsgrad zu organisieren und zu verarbeiten.
L.Butz
Wenn Sie irgendwo im Java-Code auf sie verweisen müssen, legen Sie Ihre Dateien lieber in das Verzeichnis “res” ab.
Und alle Dateien im res-Ordner werden in der R-Datei indiziert, was das Laden viel schneller (und viel einfacher!) macht.
-
Sie können auch von Java aus auf die Dateien in Assets zugreifen
– Heiko Rupp
7. April 11 um 15:35 Uhr
-
Ja, aber sie sind nicht indiziert –> Wird langsamer, was ein echtes Problem in der mobilen Entwicklung ist.
– L. Butz
7. April 11 um 15:38 Uhr
-
Also, was ist der Unterschied zwischen res/raw und Asset? Wird res/raw auch indiziert?
– Anticafe
7. April 11 um 15:57 Uhr
-
Überprüfen Sie den Post von @TedHopp – Er bringt die Antwort wirklich klar.
– L. Butz
7. April 11 um 16:06 Uhr
Bajji
Verwenden Sie Assets wie ein Dateisystem, um jede Art von Dateien zu sichern. Und verwenden Sie res, um zu speichern, wofür es gemacht wurde, Layouts, Bilder, Werte.
-
Sie können auch von Java aus auf die Dateien in Assets zugreifen
– Heiko Rupp
7. April 11 um 15:35 Uhr
-
Ja, aber sie sind nicht indiziert –> Wird langsamer, was ein echtes Problem in der mobilen Entwicklung ist.
– L. Butz
7. April 11 um 15:38 Uhr
-
Also, was ist der Unterschied zwischen res/raw und Asset? Wird res/raw auch indiziert?
– Anticafe
7. April 11 um 15:57 Uhr
-
Überprüfen Sie den Post von @TedHopp – Er bringt die Antwort wirklich klar.
– L. Butz
7. April 11 um 16:06 Uhr
Ted Hopp
Ted Hopp hat das ganz nett beantwortet. Ich habe res/raw für meine OpenGL-Textur- und Shader-Dateien verwendet. Ich habe darüber nachgedacht, sie in ein Assets-Verzeichnis zu verschieben, um eine hierarchische Organisation bereitzustellen.
Dieser Thread hat mich davon überzeugt. Erstens, weil ich die Verwendung einer eindeutigen Ressourcen-ID mag. Zweitens, weil es sehr einfach ist, InputStream/openRawResource oder BitmapFactory zu verwenden, um die Datei einzulesen. Drittens, weil es sehr nützlich ist, es in einer tragbaren Bibliothek verwenden zu können.
-
Punkt 2 der InputStreams- und BitmapFactory-Unterstützung gilt sowohl für Ressourcen als auch für Assets (siehe hier: stackoverflow.com/a/8501428/2441655). Punkt 3 entfällt. (siehe akzeptierte Antwort)
– Venryx
28. Februar 17 um 11:34 Uhr
-
Punkt eins ist auch fraglich, da wir in Assets nicht auch den gleichen Dateinamen angeben können. Der Vorteil von res/raw besteht eher darin, sicherzustellen, dass der Dateiname immer korrekt ist.
– Eleye
9. August 20 um 12:06 Uhr
.