/ Res ve / asset dizinleri arasındaki fark


266

Varlıklar bir dosya sistemi gibi davranırken resdizindeki dosyalara erişilebildiğini R.classbiliyorum, ancak genel olarak, birini ve diğerini kullanmanın en iyisi olduğunu bilmek istiyorum.
Herkes res ve varlıklar arasındaki gerçek farkları bilmemde bana yardımcı olabilir mi?

Yanıtlar:


284

Kaynaklarla, burada açıklandığı gibi farklı diller, işletim sistemi sürümleri, ekran yönleri vb. İçin alternatifler sağlamak için yerleşik destek vardır . Bunların hiçbiri varlıklarla kullanılamaz. Ayrıca, API'nın birçok bölümü kaynak tanımlayıcılarının kullanımını destekler. Son olarak, kaynakların adları derleme zamanında denetlenen sabit alan adlarına dönüştürülür, bu nedenle kod ve kaynakların kendileri arasında uyumsuzluklar için daha az fırsat vardır. Bunların hiçbiri varlıklar için geçerli değildir.

Öyleyse neden bir varlık klasörü var? Kullanmak istediğiniz varlığı çalışma zamanında hesaplamak istiyorsanız, oldukça kolaydır. Kaynaklarla, kullanılabilecek tüm kaynak kimliklerinin bir listesini bildirmeniz ve listeye bir dizin hesaplamanız gerekir. (Bu bir tür gariptir ve kaynak kümesi geliştirme döngüsünde değişirse hata fırsatları ortaya çıkarır.) (EDIT: kullanarak bir kaynak kimliğini adıyla alabilirsiniz getIdentifier, ancak bu derleme zamanı denetiminin avantajlarını kaybeder.) Varlıklar ayrıca kaynaklar tarafından desteklenmeyen bir klasör hiyerarşisi olarak da organize edilebilir. Bu, verileri yönetmenin farklı bir yoludur. Kaynaklar vakaların çoğunu kapsamasına rağmen, varlıkların arada sırada kullanımı vardır.

