web-dev-qa-db-fra.com

Différence entre les répertoires / res et / assets

Je sais que les fichiers du répertoire res sont accessibles depuis R.class alors que les actifs se comportent comme un système de fichiers, mais j'aimerais savoir, en général, quand il est préférable d'utiliser l'un et l'autre.
Quelqu'un peut-il m'aider à connaître les véritables différences entre les ressources et les actifs?

259
Cris

Avec les ressources, il existe un support intégré pour fournir des alternatives pour différentes langues, versions de système d'exploitation, orientations d'écran, etc., comme décrit ici . Rien de tout cela n'est disponible avec des actifs. En outre, de nombreuses parties de l'API prennent en charge l'utilisation d'identificateurs de ressources. Enfin, les noms des ressources sont transformés en noms de champs constants vérifiés au moment de la compilation, ce qui réduit les risques d'incohérences entre le code et les ressources elles-mêmes. Rien de tout cela ne s'applique aux actifs.

Alors pourquoi avoir un dossier d'actifs? Si vous voulez calculer l'actif que vous voulez utiliser au moment de l'exécution, c'est assez simple. Avec les ressources, vous devez déclarer une liste de tous les ID de ressources pouvant être utilisés et calculer un index dans la liste. (Ceci est assez maladroit et introduit des possibilités d'erreur si l'ensemble des ressources change dans le cycle de développement.) (EDIT: vous pouvez récupérer un ID de ressource par son nom en utilisant getIdentifier , mais les avantages de vérification au moment de la compilation.) Les actifs peuvent également être organisés dans une hiérarchie de dossiers, qui n’est pas prise en charge par les ressources. C'est une façon différente de gérer les données. Bien que les ressources couvrent la plupart des cas, les actifs ont leur utilisation occasionnelle.

Une autre différence: les ressources définies dans un projet de bibliothèque sont automatiquement importées dans des projets d'application qui dépendent de la bibliothèque. Cela ne se produit pas pour les actifs. Les fichiers d'actif doivent être présents dans le répertoire des actifs du (des) projet (s) d'application. [EDIT: Avec le nouveau système de construction d'Android système de construction basé sur Gradle (utilisé avec Android Studio), ce n'est plus vrai. Les répertoires d'actifs des projets de bibliothèque sont regroupés dans les fichiers .aar. Par conséquent, les actifs définis dans les projets de bibliothèque sont fusionnés dans les projets d'application (ils ne doivent donc pas nécessairement figurer dans le répertoire /assets de l'application s'ils se trouvent dans une bibliothèque référencée). .]

