Разница между каталогами / res и / assets

266

Я знаю, что файлы в resкаталоге доступны из-за того R.class, что ресурсы ведут себя как файловая система, но я хотел бы знать, в общем, когда лучше использовать один и другой.
Может ли кто-нибудь помочь мне узнать реальные различия между ресурсами и ресурсами?

Cris
источник

Ответы:

284

С ресурсами есть встроенная поддержка для предоставления альтернатив для разных языков, версий ОС, ориентации экрана и т. Д., Как описано здесь . Ничего из этого не доступно с активами. Кроме того, многие части API поддерживают использование идентификаторов ресурсов. Наконец, имена ресурсов превращаются в постоянные имена полей, которые проверяются во время компиляции, поэтому меньше возможностей для несоответствий между кодом и самими ресурсами. Ничто из этого не относится к активам.

Так зачем вообще иметь папку с активами? Если вы хотите вычислить актив, который хотите использовать во время выполнения, это довольно просто. При использовании ресурсов вам придется объявить список всех идентификаторов ресурсов, которые могут быть использованы, и вычислить индекс в списке. (Это довольно неудобно и создает возможности для ошибок, если набор ресурсов изменяется в цикле разработки.) (РЕДАКТИРОВАТЬ: вы можете получить идентификатор ресурса по имени, используя getIdentifier, но это теряет преимущества проверки во время компиляции.) Ресурсы могут также может быть организован в иерархию папок, которая не поддерживается ресурсами. Это другой способ управления данными. Хотя ресурсы покрывают большую часть случаев, активы время от времени используются.

Еще одно отличие: ресурсы, определенные в проекте библиотеки, автоматически импортируются в проекты приложений, которые зависят от библиотеки. Для активов этого не происходит; файлы ресурсов должны присутствовать в каталоге ресурсов проекта (ов) приложения. [РЕДАКТИРОВАТЬ: с новой системой сборки на базе Gradle Android (используется с Android Studio), это больше не так. Каталоги активов для библиотечных проектов упакованы в файлы .aar, поэтому активы, определенные в библиотечных проектах, объединяются в проекты приложений (поэтому они не обязательно должны присутствовать в /assetsкаталоге приложения, если они находятся в ссылочной библиотеке).]

РЕДАКТИРОВАТЬ: еще одно различие возникает, если вы хотите, чтобы пакет собственного шрифта с вашим приложением. Есть вызовы API для создания Typefaceфайла шрифта, хранящегося в файловой системе или в каталоге вашего приложения assets/. Но нет API для создания Typefaceиз файла шрифта, хранящегося в res/каталоге (или из InputStream, который позволил бы использовать res/каталог). [ ПРИМЕЧАНИЕ: с Android O (теперь доступен в альфа-превью) вы сможете включать пользовательские шрифты в качестве ресурсов. Смотрите описание здесь этой давно просроченной функции. Однако, пока ваш минимальный уровень API составляет 25 или менее, вам придется придерживаться упаковки пользовательских шрифтов как ресурсов, а не ресурсов.]

Тед Хопп
источник
1
resозначает ресурсы, то что assetsозначает ??
Вивек Варде
40
@vwvwvwvwvwvwvwvwvw - Хм ... ничего не "стоит"; это просто означает «активы» (как во множественном числе от английского слова « актив» : полезная или ценная вещь ).
Тед Хопп
1
Можно ли записать файлы в raw/каталог?
Принц
6
@Prince - Нет. Все в /resкаталогах и '/ assets' доступно только для чтения, поскольку они упакованы в файл .apk.
Тед Хопп
мы можем поместить файл apk в папку assets, и когда пользователь нажмет на этот пользовательский интерфейс, установить этот apk?
Вивек Мишра
63

Оба очень похожи. Реальное основное различие между ними заключается в том, что в resкаталоге каждый файл имеет предварительно скомпилированный файл, к ID которому можно легко получить доступ R.id.[res id]. Это полезно для быстрого и удобного доступа к изображениям, звукам, значкам ...

assetsКаталог больше похожа на файловую систему и обеспечивает большую свободу , чтобы поместить любой файл , который вы хотели бы там. Затем вы можете получить доступ к каждому из файлов в этой системе, как если бы вы обращались к любому файлу в любой файловой системе через Java. Этот каталог хорош для таких вещей, как детали игры, словари и т. Д. Надеюсь, это поможет.

вьюжный
источник
5
Если мы хотим добавить external_fonts в наше приложение, мы помещаем их в папку активов.
Тушар Пандей
1
@TusharPandey Теперь нам не нужно помещать шрифты в Assetsпапку, система Android теперь содержит fontsкаталог, и мы можем поместить туда файл пользовательских шрифтов, или мы можем загрузить его для Android Studio.
CopsOnRoad
@ Джек, это для Орео.
Тушар Пандей
1
@TusharPandey Он был добавлен в Oreo, но он был снова портирован в библиотеку поддержки Android еще на уровень API 16.
CopsOnRoad
36

Я знаю, что это старый, но просто чтобы прояснить, есть объяснение каждого в официальной документации Android:

от http://developer.android.com/tools/projects/index.html

assets/

Это пусто. Вы можете использовать его для хранения необработанных файлов активов. Файлы, которые вы сохраняете здесь, скомпилированы в файл .apk как есть, и исходное имя файла сохраняется. Вы можете перемещаться по этому каталогу так же, как и в обычной файловой системе, используя URI, и читать файлы как поток байтов, используя AssetManager. Например, это хорошее место для текстур и игровых данных.

res/raw/

