Differenza tra / res e / assets directory


272

So che i file nella resdirectory sono accessibili da R.classmentre le risorse si comportano come un file system, ma mi piacerebbe sapere, in generale, quando è meglio usare l'uno e l'altro.
Qualcuno può aiutarmi a conoscere le reali differenze tra res e asset?

Risposte:


290

Con le risorse, c'è il supporto integrato per fornire alternative per diverse lingue, versioni del sistema operativo, orientamenti dello schermo, ecc., Come descritto qui . Niente di tutto ciò è disponibile con le risorse. Inoltre, molte parti dell'API supportano l'uso di identificatori di risorse. Infine, i nomi delle risorse vengono trasformati in nomi di campo costanti che vengono controllati in fase di compilazione, quindi c'è meno possibilità di mancate corrispondenze tra il codice e le risorse stesse. Niente di tutto ciò si applica alle risorse.

Allora perché avere una cartella delle risorse? Se desideri calcolare l'asset che desideri utilizzare in fase di esecuzione, è abbastanza semplice. Con le risorse, dovresti dichiarare un elenco di tutti gli ID risorsa che potrebbero essere utilizzati e calcolare un indice nell'elenco. (Questo è un po 'imbarazzante e introduce opportunità di errore se l'insieme di risorse cambia nel ciclo di sviluppo.) (MODIFICA: puoi recuperare un ID risorsa per nome usando getIdentifier, ma questo perde i vantaggi del controllo in fase di compilazione.) essere organizzato anche in una gerarchia di cartelle, che non è supportata dalle risorse. È un modo diverso di gestire i dati. Sebbene le risorse coprano la maggior parte dei casi, le risorse hanno il loro uso occasionale.

Un'altra differenza: le risorse definite in un progetto di libreria vengono importate automaticamente nei progetti dell'applicazione che dipendono dalla libreria. Per le risorse, ciò non accade; i file di asset devono essere presenti nella directory degli asset dei progetti dell'applicazione. [EDIT: con il nuovo sistema di build basato su Gradle di Android (utilizzato con Android Studio), questo non è più vero. Le directory delle risorse per i progetti di libreria sono impacchettate nei file .aar, quindi le risorse definite nei progetti di libreria vengono unite nei progetti dell'applicazione (quindi non devono essere presenti nella /assetsdirectory dell'applicazione se si trovano in una libreria di riferimento).]

EDIT: ancora un'altra differenza sorge se vuoi creare un pacchetto di un font personalizzato con la tua app. Sono disponibili chiamate API per creare un Typefacefile da un file di font archiviato nel file system o nella assets/directory dell'app . Ma non esiste un'API per creare un Typefacefile da un file di carattere memorizzato nella res/directory (o da un InputStream, che consentirebbe l'uso della res/directory). [ NOTA: con Android O (ora disponibile in anteprima alpha) sarai in grado di includere caratteri personalizzati come risorse. Vedi la descrizione qui di questa caratteristica attesa da tempo. Tuttavia, fintanto che il tuo livello API minimo è 25 o inferiore, dovrai attenersi alla creazione di pacchetti di caratteri personalizzati come risorse anziché come risorse.]


1
ressta per risorse, allora cosa assetssignifica ??
Vivek Warde

40
@vwvwvwvwvwvwvwvwvw - Um ... non "sta per" niente; significa semplicemente "asset" (come al plurale della parola inglese asset : una cosa utile o di valore ).
Ted Hopp

1
È possibile scrivere sui file nella raw/directory?
Prince

6
@Prince - No. Tutto nelle /resdirectory e '/ assets' è di sola lettura, poiché sono impacchettati nel file .apk.
Ted Hopp

possiamo mettere il file apk nella cartella delle risorse e quando l'utente fa clic su quell'interfaccia utente installa quell'apk?
Vivek Mishra

67

Entrambi sono abbastanza simili. La vera differenza principale tra i due è che nella resdirectory a ogni file viene fornito un precompilato a ID cui si accede facilmente tramite R.id.[res id]. Questo è utile per accedere rapidamente e facilmente a immagini, suoni, icone ...

La assetsdirectory è più simile a un filesystem e offre più libertà di inserire qualsiasi file si desideri. È quindi possibile accedere a ciascuno dei file in quel sistema come si farebbe quando si accede a qualsiasi file in qualsiasi file system tramite Java. Questa directory è utile per cose come dettagli del gioco, dizionari, ... ecc. Spero che aiuti.


5
Se vogliamo aggiungere external_fonts nella nostra app, li inseriamo nella cartella delle risorse.
Tushar Pandey

1
@TusharPandey Ora non dobbiamo mettere i caratteri nella Assetscartella, il sistema Android ora contiene la fontsdirectory e possiamo inserire il nostro file di caratteri personalizzati lì o possiamo farlo scaricare da Android Studio per noi.
CopsOnRoad

@ Jack, è per Oreo.
Tushar Pandey,

1
@TusharPandey È stato aggiunto in Oreo ma è stato nuovamente trasferito nella libreria di supporto Android fino al livello API 16.
CopsOnRoad,

37

So che questo è vecchio, ma solo per chiarire, c'è una spiegazione di ciascuno nella documentazione ufficiale di Android:

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

assets/

Questo è vuoto. Puoi usarlo per archiviare file di asset non elaborati. I file salvati qui vengono compilati in un file .apk così com'è e il nome del file originale viene mantenuto. È possibile navigare in questa directory allo stesso modo di un tipico file system utilizzando gli URI e leggere i file come flusso di byte utilizzando AssetManager. Ad esempio, questa è una buona posizione per trame e dati di gioco.

res/raw/

