Diferença entre os diretórios / res e / assets


266

Eu sei que os arquivos no resdiretório são acessíveis R.classenquanto os ativos se comportam como um sistema de arquivos, mas eu gostaria de saber, em geral, quando é melhor usar um e outro.
Alguém pode me ajudar a conhecer as diferenças reais entre recursos e recursos?

Respostas:


284

Com recursos, há suporte interno para fornecer alternativas para diferentes idiomas, versões de SO, orientações de tela etc., conforme descrito aqui . Nada disso está disponível com ativos. Além disso, muitas partes da API suportam o uso de identificadores de recursos. Por fim, os nomes dos recursos são transformados em nomes de campo constantes que são verificados no momento da compilação, para que haja menos oportunidades de incompatibilidade entre o código e os próprios recursos. Nada disso se aplica aos ativos.

Então, por que ter uma pasta de ativos? Se você deseja calcular o ativo que deseja usar em tempo de execução, é muito fácil. Com os recursos, você teria que declarar uma lista de todos os IDs de recursos que poderiam ser usados ​​e computar um índice na lista. (Isso é meio estranho e apresenta oportunidades de erro se o conjunto de recursos mudar no ciclo de desenvolvimento.) (EDIT: você pode recuperar um ID de recurso por nome usando getIdentifier, mas isso perde os benefícios da verificação em tempo de compilação.) também ser organizado em uma hierarquia de pastas, que não é suportada por recursos. É uma maneira diferente de gerenciar dados. Embora os recursos abranjam a maioria dos casos, os ativos têm seu uso ocasional.

Outra diferença: os recursos definidos em um projeto de biblioteca são importados automaticamente para projetos de aplicativos que dependem da biblioteca. Para ativos, isso não acontece; os arquivos de ativos devem estar presentes no diretório de ativos dos projetos de aplicativos. [EDIT: Com o novo sistema de compilação baseado no Gradle do Android (usado com o Android Studio), isso não é mais verdade. Os diretórios de ativos para projetos de bibliotecas são compactados nos arquivos .aar; portanto, os ativos definidos nos projetos de bibliotecas são mesclados em projetos de aplicativos (para que eles não precisem estar presentes no /assetsdiretório do aplicativo se estiverem em uma biblioteca referenciada).]

EDIT: Existe outra diferença se você deseja compactar uma fonte personalizada com seu aplicativo. Existem chamadas de API para criar a Typefacepartir de um arquivo de fonte armazenado no sistema de arquivos ou no assets/diretório do seu aplicativo . Mas não há API para criar a Typefacepartir de um arquivo de fonte armazenado no res/diretório (ou de um InputStream, o que permitiria o uso do res/diretório). [ NOTA: Com o Android O (agora disponível na visualização alfa), você poderá incluir fontes personalizadas como recursos. Veja a descrição aqui deste recurso atrasado. No entanto, desde que o seu nível mínimo de API seja 25 ou menos, você terá que empacotar fontes personalizadas como ativos e não como recursos.]


1
ressignifica recursos, então o que assetssignifica?
Vivek Warde

40
@vwvwvwvwvwvwvwvwvw - Hum ... não significa "nada"; significa simplesmente "ativos" (como no plural da palavra em inglês ativo : algo útil ou valioso ).
Ted Hopp

1
É possível gravar nos arquivos no raw/diretório?
Prince

6
@Prince - Não. Tudo nos /resdiretórios e '/ assets' é somente leitura, pois são empacotados no arquivo .apk.
Ted Hopp

podemos colocar o arquivo apk na pasta assets e quando o usuário clicar na interface do usuário instalar o apk?
Vivek Mishra

63

Ambos são bem parecidos. A principal diferença real entre os dois é que no resdiretório cada arquivo recebe uma pré-compilação ID que pode ser acessada facilmente R.id.[res id]. É útil para acessar rápida e facilmente imagens, sons, ícones ...

O assetsdiretório é mais como um sistema de arquivos e oferece mais liberdade para colocar qualquer arquivo que você quiser lá. Você pode acessar cada um dos arquivos nesse sistema como faria ao acessar qualquer arquivo em qualquer sistema de arquivos por meio de Java. Este diretório é bom para coisas como detalhes de jogos, dicionários, etc. Espero que ajude.


5
Se quisermos adicionar external_fonts em nosso aplicativo, colocamos na pasta de ativos.
Tushar Pandey

1
@TusharPandey Agora não precisamos colocar as fontes na Assetspasta, o sistema Android agora contém o fontsdiretório e podemos colocar nosso arquivo de fontes personalizadas lá ou podemos fazer o download do Android studio para nós.
CopsOnRoad

@ Jack, é para Oreo.
Tushar Pandey

1
@TusharPandey Foi adicionado no Oreo, mas foi portado novamente para a Biblioteca de Suporte Android, voltando ao nível 16. da API.
CopsOnRoad

36

Eu sei que isso é antigo, mas apenas para deixar claro, há uma explicação de cada um na documentação oficial do Android:

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

assets/

Isto está vazio. Você pode usá-lo para armazenar arquivos de ativos brutos. Os arquivos que você salva aqui são compilados em um arquivo .apk como estão e o nome do arquivo original é preservado. Você pode navegar neste diretório da mesma maneira que um sistema de arquivos típico usando URIs e ler arquivos como um fluxo de bytes usando o AssetManager. Por exemplo, este é um bom local para texturas e dados de jogos.

res/raw/

