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

266

Je sais que les fichiers du resrépertoire sont accessibles à partir du R.classmoment où les actifs se comportent comme un système de fichiers, mais je voudrais 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 vraies différences entre les ressources et les actifs?

Cris
la source

Réponses:

284

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 les actifs. De plus, 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 qui sont vérifiés au moment de la compilation, il y a donc moins de possibilité de disparités 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 souhaitez calculer l'élément que vous souhaitez 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 ressource pouvant être utilisés et calculer un index dans la liste. (C'est un peu gênant et présente des possibilités d'erreur si l'ensemble des ressources change au cours du cycle de développement.) (EDIT: vous pouvez récupérer un ID de ressource par son nom en utilisant getIdentifier, mais cela perd les avantages de la vérification à la compilation.) Les actifs peuvent être également organisé en 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.

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. Pour les actifs, cela ne se produit pas; les fichiers de ressources doivent être présents dans le répertoire des actifs du ou des projets d'application. [EDIT: Avec le nouveau système de construction basé sur Gradle d'Android (utilisé avec Android Studio), ce n'est plus vrai. Les répertoires d'actifs pour les projets de bibliothèque sont regroupés dans les fichiers .aar, de sorte que les actifs définis dans les projets de bibliothèque sont fusionnés dans les projets d'application (de sorte qu'ils n'ont pas besoin d'être présents dans le /assetsrépertoire de l'application s'ils se trouvent dans une bibliothèque référencée).]

EDIT: Une autre différence survient si vous souhaitez empaqueter une police personnalisée avec votre application. Il existe des appels d'API pour créer un à Typefacepartir d'un fichier de police stocké dans le système de fichiers ou dans le assets/répertoire de votre application . Mais il n'y a pas d'API pour créer un à Typefacepartir d'un fichier de police stocké dans le res/répertoire (ou à partir d'un InputStream, ce qui permettrait d'utiliser le res/répertoire). [ REMARQUE: avec Android O (désormais disponible en aperçu 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 de 25 ou moins, vous devrez vous limiter à empaqueter les polices personnalisées en tant qu'actifs plutôt qu'en tant que ressources.]

Ted Hopp
la source
1
resreprésente les ressources, alors qu'est-ce que assetssignifie ??
Vivek Warde
40
@vwvwvwvwvwvwvwvwvw - Um ... il ne "représente" rien; cela signifie simplement «actifs» (comme au pluriel du mot anglais asset : une chose utile ou précieuse ).
Ted Hopp
1
Est-il possible d'écrire dans les fichiers du raw/répertoire?
Prince
6
@Prince - Non. Tout dans les /resrépertoires et '/ assets' est en lecture seule, car ils sont regroupés dans le fichier .apk.
Ted Hopp,
pouvons-nous mettre le fichier apk dans le dossier des actifs et lorsque l'utilisateur clique sur cette interface utilisateur, installez cet apk?
Vivek Mishra
63

Les deux sont assez similaires. La vraie différence principale entre les deux est que dans le resrépertoire, chaque fichier reçoit une pré-compilation ID qui est facilement accessible via R.id.[res id]. Ceci est utile pour accéder rapidement et facilement aux images, sons, icônes ...

Le assetsrépertoire ressemble plus à un système de fichiers et offre plus de liberté pour y mettre n'importe quel fichier que vous souhaitez. Vous pouvez ensuite accéder à chacun des fichiers de ce système comme vous le feriez lorsque vous accédez à n'importe quel fichier dans n'importe quel système de fichiers via Java. Ce répertoire est bon pour des choses telles que les détails du jeu, les dictionnaires, ... etc. J'espère que cela pourra aider.

DRiFTy
la source
5
Si nous voulons ajouter des polices externes dans notre application, nous les mettons dans le dossier des ressources.
Tushar Pandey
1
@TusharPandey Maintenant, nous n'avons pas besoin de mettre les polices dans un Assetsdossier, le système Android contient maintenant un fontsrépertoire et nous pouvons y mettre notre fichier de polices personnalisées ou nous pouvons le faire télécharger par Android studio.
CopsOnRoad
@Jack, c'est pour Oreo.
Tushar Pandey
1
@TusharPandey Il a été ajouté dans Oreo mais il a été de nouveau porté sur la bibliothèque de support Android depuis le niveau 16 de l'API.
CopsOnRoad
36

Je sais que c'est vieux, mais juste pour être clair, il y a une explication de chacun dans la documentation officielle d'Android:

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

assets/

C'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 tel quel et le nom de fichier d'origine est conservé. Vous pouvez parcourir ce répertoire de la même manière qu'un système de fichiers classique à l'aide d'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 des fichiers d'actifs ici plutôt que dans le répertoire assets / ne diffère que 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.

