Perbedaan antara direktori / res dan / asset

266

Saya tahu bahwa file dalam resdirektori dapat diakses dari R.classsaat aset berperilaku seperti sistem file, tetapi saya ingin tahu, secara umum, kapan sebaiknya menggunakan satu dan yang lainnya.
Adakah yang bisa membantu saya mengetahui perbedaan nyata antara res dan aset?

Cris
sumber

Jawaban:

284

Dengan sumber daya, ada dukungan bawaan untuk menyediakan alternatif untuk berbagai bahasa, versi OS, orientasi layar, dll., Seperti dijelaskan di sini . Tidak ada yang tersedia dengan aset. Juga, banyak bagian API mendukung penggunaan pengidentifikasi sumber daya. Akhirnya, nama sumber daya diubah menjadi nama bidang konstan yang diperiksa pada waktu kompilasi, jadi ada sedikit kesempatan untuk ketidaksesuaian antara kode dan sumber daya itu sendiri. Tidak ada yang berlaku untuk aset.

Jadi mengapa memiliki folder aset sama sekali? Jika Anda ingin menghitung aset yang ingin Anda gunakan pada saat run time, itu cukup mudah. Dengan sumber daya, Anda harus mendeklarasikan daftar semua ID sumber daya yang dapat digunakan dan menghitung indeks ke dalam daftar. (Ini agak canggung dan memperkenalkan peluang untuk kesalahan jika rangkaian sumber daya berubah dalam siklus pengembangan.) (EDIT: Anda dapat mengambil ID sumber daya dengan menggunakan nama getIdentifier, tetapi ini kehilangan manfaat dari pengecekan waktu kompilasi.) Aset dapat juga dapat diatur ke dalam hierarki folder, yang tidak didukung oleh sumber daya. Ini cara berbeda dalam mengelola data. Meskipun sumber daya mencakup sebagian besar kasus, aset memiliki penggunaan sesekali.

Satu perbedaan lain: sumber daya yang ditentukan dalam proyek perpustakaan secara otomatis diimpor ke proyek aplikasi yang bergantung pada perpustakaan. Untuk aset, itu tidak terjadi; file aset harus ada di direktori aset proyek aplikasi. [EDIT: Dengan sistem build baru Android berbasis Gradle (digunakan dengan Android Studio), ini tidak lagi benar. Direktori aset untuk proyek perpustakaan dikemas ke dalam file .aar, sehingga aset yang didefinisikan dalam proyek perpustakaan digabungkan ke dalam proyek aplikasi (jadi mereka tidak harus ada di /assetsdirektori aplikasi jika mereka berada di perpustakaan yang direferensikan).]

EDIT: Namun perbedaan lain muncul jika Anda ingin mengemas font khusus dengan aplikasi Anda. Ada panggilan API untuk membuat Typefacedari file font yang disimpan di sistem file atau di assets/direktori aplikasi Anda . Tetapi tidak ada API untuk membuat Typefacedari file font yang disimpan dalam res/direktori (atau dari InputStream, yang akan memungkinkan penggunaan res/direktori). [ CATATAN: Dengan Android O (sekarang tersedia dalam pratinjau alfa) Anda akan dapat menyertakan font khusus sebagai sumber. Lihat deskripsi di sini tentang fitur yang telah lama tertunda ini. Namun, selama level API minimum Anda adalah 25 atau kurang, Anda harus tetap menggunakan font kustom sebagai aset alih-alih sebagai sumber daya.]

Ted Hopp
sumber
1
ressingkatan sumber daya, lalu apa artinya assetssingkatan ??
Vivek Warde
40
@vwvwvwvwvwvwvwvwvw - Um ... itu tidak "membela" apa pun; itu hanya berarti "aset" (seperti dalam bentuk jamak dari kata aset Bahasa Inggris : hal yang berguna atau berharga ).
Ted Hopp
1
Apakah mungkin untuk menulis ke file di raw/direktori?
Pangeran
6
@Prince - Tidak. Segala sesuatu di /resdirektori dan / aset 'adalah read-only, karena mereka dikemas dalam file .apk.
Ted Hopp
dapatkah kita meletakkan file apk di folder assets dan ketika pengguna mengklik ui itu menginstal apk itu?
Vivek Mishra
63