Для произвольных необработанных файлов активов. Сохранение файлов активов здесь, а не в каталоге assets /, зависит только от способа доступа к ним. Эти файлы обрабатываются aapt и на них нужно ссылаться из приложения, используя идентификатор ресурса в классе R. Например, это хорошее место для носителей, таких как файлы MP3 или Ogg.

AntonyMCs
источник
4
Я думаю, что это на самом деле сбивает с толку проблему - и текстуры, и файлы OGG представляют собой большие объемы данных, которые вы передаете в пользовательский API (openGL / MediaPlayer) ... почему они будут различать здесь?
9

Ниже приведены некоторые ключевые моменты:

  1. Необработанные файлы должны иметь имена, которые являются допустимыми идентификаторами Java, тогда как файлы в ресурсах не имеют ограничений по расположению и именам. Другими словами, они могут быть сгруппированы в любые каталоги, которые мы хотим
  2. Файлы в формате Raw легко ссылаться как из Java, так и из XML (т. Е. Вы можете ссылаться на файл в формате Raw из манифеста или другого файла XML).
  3. Сохранение файлов активов здесь, а не в каталоге assets /, отличается только тем, как вы к ним обращаетесь, как описано здесь http://developer.android.com/tools/projects/index.html .
  4. Ресурсы, определенные в проекте библиотеки, автоматически импортируются в проекты приложений, которые зависят от библиотеки. Для активов этого не происходит; файлы ресурсов должны присутствовать в каталоге ресурсов проекта (ов) приложения
  5. Каталог assets больше похож на файловую систему, предоставляя больше свободы для размещения любого файла, который вы бы хотели разместить там. Затем вы можете получить доступ к каждому из файлов в этой системе, как если бы вы обращались к любому файлу в любой файловой системе через Java. такие как файлы данных игр, шрифты, текстуры и т. д.
  6. В отличие от ресурсов, активы могут быть организованы в подпапки в каталоге ресурсов. Однако единственное, что вы можете сделать с активом, - это получить поток ввода. Таким образом, не имеет смысла хранить ваши строки или растровые изображения в активах, но вы можете хранить данные в произвольном формате, такие как словари коррекции ввода или игровые карты.
  7. Raw может дать вам проверку времени компиляции, сгенерировав файл R.java, однако, если вы хотите скопировать вашу базу данных в личный каталог, вы можете использовать Assets, которые созданы для потоковой передачи.

Вывод

  1. Android API включает очень удобную структуру ресурсов, которая также оптимизирована для наиболее типичных случаев использования различных мобильных приложений. Вы должны освоить ресурсы и стараться использовать их везде, где это возможно.
  2. Однако, если вам нужна большая гибкость для вашего особого случая, вы можете воспользоваться активами, чтобы предоставить вам API более низкого уровня, который позволяет организовывать и обрабатывать ваши ресурсы с большей степенью свободы.
Шубханг Мальвия
источник
Согласно принятому ответу, пункт 4 больше не соответствует действительности для проектов, использующих систему сборки Gradle; ресурсы из библиотек объединяются в коллекцию активов проекта приложения.
Venryx
4

Если вам нужно сослаться на них где-нибудь в Java-коде, вы, скорее всего, поместите ваши файлы в каталог res.

И все файлы в папке res будут проиндексированы в файле R, что значительно ускоряет (и значительно упрощает) их загрузку.

L.Butz
источник
6
Вы также можете получить доступ к файлам в ресурсах из Java
Heiko Rupp,
2
Да, но они не индексируются -> Будет медленнее, чем реальная проблема в разработке мобильных приложений.
Л.Бутц
Итак, в чем разница между res / raw и asset? Res / raw тоже будет проиндексирован?
Антифафе
Проверьте сообщение от @TedHopp - он приносит ответ действительно ясно.
Л.Бутц
1

Используйте ресурсы, такие как файловая система, для создания файлов любого типа. И используйте res, чтобы сохранить то, для чего он сделан, макеты, изображения, значения.

Bajji
источник
0

Тед Хопп ответил на это довольно хорошо. Я использовал res / raw для моих текстур opengl и файлов шейдеров. Я думал о перемещении их в каталог активов, чтобы обеспечить иерархическую организацию.

Эта тема убедила меня не делать этого. Во-первых, потому что мне нравится использование уникального идентификатора ресурса. Во-вторых, потому что очень просто использовать InputStream / openRawResource или BitmapFactory для чтения в файле. В-третьих, потому что очень полезно иметь возможность использовать в переносимой библиотеке.

dturvene
источник
1
Точка 2, поддерживающая InputStreams и BitmapFactory, верна как для ресурсов, так и для ресурсов (см. Здесь: stackoverflow.com/a/8501428/2441655 ). Пункт 3 больше не применяется. (см. принятый ответ)
Venryx
-5

Активы предоставляют возможность включать в ваше приложение произвольные файлы, такие как текст, xml, шрифты, музыку и видео. Если вы попытаетесь включить эти файлы в качестве «ресурсов», Android обработает их в своей системе ресурсов, и вы не сможете получить необработанные данные. Если вы хотите получить доступ к данным нетронутым, один из способов сделать это - актив.

KCRaju
источник
5
Это неверно Если вы вводите данные res/raw, вы можете получить необработанные данные, используя openRawResource(resourceName).
Тед Хопп
У меня есть файлы текстур и шейдеров opengles в библиотеке. Я ДОЛЖЕН использовать res / raw для их хранения. Я использую InputStream и BitmapFactory, чтобы прочитать их. Я добавлю это как независимый комментарий.
dturvene
Кажется, скопированы из Xamarin Microsoft документы. Укажите свой источник при копировании текста. docs.microsoft.com/en-us/xamarin/android/app-fundamentals/...
Сьерд Pottuit