Per file di asset raw arbitrari. Il salvataggio dei file di risorse qui invece che nella directory assets / differisce solo per il modo in cui vi si accede. Questi file vengono elaborati da aapt e devono essere referenziati dall'applicazione utilizzando un identificatore di risorsa nella classe R. Ad esempio, questo è un buon posto per i media, come i file MP3 o Ogg.


4
Penso che questo in realtà confonda il problema: sia le trame che i file ogg sono grandi quantità di dati che fornisci a un'API userland (openGL / MediaPlayer) ... perché dovrebbero discriminare qui?

12

Di seguito sono riportati alcuni punti chiave:

  1. File non elaborati Devono avere nomi che siano identificatori Java validi, mentre i file in Asset non hanno limitazioni di posizione e nome. In altre parole, possono essere raggruppati in qualsiasi directory desideriamo
  2. File raw Sono facili da fare riferimento da Java così come da xml (cioè puoi fare riferimento a un file in raw da manifest o altro file xml).
  3. Il salvataggio dei file di risorse qui invece che nella directory assets / differisce solo per il modo in cui si accede ad essi, come documentato qui http://developer.android.com/tools/projects/index.html .
  4. Le risorse definite in un progetto di libreria vengono importate automaticamente nei progetti dell'applicazione che dipendono dalla libreria. Per le risorse, ciò non accade; i file di asset devono essere presenti nella directory degli asset dei progetti dell'applicazione
  5. La directory degli asset è più simile a un filesystem che offre più libertà di inserire qualsiasi file che desideri. È quindi possibile accedere a ciascuno dei file in quel sistema come si farebbe quando si accede a qualsiasi file in qualsiasi file system tramite Java. come file di dati di gioco, caratteri, trame ecc.
  6. A differenza di Risorse, le risorse possono essere organizzate in sottocartelle nella directory delle risorse. Tuttavia, l'unica cosa che puoi fare con una risorsa è ottenere un flusso di input. Pertanto, non ha molto senso memorizzare le stringhe o le bitmap nelle risorse, ma è possibile memorizzare dati in formato personalizzato come dizionari di correzione di input o mappe di gioco.
  7. Raw può darti un controllo in fase di compilazione generando il tuo file R.java, tuttavia se vuoi copiare il tuo database in una directory privata puoi usare le risorse che sono fatte per lo streaming.

Conclusione

  1. L'API Android include un framework di risorse molto comodo ottimizzato per i casi d'uso più tipici per varie app mobili. Dovresti padroneggiare le risorse e cercare di usarle ove possibile.
  2. Tuttavia, se hai bisogno di maggiore flessibilità per il tuo caso speciale, le risorse sono lì per darti un'API di livello inferiore che consente di organizzare ed elaborare le tue risorse con un grado di libertà più elevato.

1
Secondo la risposta accettata, il punto 4 non è più vero, per i progetti che utilizzano il sistema di compilazione Gradle; le risorse delle librerie vengono raggruppate nella raccolta di risorse del progetto dell'applicazione.
Venryx

4

Se hai bisogno di riferirli da qualche parte nel codice Java, dovresti inserire i tuoi file nella directory "res".

E tutti i file nella cartella res verranno indicizzati nel file R, il che rende molto più veloce (e molto più facile!) Caricarli.


6
Puoi accedere ai file nelle risorse anche da Java
Heiko Rupp

2
Sì, ma non sono indicizzati -> Sarà più lento, quale vero problema è nello sviluppo mobile.
L.Butz

quindi, qual è la differenza tra res / raw e asset? Anche res / raw verrà indicizzato?
anticafe

Controlla il post di @TedHopp - Porta la risposta molto chiara.
L.Butz

1

Usa risorse come un filesystem per scaricare qualsiasi tipo di file. E usa res per memorizzare ciò per cui è fatto, layout, immagini, valori.


0

Ted Hopp ha risposto abbastanza bene. Ho usato res / raw per i miei file di texture e shader opengl. Stavo pensando di spostarli in una directory di risorse per fornire un'organizzazione gerarchica.

Questo thread mi ha convinto a non farlo. Primo, perché mi piace l'uso di un ID risorsa univoco. Secondo perché è molto semplice usare InputStream / openRawResource o BitmapFactory per leggere il file. Terzo perché è molto utile poterlo utilizzare in una libreria portatile.


1
Il punto 2, del supporto InputStreams e BitmapFactory, vale sia per le risorse che per gli asset (vedi qui: stackoverflow.com/a/8501428/2441655 ). Il punto 3 non si applica più. (vedi risposta accettata)
Venryx

Anche il punto uno è discutibile, poiché, nelle risorse, non possiamo fornire lo stesso nome file. Il vantaggio di res / raw è maggiore per garantire che il nome del file sia sempre corretto.
Elye

-5

Le risorse forniscono un modo per includere file arbitrari come testo, xml, caratteri, musica e video nell'applicazione. Se provi a includere questi file come "risorse", Android li elaborerà nel suo sistema di risorse e non sarai in grado di ottenere i dati grezzi. Se vuoi accedere ai dati senza essere toccato, le risorse sono un modo per farlo.


6
Questo non è corretto. Se inserisci i dati res/raw, puoi ottenere i dati grezzi usando openRawResource(resourceName).
Ted Hopp

Ho opengles texture e file shader in una libreria. I DEVO utilizzare res / raw per la memorizzazione. Uso InputStream e BitmapFactory per leggerli. Aggiungerò questo come commento indipendente.
dturvene

1
Sembra copiato da Xamarin Microsoft docs. Fornisci la tua fonte quando copi il testo. docs.microsoft.com/en-us/xamarin/android/app-fundamentals/…
Sjoerd Pottuit
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.