Diğer bir fark: kütüphane projesinde tanımlanan kaynaklar otomatik olarak kütüphaneye bağlı uygulama projelerine aktarılır. Varlıklar için bu olmaz; varlık dosyaları, uygulama projelerinin varlık dizininde bulunmalıdır. [DÜZENLEME: Android'in yeni Gradle tabanlı oluşturma sistemi (Android Studio ile kullanılır) artık bu doğru değildir. Kütüphane projeleri için varlık dizinleri .aar dosyalarına paketlenir, bu nedenle kütüphane projelerinde tanımlanan varlıklar uygulama projelerine birleştirilir (bu nedenle /assetsbaşvurulan bir kütüphanedeyse uygulamanın dizininde bulunması gerekmez ).]

EDIT: Uygulamanızla özel bir yazı tipi paketlemek istiyorsanız başka bir fark ortaya çıkar. Dosya sisteminde veya uygulamanızın dizininde depolanan bir font dosyasından bir oluşturmak için API çağrıları vardır . Ancak dizinde depolanan bir font dosyasından (veya dizinin kullanılmasına izin verecek bir a'dan) oluşturmak için API yoktur . [ NOT: Android O ile (artık alfa önizlemesinde kullanılabilir) özel yazı tiplerini kaynak olarak dahil edebileceksiniz. Açıklamasına bakın burada bu uzun gecikmiş özelliği. Bununla birlikte, minimum API düzeyiniz 25 veya daha az olduğu sürece, özel yazı tiplerini kaynak yerine varlık olarak paketlemeniz gerekir.]Typefaceassets/Typefaceres/InputStreamres/


1
reskaynakları temsil eder, o zaman ne anlama assetsgelir?
Vivek Warde

40
@vwvwvwvwvwvwvwvwvw - Um ... hiçbir şey için "ayakta durmaz"; basitçe "varlıklar" anlamına gelir (İngilizce kelime varlığının çoğulunda olduğu gibi : yararlı veya değerli bir şey ).
Ted Hopp

1
raw/Dizindeki dosyalara yazmak mümkün müdür?
Prens

6
@Prince - Hayır. .Apk /resdosyasında paketlendikleri için ve / / asset dizinlerindeki her şey salt okunurdur.
Ted Hopp

apk dosyasını varlıklar klasörüne koyabilir miyiz ve kullanıcı o ui tıkladığında bu apk'yi yükleyebilir mi?
Vivek Mishra

63

Her ikisi de oldukça benzer. İkisi arasındaki gerçek ana fark, resdizinde her dosyaya ID kolayca erişilebilen bir ön derleme verilmesi R.id.[res id]. Bu, görüntülere, seslere, simgelere hızlı ve kolay bir şekilde erişmek için kullanışlıdır ...

assetsDizin daha bir dosya sistemi gibi ve orada istediğiniz herhangi bir dosyayı koymak için daha fazla özgürlük sağlar. Daha sonra, Java aracılığıyla herhangi bir dosya sistemindeki herhangi bir dosyaya erişirken o sistemdeki her dosyaya erişebilirsiniz. Bu dizin oyun detayları, sözlükler, vb. Şeyler için iyidir. Umarım yardımcı olur.


5
Uygulamamıza external_fonts eklemek istiyorsak, bunları varlık klasörüne koyarız.
Tushar Pandey

1
@TusharPandey Şimdi yazı tiplerini Assetsklasöre koymak zorunda değiliz , Android sistemi şimdi fontsdizin içeriyor ve özel yazı tipleri dosyamızı buraya koyabiliriz veya Android stüdyosunun bizim için indirmesini sağlayabiliriz.
CopsOnRoad

@ Jack, Oreo için.
Tushar Pandey

1
@TusharPandey Oreo'ya eklendi, ancak Android Destek Kitaplığı'na API düzey 16'ya geri taşındı
CopsOnRoad

36

Bunun eski olduğunu biliyorum, ama sadece netleştirmek için, resmi android belgelerinde her birinin bir açıklaması var:

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

assets/

Bu boş. Ham varlık dosyalarını saklamak için kullanabilirsiniz. Buraya kaydettiğiniz dosyalar olduğu gibi bir .apk dosyasında derlenir ve özgün dosya adı korunur. Bu dizinde URI'leri kullanarak tipik bir dosya sistemiyle aynı şekilde gezinebilir ve AssetManager'ı kullanarak dosyaları bayt akışı olarak okuyabilirsiniz. Örneğin, burası dokular ve oyun verileri için iyi bir yerdir.

res/raw/

Rasgele ham varlık dosyaları için. Varlık dosyalarını varlık / dizin yerine buraya kaydetmek, yalnızca bunlara erişme şeklinize göre değişir. Bu dosyalar aapt tarafından işlenir ve R sınıfındaki bir kaynak tanımlayıcı kullanılarak uygulamadan başvurulması gerekir. Örneğin, MP3 veya Ogg dosyaları gibi ortamlar için iyi bir yerdir.


4
Bence bu aslında sorunu karıştırıyor - hem dokular hem de ogg dosyaları, kullanıcı alanı API'sına (openGL / MediaPlayer) beslediğiniz büyük veri yığınları ... neden burada ayrımcılık yapsınlar?

9

Aşağıda bazı önemli noktalar verilmiştir:

  1. Ham dosyalar Geçerli Java tanımlayıcıları olan adlara sahipken, Varlıklar'daki dosyaların konum ve ad kısıtlamaları yoktur. Başka bir deyişle, istediğimiz dizinlerde gruplandırılabilirler
  2. Ham dosyalar Java'dan ve ayrıca xml'den (örneğin, manifest veya başka bir xml dosyasından raw olarak bir dosyaya başvurabilirsiniz) başvurmak kolaydır.
  3. Varlık dosyalarının varlıklar / dizin yerine buraya kaydedilmesi, yalnızca http://developer.android.com/tools/projects/index.html belgesinde belirtildiği şekilde bunlara erişme biçiminize göre değişir .
  4. Bir kütüphane projesinde tanımlanan kaynaklar otomatik olarak kütüphaneye bağlı uygulama projelerine aktarılır. Varlıklar için bu olmaz; varlık dosyaları uygulama projelerinin varlık dizininde bulunmalıdır
  5. Varlıklar dizini daha çok bir dosya sistemi gibi istediğiniz herhangi bir dosyayı koymak için daha fazla özgürlük sağlar gibidir. Daha sonra, Java aracılığıyla herhangi bir dosya sistemindeki herhangi bir dosyaya erişirken o sistemdeki her dosyaya erişebilirsiniz. Oyun veri dosyaları, Yazı Tipleri, dokular vb.
  6. Kaynaklar'ın aksine, Varlıklar varlıklar dizinindeki alt klasörler halinde düzenlenebilir. Ancak, bir varlıkla yapabileceğiniz tek şey bir girdi akışı elde etmektir. Bu nedenle, dizelerinizi veya bitmap'lerinizi varlıklarda saklamak çok mantıklı değildir, ancak giriş düzeltme sözlükleri veya oyun haritaları gibi özel formatlı verileri saklayabilirsiniz.
  7. Raw size R.java dosyanızı oluşturarak derleme zamanı denetimi verebilir ancak veritabanınızı özel dizine kopyalamak istiyorsanız, akış için yapılan Varlıkları kullanabilirsiniz.

Sonuç

  1. Android API, çeşitli mobil uygulamalar için en tipik kullanım durumları için de optimize edilmiş çok rahat bir Kaynaklar çerçevesi içerir. Kaynaklarda uzmanlaşmalı ve mümkün olan her yerde kullanmaya çalışmalısınız.
  2. Bununla birlikte, özel durumunuz için daha fazla esnekliğe ihtiyacınız varsa Varlıklar, kaynaklarınızı daha yüksek bir özgürlükle düzenlemenize ve işlemenize olanak tanıyan daha düşük düzeyli bir API sunmak için vardır.

Kabul edilen cevaba göre, nokta 4 artık Gradle derleme sistemini kullanan projeler için geçerli değildir; kütüphanelerden alınan varlıklar, uygulama projesinin varlık koleksiyonuna dahil edilir.
Venryx

4

Bunları Java Kodunda bir yere göndermeniz gerekiyorsa, dosyalarınızı "res" dizinine sokarsınız.

Ve res klasöründeki tüm dosyalar R dosyasında indekslenir, bu da onları yüklemeyi çok daha hızlı (ve çok daha kolay!) Yapar.


6
Varlıklardaki dosyalara Java'dan da erişebilirsiniz
Heiko Rupp

2
Evet, ancak dizine eklenmemişler -> Daha yavaş olacak, mobil geliştirmede asıl sorun nedir.
L. Butz

Peki, res / raw ile varlık arasındaki fark nedir? Res / raw da dizine eklenecek mi?
anticafe

@TedHopp'tan Gönderiyi Kontrol Et - Cevabı gerçekten netleştiriyor.
L. Butz

1

Her tür dosyayı boşaltmak için dosya sistemi gibi varlıkları kullanın. Ve res, ne için yapıldığını, düzenleri, görüntüleri, değerleri saklamak için kullanın.


0

Ted Hopp bunu oldukça güzel yanıtladı. Ben opengl doku ve gölgelendirici dosyaları için res / raw kullanıyorum. Hiyerarşik bir organizasyon sağlamak için onları bir varlıklar dizinine taşımayı düşünüyordum.

Bu konu beni yapmamaya ikna etti. İlk olarak, benzersiz bir kaynak kimliği kullanımını seviyorum çünkü. İkincisi, dosyada okumak için InputStream / openRawResource veya BitmapFactory'yi kullanmak çok basit. Üçüncüsü, taşınabilir bir kütüphanede kullanabilmek çok faydalıdır.


1
InputStreams ve BitmapFactory desteğinin 2. noktası hem kaynaklar hem de varlıklar için geçerlidir (buraya bakın: stackoverflow.com/a/8501428/2441655 ). Nokta 3 artık geçerli değil. (kabul edilen cevaba bakınız)
Venryx

-5

Varlıklar, uygulamanıza metin, xml, yazı tipleri, müzik ve video gibi rastgele dosyalar eklemenin bir yolunu sunar. Bu dosyaları "kaynak" olarak eklemeye çalışırsanız, Android bunları kaynak sistemine işleyecek ve ham verileri alamayacaksınız. El değmemiş verilere erişmek istiyorsanız, Varlıklar bunu yapmanın bir yoludur.


5
Bu yanlış. Veri koyarsanız res/raw, kullanarak ham verilere ulaşabilirsiniz openRawResource(resourceName).
Ted Hopp

Kütüphanede opengles doku ve gölgelendirici dosyalarım var. Ben GEREKİR res / bunları saklamak için çiğ kullanın. Bunları okumak için InputStream ve BitmapFactory kullanıyorum. Bunu bağımsız bir yorum olarak ekleyeceğim.
dturvene

Xamarin Microsoft belgelerinden kopyalanmış görünüyor. Metin kopyalarken kaynağınızı verin. docs.microsoft.com/tr-tr/xamarin/android/app-fundamentals/…
Sjoerd Pottuit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.