Diferencia entre los directorios / res y / assets

266

Sé que los archivos en el resdirectorio son accesibles desde R.classque los activos se comportan como un sistema de archivos, pero me gustaría saber, en general, cuándo es mejor usar uno y el otro.
¿Alguien puede ayudarme a conocer las diferencias reales entre res y activos?

Cris
fuente

Respuestas:

284

Con recursos, hay soporte incorporado para proporcionar alternativas para diferentes idiomas, versiones de sistema operativo, orientaciones de pantalla, etc., como se describe aquí . Nada de eso está disponible con activos. Además, muchas partes de la API admiten el uso de identificadores de recursos. Finalmente, los nombres de los recursos se convierten en nombres de campo constantes que se verifican en el momento de la compilación, por lo que hay menos oportunidades de desajustes entre el código y los recursos mismos. Nada de eso se aplica a los activos.

Entonces, ¿por qué tener una carpeta de activos? Si desea calcular el activo que desea usar en tiempo de ejecución, es bastante fácil. Con los recursos, debería declarar una lista de todos los ID de recursos que podrían usarse y calcular un índice en la lista. (Esto es un poco incómodo e introduce oportunidades de error si el conjunto de recursos cambia en el ciclo de desarrollo). (EDITAR: puede recuperar un ID de recurso por nombre usando getIdentifier, pero esto pierde los beneficios de la verificación en tiempo de compilación). También se organizará en una jerarquía de carpetas, que no es compatible con los recursos. Es una forma diferente de administrar los datos. Aunque los recursos cubren la mayoría de los casos, los activos tienen su uso ocasional.