EDIT: Une autre différence se produit si vous souhaitez créer une police personnalisée avec votre application. Il existe appels d'API pour créer un Typeface à partir d'un fichier de police stocké dans le système de fichiers ou dans le répertoire assets/ de votre application. Mais il n’existe pas d’API permettant de créer un Typeface à partir d’un fichier de polices stocké dans le répertoire res/ (ou d’un InputStream permettant d’utiliser le répertoire res/). [ REMARQUE: Avec Android O (maintenant disponible en prévisualisation alpha), vous pourrez inclure des polices personnalisées en tant que ressources. Voir la description ici de cette fonctionnalité attendue depuis longtemps. Cependant, tant que votre niveau d'API minimum est égal ou inférieur à 25, vous devrez vous en tenir à la personnalisation des polices personnalisées en tant qu'actifs plutôt qu'en tant que ressources.]

275
Ted Hopp

Les deux sont assez similaires. La principale différence entre les deux réside dans le fait que, dans le répertoire res, un fichier ID pré-compilé est attribué à chaque fichier, auquel on peut facilement accéder via R.id.[res id]. Ceci est utile pour accéder rapidement et facilement aux images, sons, icônes ...

Le répertoire assets ressemble plus à un système de fichiers et offre plus de liberté pour y placer le fichier de votre choix. Vous pouvez ensuite accéder à chacun des fichiers de ce système comme vous le feriez pour tout fichier de n'importe quel système de fichiers via Java. Ce répertoire est utile pour des choses telles que les détails du jeu, les dictionnaires, ... etc. J'espère que ça t'as aidé.

60
DRiFTy

Je sais que c’est vieux, mais pour que ce soit bien clair, il existe une explication de chacun dans la documentation officielle Android:

à partir de http://developer.Android.com/tools/projects/index.html

assets/

Ceci est vide Vous pouvez l'utiliser pour stocker des fichiers d'actifs bruts. Les fichiers que vous enregistrez ici sont compilés dans un fichier .apk tels quels, et le nom de fichier d'origine est préservé. Vous pouvez naviguer dans ce répertoire de la même manière qu'un système de fichiers classique utilisant des URI et lire des fichiers sous forme de flux d'octets à l'aide de AssetManager. Par exemple, c’est un bon emplacement pour les textures et les données de jeu.

res/raw/

Pour les fichiers d'actifs bruts arbitraires. L'enregistrement de fichiers d'actif ici plutôt que dans le fichier/répertoire diffère uniquement par la façon dont vous y accédez. Ces fichiers sont traités par aapt et doivent être référencés à partir de l'application à l'aide d'un identifiant de ressource dans la classe R. Par exemple, c'est un bon endroit pour les médias, tels que les fichiers MP3 ou Ogg.

35
AntonyMCs

Voici quelques points clés:

  1. Fichiers bruts Doit avoir des noms qui sont des identifiants valides Java, alors que les fichiers dans Actifs n'ont pas de restrictions d'emplacement et de nom. En d'autres termes, ils peuvent être regroupés dans les répertoires souhaités
  2. Fichiers bruts Il est facile de se référer à Java ainsi qu’au XML (par exemple, vous pouvez faire référence à un fichier brut à partir d’un fichier manifeste ou d’un autre fichier xml).
  3. L'enregistrement des fichiers d'actif ici plutôt que dans le répertoire/actifs ne diffère que par la façon dont vous y accédez, comme indiqué ici http://developer.Android.com/tools/projects/index.html .
  4. Les ressources définies dans un projet de bibliothèque sont automatiquement importées dans des projets d'application qui dépendent de la bibliothèque. Cela ne se produit pas pour les actifs. les fichiers d'actif doivent être présents dans le répertoire des actifs du (des) projet (s) d'application
  5. Le répertoire assets ressemble plus à un système de fichiers, ce qui offre plus de liberté pour y placer tous les fichiers que vous souhaitez. Vous pouvez ensuite accéder à chacun des fichiers de ce système comme vous le feriez pour tous les fichiers de n’importe quel système de fichiers via Java. comme les fichiers de données de jeu, les polices de caractères, les textures, etc.
  6. Contrairement aux ressources, les actifs peuvent être organisés en sous-dossiers dans le répertoire des actifs. Toutefois, la seule chose que vous pouvez faire avec un actif est d'obtenir un flux d'entrée. Par conséquent, il n’a pas beaucoup de sens de stocker vos chaînes ou vos bitmaps dans des actifs, mais vous pouvez stocker des données au format personnalisé, telles que des dictionnaires de correction d’entrée ou des cartes de jeu.
  7. Raw peut vous donner une vérification de la compilation en générant votre fichier R.Java. Toutefois, si vous souhaitez copier votre base de données dans un répertoire privé, vous pouvez utiliser les actifs conçus pour la diffusion en continu.

Conclusion

  1. L'API Android comprend un cadre de ressources très confortable qui est également optimisé pour les cas d'utilisation les plus courants pour diverses applications mobiles. Vous devez maîtriser les ressources et essayer de les utiliser autant que possible.
  2. Toutefois, si vous avez besoin de plus de flexibilité pour votre cas particulier, Assets est là pour vous fournir une API de niveau inférieur qui permet d’organiser et de traiter vos ressources avec un degré de liberté plus élevé.
9
Shubhang Malviya

Si vous avez besoin de les référencer quelque part dans le code Java, vous devez placer vos fichiers dans le répertoire "res".

Et tous les fichiers du dossier res seront indexés dans le fichier R, ce qui rend le chargement beaucoup plus rapide (et beaucoup plus simple!).

4
L.Butz

Utilisez des ressources comme un système de fichiers pour vider n'importe quel type de fichier. Et utilisez res pour stocker ce pour quoi il est fait, des mises en page, des images, des valeurs.

1
Bajji

Ted Hopp a très bien répondu à cette question. J'utilise res/raw pour ma texture opengl et mes fichiers de shader. Je pensais les transférer dans un répertoire d’actifs afin de fournir une organisation hiérarchique.

Ce fil m'a convaincu de ne pas. Premièrement, parce que j'aime utiliser un identifiant de ressource unique. Deuxièmement, parce qu'il est très simple d'utiliser InputStream/openRawResource ou BitmapFactory pour lire le fichier. Troisièmement, il est très utile de pouvoir utiliser une bibliothèque portable.

0
dturvene