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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

из http://developer.android.com/tools/projects/index.html

assets/

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

res/raw/

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

Ответ 4

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

  • Необработанные файлы Должны иметь имена, которые являются действительными идентификаторами Java, тогда как файлы в активах Не имеют ограничений по местоположению и имени. В других слова, которые они могут быть сгруппированы в любые каталоги, которые мы хотим
  • Необработанные файлы Легко обращаться с Java, а также от xml (i.e вы можете отсылать файл в raw из манифеста или другого XML файла).
  • Сохранение файлов активов здесь, а не только в каталоге assets/ отличается тем, что вы обращаетесь к ним, как описано здесь http://developer.android.com/tools/projects/index.html.
  • Ресурсы, определенные в проекте библиотеки, автоматически импортируются в приложений, которые зависят от библиотеки. Для активов это не происходит; файлы активов должны присутствовать в каталоге активов проекта (-ов) приложения
  • Каталог активов больше похож на файловую систему, обеспечивающую большую свободу поставить любой файл, который вы хотели бы там. Затем вы можете получить доступ к каждому из файлы в этой системе, как при доступе к любому файлу в любом файловой системы через Java. как файлы данных игры, шрифты, текстуры и др.
  • В отличие от ресурсов, Активы могут быть организованы в подпапки в Каталог ресурсов Однако, единственное, что вы можете сделать с активом, - это получить входной поток. Таким образом, нет смысла хранить ваши строки или растровые изображения в активах, но вы можете хранить данные в пользовательском формате таких как словари коррекции ввода или карты игр.
  • Raw может дать вам проверку времени компиляции, создав файл R.java однако Если вы хотите скопировать свою базу данных в личный каталог, вы могут использовать активы, созданные для потоковой передачи.

Заключение

  • Android API включает очень удобную структуру ресурсов, которая также оптимизирована для большинства типичных случаев использования для различных мобильных приложений. Вы должны освоить ресурсы и попытаться использовать их там, где это возможно.
  • Однако, если вам требуется больше гибкости для вашего особого случая, Assets чтобы дать вам API более низкого уровня, который позволяет организовать и обрабатывая ваши ресурсы с большей степенью свободы.

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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