Keduanya sangat mirip. Perbedaan utama sebenarnya antara keduanya adalah bahwa dalam resdirektori setiap file diberikan pra-kompilasi ID yang dapat diakses dengan mudah R.id.[res id]. Ini berguna untuk mengakses gambar, suara, ikon dengan cepat dan mudah ...

The assetsdirektori lebih seperti filesystem dan menyediakan lebih banyak kebebasan untuk menempatkan file yang Anda ingin di sana. Anda kemudian dapat mengakses setiap file dalam sistem itu seperti yang Anda lakukan ketika mengakses file apa pun di sistem file apa pun melalui Java. Direktori ini baik untuk hal-hal seperti detail game, kamus, ... dll. Semoga itu bisa membantu.

KERING
sumber
5
Jika kami ingin menambahkan external_fonts di aplikasi kami, maka kami meletakkannya di folder aset.
Tushar Pandey
1
@TusharPandey Sekarang kita tidak harus meletakkan font di Assetsfolder, sistem Android sekarang berisi fontsdirektori dan kita dapat meletakkan file font kustom kita di sana atau kita dapat memiliki Android studio mengunduhnya untuk kita.
CopsOnRoad
@ Jack, ini untuk Oreo.
Tushar Pandey
1
@TusharPandey Sudah ditambahkan di Oreo tetapi telah kembali porting ke Android Support Library kembali ke API level 16.
CopsOnRoad
36

Saya tahu ini sudah tua, tetapi hanya untuk memperjelas, ada penjelasan masing-masing di dokumentasi android resmi:

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

assets/

Ini kosong Anda dapat menggunakannya untuk menyimpan file aset mentah. File yang Anda simpan di sini dikompilasi menjadi file .apk apa adanya, dan nama file asli dipertahankan. Anda dapat menavigasi direktori ini dengan cara yang sama seperti sistem file khas menggunakan URI dan membaca file sebagai aliran byte menggunakan AssetManager. Sebagai contoh, ini adalah lokasi yang bagus untuk tekstur dan data game.

res/raw/

Untuk file aset mentah yang berubah-ubah. Menyimpan file aset di sini dan bukan di direktori aset / hanya berbeda dalam cara Anda mengaksesnya. File-file ini diproses oleh aapt dan harus dirujuk dari aplikasi menggunakan pengenal sumber daya di kelas R. Misalnya, ini adalah tempat yang baik untuk media, seperti file MP3 atau Ogg.

AntonyMCs
sumber
4
Saya pikir ini benar-benar membingungkan masalah - baik tekstur dan file ogg adalah gumpalan besar data yang Anda makan ke APIlanderland (openGL / MediaPlayer) ... mengapa mereka membedakan di sini?
9

Berikut ini adalah beberapa poin utama:

  1. File mentah Harus memiliki nama yang merupakan pengidentifikasi Java yang valid, sedangkan file dalam Aset Tidak memiliki batasan lokasi dan nama. Dengan kata lain mereka dapat dikelompokkan dalam direktori apa pun yang kita inginkan
  2. File mentah Mudah untuk dirujuk dari Jawa maupun dari xml (yaitu Anda dapat merujuk file dalam mentah dari manifes atau file xml lainnya).
  3. Menyimpan file aset di sini alih-alih dalam direktori aset / hanya berbeda dalam cara Anda mengaksesnya seperti yang didokumentasikan di sini http://developer.android.com/tools/projects/index.html .
  4. Sumber daya yang ditentukan dalam proyek perpustakaan secara otomatis diimpor ke proyek aplikasi yang bergantung pada perpustakaan. Untuk aset, itu tidak terjadi; file aset harus ada di direktori aset proyek aplikasi
  5. Direktori aset lebih seperti sistem file memberikan lebih banyak kebebasan untuk meletakkan file apa pun yang Anda inginkan di sana. Anda kemudian dapat mengakses setiap file dalam sistem itu seperti yang Anda lakukan ketika mengakses file apa pun di sistem file apa pun melalui Java. seperti file data Game, Font, tekstur dll.
  6. Tidak seperti Sumber Daya, Aset dapat diatur ke dalam subfolder di direktori aset Namun, satu-satunya hal yang dapat Anda lakukan dengan aset adalah mendapatkan aliran input. Dengan demikian, tidak masuk akal untuk menyimpan string atau bitmap Anda di aset, tetapi Anda dapat menyimpan data format khusus seperti kamus koreksi input atau peta game.
  7. Raw dapat memberi Anda waktu kompilasi dengan membuat file R.java Anda. Namun, jika Anda ingin menyalin basis data ke direktori pribadi, Anda dapat menggunakan Aset yang dibuat untuk streaming.