Otra diferencia: los recursos definidos en un proyecto de biblioteca se importan automáticamente a proyectos de aplicación que dependen de la biblioteca. Para los activos, eso no sucede; los archivos de activos deben estar presentes en el directorio de activos de los proyectos de la aplicación. [EDITAR: con el nuevo sistema de compilación basado en Gradle de Android (usado con Android Studio), esto ya no es cierto. Los directorios de activos para proyectos de biblioteca se empaquetan en los archivos .aar, por lo que los activos definidos en proyectos de biblioteca se fusionan en proyectos de aplicación (por lo que no tienen que estar presentes en el /assetsdirectorio de la aplicación si están en una biblioteca referenciada).

EDITAR: Sin embargo, surge otra diferencia si desea empaquetar una fuente personalizada con su aplicación. Hay llamadas API para crear un Typefacearchivo de fuente almacenado en el sistema de archivos o en el assets/directorio de su aplicación . Pero no hay una API para crear un Typefacearchivo de fuente almacenado en el res/directorio (o de un archivo InputStreamque permita el uso del res/directorio). [ NOTA: con Android O (ahora disponible en versión preliminar alfa) podrá incluir fuentes personalizadas como recursos. Vea la descripción aquí de esta característica que se ha retrasado mucho. Sin embargo, siempre que su nivel mínimo de API sea de 25 o menos, tendrá que seguir empaquetando las fuentes personalizadas como activos en lugar de como recursos.]

Ted Hopp
fuente
1
ressignifica recursos, entonces ¿qué assetssignifica?
Vivek Warde
40
@vwvwvwvwvwvwvwvwvw - Um ... no "representa" nada; simplemente significa "activos" (como en el plural de la palabra en inglés activo : algo útil o valioso ).
Ted Hopp
1
¿Es posible escribir en los archivos del raw/directorio?
Príncipe
66
@Prince - No. Todo en los /resdirectorios y '/ assets' es de solo lectura, ya que están empaquetados en el archivo .apk.
Ted Hopp
¿podemos poner el archivo apk en la carpeta de activos y cuando el usuario hace clic en esa interfaz de usuario instalar esa apk?
Vivek Mishra
63

Ambos son bastante similares. La principal diferencia real entre los dos es que en el resdirectorio cada archivo tiene un precompilado al ID que se puede acceder fácilmente R.id.[res id]. Esto es útil para acceder rápida y fácilmente a imágenes, sonidos, íconos ...

El assetsdirectorio se parece más a un sistema de archivos y proporciona más libertad para colocar allí cualquier archivo que desee. Luego puede acceder a cada uno de los archivos en ese sistema como lo haría al acceder a cualquier archivo en cualquier sistema de archivos a través de Java. Este directorio es bueno para cosas como detalles del juego, diccionarios, ... etc. Espero que ayude.

SECADO
fuente
55
Si queremos agregar external_fonts en nuestra aplicación, los ponemos en la carpeta de activos.
Tushar Pandey
1
@TusharPandey Ahora no tenemos que poner las fuentes en la Assetscarpeta, el sistema Android ahora contiene un fontsdirectorio y podemos poner nuestro archivo de fuentes personalizado allí o podemos hacer que Android Studio nos lo descargue.
CopsOnRoad
@ Jack, es para Oreo.
Tushar Pandey
1
@TusharPandey Se añadió en Oreo, pero se ha portado a volver hacia atrás manera Biblioteca androide de la ayuda a nivel de la API 16.
CopsOnRoad
36

Sé que esto es antiguo, pero solo para aclararlo, hay una explicación de cada uno en la documentación oficial de Android:

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

assets/

Esto esta vacio. Puede usarlo para almacenar archivos de activos sin procesar. Los archivos que guarde aquí se compilan en un archivo .apk tal cual y se conserva el nombre de archivo original. Puede navegar por este directorio de la misma manera que un sistema de archivos típico usando URI y leer archivos como una secuencia de bytes usando el AssetManager. Por ejemplo, esta es una buena ubicación para texturas y datos del juego.

res/raw/

Para archivos arbitrarios de activos sin formato. Guardar archivos de activos aquí en lugar de en el directorio assets / solo difiere en la forma en que accede a ellos. Estos archivos son procesados ​​por aapt y deben ser referenciados desde la aplicación usando un identificador de recurso en la clase R. Por ejemplo, este es un buen lugar para medios, como archivos MP3 u Ogg.

AntonyMCs
fuente
44
Creo que esto realmente confunde el problema: tanto las texturas como los archivos ogg son grandes cantidades de datos que usted alimenta a una API de usuario (openGL / MediaPlayer) ... ¿por qué discriminarían aquí?
9

Los siguientes son algunos puntos clave:

  1. Los archivos sin formato deben tener nombres que sean identificadores válidos de Java, mientras que los archivos en Activos no tienen restricciones de ubicación y nombre. En otras palabras, pueden agruparse en los directorios que deseemos.
  2. Los archivos sin formato son fáciles de consultar tanto desde Java como desde xml (es decir, puede hacer referencia a un archivo sin formato desde el archivo de manifiesto u otro archivo xml).
  3. Guardar archivos de activos aquí en lugar de en el directorio assets / solo difiere en la forma en que accede a ellos como se documenta aquí http://developer.android.com/tools/projects/index.html .
  4. Los recursos definidos en un proyecto de biblioteca se importan automáticamente a proyectos de aplicación que dependen de la biblioteca. Para los activos, eso no sucede; los archivos de activos deben estar presentes en el directorio de activos de los proyectos de aplicación
  5. El directorio de activos se parece más a un sistema de archivos que proporciona más libertad para colocar cualquier archivo que desee allí. Luego puede acceder a cada uno de los archivos en ese sistema como lo haría al acceder a cualquier archivo en cualquier sistema de archivos a través de Java. como archivos de datos del juego, fuentes, texturas, etc.
  6. A diferencia de los recursos, los activos se pueden organizar en subcarpetas en el directorio de activos. Sin embargo, lo único que puede hacer con un activo es obtener una secuencia de entrada. Por lo tanto, no tiene mucho sentido almacenar sus cadenas o mapas de bits en activos, pero puede almacenar datos de formato personalizado, como diccionarios de corrección de entrada o mapas de juegos.
  7. Sin embargo, Raw puede darle una verificación de tiempo de compilación al generar su archivo R.java. Sin embargo, si desea copiar su base de datos en un directorio privado, puede usar Assets que están hechos para la transmisión.

Conclusión

  1. La API de Android incluye un marco de recursos muy cómodo que también está optimizado para la mayoría de los casos de uso típicos para varias aplicaciones móviles. Debe dominar los recursos e intentar usarlos siempre que sea posible.
  2. Sin embargo, si necesita más flexibilidad para su caso especial, los Activos están ahí para brindarle un API de nivel inferior que le permite organizar y procesar sus recursos con un mayor grado de libertad.
Shubhang Malviya
fuente
Según la respuesta aceptada, el punto 4 ya no es cierto, para proyectos que utilizan el sistema de construcción Gradle; los activos de las bibliotecas se agrupan en la colección de activos del proyecto de la aplicación.
Venryx
4

Si necesita referirlos a algún lugar del Código Java, deberá colocar sus archivos en el directorio "res".

Y todos los archivos en la carpeta res se indexarán en el archivo R, lo que hace que sea mucho más rápido (¡y mucho más fácil!) Cargarlos.

L.Butz
fuente
66
También puede acceder a los archivos en activos desde Java
Heiko Rupp
2
Sí, pero no están indexados -> Será más lento, lo que es un problema real en el desarrollo móvil.
L.Butz
Entonces, ¿cuál es la diferencia entre res / raw y activo? ¿Res / raw también se indexará?
anticafe
Revise la publicación de @TedHopp: trae la respuesta realmente clara.
L.Butz
1

Use activos como un sistema de archivos para volcar cualquier tipo de archivos. Y use res para almacenar para qué está hecho, diseños, imágenes, valores.

Bajji
fuente
0

Ted Hopp respondió esto muy bien. He estado usando res / raw para mis archivos de textura y sombreador de opengl. Estaba pensando en moverlos a un directorio de activos para proporcionar una organización jerárquica.

Este hilo me convenció de no hacerlo. Primero, porque me gusta el uso de una identificación de recurso única. Segundo, porque es muy simple usar InputStream / openRawResource o BitmapFactory para leer en el archivo. Tercero, porque es muy útil poder usarlo en una biblioteca portátil.

dturvene
fuente
1
El punto 2, de soporte de InputStreams y BitmapFactory, es cierto tanto para recursos como para activos (ver aquí: stackoverflow.com/a/8501428/2441655 ). El punto 3 ya no se aplica. (ver respuesta aceptada)
Venryx
-5

Los activos proporcionan una manera de incluir archivos arbitrarios como texto, xml, fuentes, música y video en su aplicación. Si intenta incluir estos archivos como "recursos", Android los procesará en su sistema de recursos y no podrá obtener los datos sin procesar. Si desea acceder a datos intactos, los activos son una forma de hacerlo.

KCRaju
fuente
55
Esto es incorrecto. Si ingresa datos res/raw, puede obtener datos sin procesar utilizando openRawResource(resourceName).
Ted Hopp
Tengo opengles textura y archivos de sombreado en una biblioteca. Me DEBE utilizar res / primas para almacenarlas. Yo uso InputStream y BitmapFactory para leerlos. Agregaré esto como un comentario independiente.
dturvene
Parece copiado de los documentos de Xamarin Microsoft. Proporcione su fuente al copiar texto. docs.microsoft.com/en-us/xamarin/android/app-fundamentals/…
Sjoerd Pottuit