Разница между каталогами /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 - один из способов сделать это.