Kesimpulan

  1. Android API mencakup kerangka kerja Sumber Daya yang sangat nyaman yang juga dioptimalkan untuk kasus penggunaan paling umum untuk berbagai aplikasi seluler. Anda harus menguasai Sumberdaya dan mencoba menggunakannya sedapat mungkin.
  2. Namun, jika Anda membutuhkan lebih banyak fleksibilitas untuk kasus khusus Anda, Aset ada untuk memberi Anda API tingkat lebih rendah yang memungkinkan pengorganisasian dan pemrosesan sumber daya Anda dengan tingkat kebebasan yang lebih tinggi.
Shubhang Malviya
sumber
Menurut jawaban yang diterima, poin 4 tidak lagi benar, untuk proyek yang menggunakan sistem pembangunan Gradle; aset dari perpustakaan dibundel ke dalam koleksi aset proyek aplikasi.
Venryx
4

Jika Anda perlu merujuk mereka di suatu tempat di Kode Java, Anda sebaiknya meletakkan file Anda ke direktori "res".

Dan semua file dalam folder res akan diindeks dalam file R, yang membuatnya lebih cepat (dan lebih mudah!) Untuk memuatnya.

L. Butt
sumber
6
Anda dapat mengakses file dalam aset dari Jawa juga
Heiko Rupp
2
Ya, tetapi mereka tidak diindeks -> Akan lebih lambat, apa masalah sebenarnya dalam pengembangan ponsel.
L.Butz
jadi, apa perbedaan antara res / raw dan aset? Apakah res / raw akan diindeks juga?
anticafe
Periksa Posting dari @TedHopp - Dia membawa jawabannya dengan sangat jelas.
L.Butz
1

Gunakan aset seperti sistem file untuk membuang semua jenis file. Dan gunakan res untuk menyimpan apa yang dibuat, tata letak, gambar, nilai.

Bajji
sumber
0

Ted Hopp menjawab ini dengan cukup baik. Saya telah menggunakan res / raw untuk tekstur terbuka dan file shader saya. Saya sedang berpikir tentang memindahkan mereka ke direktori aset untuk menyediakan organisasi hierarkis.

Utas ini meyakinkan saya untuk tidak melakukannya. Pertama, karena saya suka menggunakan id sumber daya yang unik. Kedua karena sangat mudah menggunakan InputStream / openRawResource atau BitmapFactory untuk membaca dalam file. Ketiga karena sangat berguna untuk dapat digunakan di perpustakaan portabel.

dturvene
sumber
1
Poin 2, dari dukungan InputStreams dan BitmapFactory, berlaku untuk sumber daya dan aset (lihat di sini: stackoverflow.com/a/8501428/2441655 ). Angka 3 tidak berlaku lagi. (lihat jawaban yang diterima)
Venryx
-5

Aset menyediakan cara untuk memasukkan file sewenang-wenang seperti teks, xml, font, musik, dan video dalam aplikasi Anda. Jika Anda mencoba memasukkan file-file ini sebagai "sumber daya", Android akan memprosesnya menjadi sistem sumber dayanya dan Anda tidak akan bisa mendapatkan data mentah. Jika Anda ingin mengakses data yang tidak tersentuh, Aset adalah salah satu cara untuk melakukannya.

KCRaju
sumber
5
Ini salah. Jika Anda memasukkan data res/raw, Anda bisa mendapatkan data mentah menggunakan openRawResource(resourceName).
Ted Hopp
Saya memiliki file tekstur terbuka dan file shader di perpustakaan. Saya HARUS menggunakan res / raw untuk menyimpannya. Saya menggunakan InputStream dan BitmapFactory untuk membacanya. Saya akan menambahkan ini sebagai komentar independen.
dturvene
Tampaknya disalin dari Xamarin Microsoft docs. Berikan sumber Anda saat menyalin teks. docs.microsoft.com/en-us/xamarin/android/app-fundamentals/…
Sjoerd Pottuit