AntonyMCs
la source
4
Je pense que cela confond réellement le problème - les textures et les fichiers ogg sont de gros globes de données que vous alimentez vers une API utilisateur (openGL / MediaPlayer) ... pourquoi feraient-ils de la discrimination ici?
9

Voici quelques points clés:

  1. Les fichiers bruts doivent avoir des noms qui sont des identificateurs Java valides, tandis que les fichiers dans les actifs n'ont pas de restrictions d'emplacement et de nom. En d'autres termes, ils peuvent être regroupés dans les répertoires que nous souhaitons
  2. Les fichiers bruts sont faciles à consulter à partir de Java ainsi qu'à partir de xml (c'est-à-dire que vous pouvez référencer un fichier en raw à partir d'un fichier manifeste ou d'un autre fichier xml).
  3. L'enregistrement des fichiers d'actifs ici plutôt que dans le répertoire assets / 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. Pour les actifs, cela ne se produit pas; les fichiers de ressources doivent être présents dans le répertoire des actifs du ou des projets d'application
  5. Le répertoire des ressources ressemble davantage à un système de fichiers, ce qui offre plus de liberté pour y placer n'importe quel fichier que vous souhaitez. Vous pouvez ensuite accéder à chacun des fichiers de ce système comme vous le feriez lorsque vous accédez à n'importe quel fichier dans n'importe quel système de fichiers via Java. comme les fichiers de données de jeu, les polices, les textures, etc.
  6. Contrairement aux ressources, les actifs peuvent être organisés en sous-dossiers dans le répertoire des actifs. Cependant, la seule chose que vous pouvez faire avec un actif est d'obtenir un flux d'entrée. Ainsi, cela n'a pas beaucoup de sens de stocker vos chaînes ou bitmaps dans des ressources, 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 un contrôle de temps de compilation en générant votre fichier R.java. Cependant, si vous souhaitez copier votre base de données dans un répertoire privé, vous pouvez utiliser des ressources conçues pour le streaming.

Conclusion

  1. L'API Android comprend un cadre de ressources très confortable qui est également optimisé pour la plupart des cas d'utilisation typiques pour diverses applications mobiles. Vous devez maîtriser les ressources et essayer de les utiliser dans la mesure du possible.
  2. Cependant, si vous avez besoin de plus de flexibilité pour votre cas particulier, les actifs sont là pour vous donner une API de niveau inférieur qui permet d'organiser et de traiter vos ressources avec un degré de liberté plus élevé.
Shubhang Malviya
la source
Selon la réponse acceptée, le point 4 n'est plus vrai pour les projets utilisant le système de construction Gradle; les ressources des bibliothèques sont regroupées dans la collection de ressources du projet d'application.
Venryx
4

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

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

L.Butz
la source
6
Vous pouvez également accéder aux fichiers dans les actifs de Java
Heiko Rupp
2
Oui, mais ils ne sont pas indexés -> Ce sera plus lent, quel est le vrai problème du développement mobile.
L.Butz
alors, quelle est la différence entre res / raw et asset? Est-ce que res / raw sera également indexé?
anticafe
Vérifiez le message de @TedHopp - Il apporte la réponse vraiment claire.
L.Butz
1

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

Bajji
la source
0

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

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

dturvene
la source
1
Le point 2, de la prise en charge InputStreams et BitmapFactory, est vrai pour les ressources et les actifs (voir ici: stackoverflow.com/a/8501428/2441655 ). Le point 3 ne s'applique plus. (voir réponse acceptée)
Venryx
-5

Les ressources permettent d'inclure des fichiers arbitraires tels que du texte, du xml, des polices, de la musique et des vidéos dans votre application. Si vous essayez d'inclure ces fichiers en tant que "ressources", Android les traitera dans son système de ressources et vous ne pourrez pas obtenir les données brutes. Si vous souhaitez accéder à des données intactes, les actifs sont un moyen de le faire.

KCRaju
la source
5
Ceci est une erreur. Si vous introduisez des données res/raw, vous pouvez accéder aux données brutes en utilisant openRawResource(resourceName).
Ted Hopp
J'ai des fichiers de texture et de shaders opengles dans une bibliothèque. Je DOIS utiliser res / raw pour les stocker. J'utilise InputStream et BitmapFactory pour les lire. Je vais ajouter ceci en tant que commentaire indépendant.
dturvene
Semble copié à partir des documents Microsoft Xamarin. Donnez votre source lors de la copie de texte. docs.microsoft.com/en-us/xamarin/android/app-fundamentals/…
Sjoerd Pottuit