Para arquivos de ativos brutos arbitrários. Salvar arquivos de ativos aqui em vez de no diretório assets / difere apenas na maneira como você os acessa. Esses arquivos são processados ​​pelo aapt e devem ser referenciados no aplicativo usando um identificador de recurso na classe R. Por exemplo, este é um bom lugar para mídia, como arquivos MP3 ou Ogg.


4
Eu acho que isso realmente confunde o problema - tanto as texturas quanto os arquivos ogg são grandes quantidades de dados que você alimenta para uma API do usuário (openGL / MediaPlayer) ... por que eles discriminariam aqui?

9

A seguir estão alguns pontos-chave:

  1. Arquivos brutos Deve ter nomes que sejam identificadores Java válidos, enquanto os arquivos em Ativos não têm restrições de local e nome. Em outras palavras, eles podem ser agrupados em qualquer diretório que desejarmos
  2. Arquivos brutos São fáceis de consultar a partir de Java e também de xml (ou seja, você pode consultar um arquivo em bruto de manifesto ou outro arquivo xml).
  3. Salvar arquivos de ativos aqui em vez de no diretório assets / difere apenas na maneira como você os acessa, conforme documentado aqui http://developer.android.com/tools/projects/index.html .
  4. Os recursos definidos em um projeto de biblioteca são importados automaticamente para projetos de aplicativos que dependem da biblioteca. Para ativos, isso não acontece; os arquivos de ativos devem estar presentes no diretório de ativos do (s) projeto (s) do aplicativo
  5. O diretório de ativos é mais parecido com um sistema de arquivos, oferecendo mais liberdade para colocar qualquer arquivo que você desejar. Você pode acessar cada um dos arquivos nesse sistema como faria ao acessar qualquer arquivo em qualquer sistema de arquivos por meio de Java. como arquivos de dados do jogo, fontes, texturas etc.
  6. Diferentemente de Recursos, os ativos podem ser organizados em subpastas no diretório de ativos. No entanto, a única coisa que você pode fazer com um ativo é obter um fluxo de entrada. Portanto, não faz muito sentido armazenar suas seqüências de caracteres ou bitmaps em ativos, mas você pode armazenar dados de formato personalizado, como dicionários de correção de entrada ou mapas de jogos.
  7. Raw pode fornecer uma verificação do tempo de compilação, gerando seu arquivo R.java, no entanto. Se você deseja copiar seu banco de dados para o diretório privado, pode usar Ativos criados para streaming.

Conclusão

  1. A API do Android inclui uma estrutura de Recursos muito confortável, que também é otimizada para os casos de uso mais comuns de vários aplicativos móveis. Você deve dominar os Recursos e tentar usá-los sempre que possível.
  2. No entanto, se você precisar de mais flexibilidade para o seu caso especial, os Ativos estão disponíveis para fornecer uma API de nível inferior que permite organizar e processar seus recursos com um maior grau de liberdade.

De acordo com a resposta aceita, o ponto 4 não é mais verdadeiro para projetos que usam o sistema de construção Gradle; ativos de bibliotecas são agrupados na coleção de ativos do projeto de aplicativo.
Venryx 28/02

4

Se você precisar encaminhá-los para algum lugar do código Java, deverá colocar seus arquivos no diretório "res".

E todos os arquivos na pasta res serão indexados no arquivo R, o que torna muito mais rápido (e muito mais fácil!) Carregá-los.


6
Você pode acessar os arquivos em ativos de Java bem
Heiko Rupp

2
Sim, mas eles não são indexados -> Serão mais lentos, o que é um problema real no desenvolvimento móvel.
precisa saber é o seguinte

então, qual é a diferença entre res / raw e asset? Res / raw também será indexado?
Anticafe

Confira o Post de @TedHopp - Ele traz a resposta muito clara.
L.Butz

1

Use ativos como um sistema de arquivos para despejar qualquer tipo de arquivo. E use res para armazenar para o que é feito, layouts, imagens, valores.


0

Ted Hopp respondeu isso muito bem. Eu tenho usado res / raw para meus arquivos de textura e sombreamento opengl. Eu estava pensando em movê-los para um diretório de ativos para fornecer uma organização hierárquica.

Essa discussão me convenceu a não fazê-lo. Primeiro, porque gosto do uso de um ID de recurso exclusivo. Segundo, porque é muito simples usar InputStream / openRawResource ou BitmapFactory para ler o arquivo. Terceiro, porque é muito útil poder usar em uma biblioteca portátil.


1
O ponto 2, de suporte a InputStreams e BitmapFactory, é verdadeiro para recursos e ativos (consulte aqui: stackoverflow.com/a/8501428/2441655 ). O ponto 3 não se aplica mais. (ver resposta aceite)
Venryx

-5

Os ativos fornecem uma maneira de incluir arquivos arbitrários como texto, xml, fontes, música e vídeo em seu aplicativo. Se você tentar incluir esses arquivos como "recursos", o Android os processará em seu sistema de recursos e você não poderá obter os dados brutos. Se você deseja acessar dados intocados, os Ativos são uma maneira de fazê-lo.


5
Isto está incorreto. Se você inserir dados res/raw, poderá acessar os dados brutos usando openRawResource(resourceName).
Ted Hopp

Tenho arquivos de textura e sombreamento opengles em uma biblioteca. I deve usar res / matérias para armazená-los. Eu uso InputStream e BitmapFactory para lê-los. Vou adicionar isso como um comentário independente.
precisa saber é o seguinte

Parece copiado do Xamarin Microsoft docs. Forneça sua fonte ao copiar texto. docs.microsoft.com/en-us/xamarin/android/app-fundamentals/…
Sjoerd Pottuit
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.