Я знаю, что файлы в каталоге res
доступны из R.class
, в то время как ресурсы ведут себя как файловая система, но в целом я хотел бы знать, когда лучше всего использовать то и другое.
Может ли кто-нибудь помочь мне узнать реальные различия между res и assets?
Разница между каталогами / res и / assets
Ответы (8)
С ресурсами есть встроенная поддержка для предоставления альтернатив для разных языков, версий ОС, ориентации экрана и т. Д., Как описано здесь. Ничего из этого не доступно с активами. Кроме того, многие части API поддерживают использование идентификаторов ресурсов. Наконец, имена ресурсов превращаются в постоянные имена полей, которые проверяются во время компиляции, поэтому вероятность несоответствия между кодом и самими ресурсами меньше. Ничего из этого не касается активов.
Так зачем вообще нужна папка с активами? Если вы хотите вычислить актив, который хотите использовать во время выполнения, это довольно просто. С ресурсами вам нужно будет объявить список всех идентификаторов ресурсов, которые могут быть использованы, и вычислить индекс в этом списке. (Это немного неудобно и создает возможности для ошибки, если набор ресурсов изменяется в цикле разработки.) (РЕДАКТИРОВАТЬ: вы можете получить идентификатор ресурса по имени, используя _ 1_, но это теряет преимущества проверки во время компиляции.) Активы также могут быть организованы в иерархию папок, которая не поддерживается ресурсами. Это другой способ управления данными. Хотя ресурсы охватывают большинство случаев, активы используются время от времени.
Еще одно отличие: ресурсы, определенные в проекте библиотеки, автоматически импортируются в проекты приложений, которые зависят от библиотеки. Для активов этого не происходит; файлы ресурсов должны присутствовать в каталоге ресурсов проекта (ов) приложения. [РЕДАКТИРОВАТЬ: с новой системой сборки на основе Gradle Android (используется с Android Studio), это уже не так. Каталоги ресурсов для проектов библиотеки упакованы в файлы .aar, поэтому ресурсы, определенные в проектах библиотеки, объединяются в проекты приложений (поэтому они не обязательно должны находиться в каталоге /assets
приложения, если они находятся в библиотеке, на которую указывает ссылка).]
РЕДАКТИРОВАТЬ: Еще одна разница возникает, если вы хотите упаковать собственный шрифт в свое приложение. Существуют вызовы API для создания Typeface
из файла шрифта, хранящегося в в файловой системе или в каталоге assets/
вашего приложения. Но нет API для создания Typeface
из файла шрифта, хранящегося в каталоге res/
(или из InputStream
, что позволило бы использовать каталог res/
). [ПРИМЕЧАНИЕ. В Android O (теперь доступном в альфа-версии) вы сможете включать пользовательские шрифты в качестве ресурсов. См. Описание здесь этой давно назревшей функции. Однако до тех пор, пока ваш минимальный уровень API составляет 25 или меньше, вам придется придерживаться упаковки пользовательских шрифтов как ресурсов, а не ресурсов.]
res
означает ресурсы, тогда что означает assets
??
- person Vivek Warde; 13.06.2014
raw/
?
- person Prince; 13.05.2015
/res
и '/ assets' доступно только для чтения, поскольку они упакованы в файл .apk.
- person Ted Hopp; 13.05.2015
Оба очень похожи. Реальное главное различие между ними состоит в том, что в каталоге res
каждому файлу дается предварительно скомпилированный ID
, к которому можно легко получить доступ через R.id.[res id]
. Это полезно для быстрого и легкого доступа к изображениям, звукам, значкам ...
Каталог assets
больше похож на файловую систему и предоставляет больше свободы для размещения любого файла, который вам нужен. Затем вы можете получить доступ к каждому из файлов в этой системе, как если бы вы обращались к любому файлу в любой файловой системе через Java. Этот каталог хорош для таких вещей, как детали игры, словари и т. Д. Надеюсь, это поможет.
Assets
, система Android теперь содержит каталог fonts
, и мы можем поместить туда наш файл пользовательских шрифтов или попросить студию Android загрузить его для нас.
- person CopsOnRoad; 26.09.2017
Я знаю, что это устарело, но, чтобы было понятно, в официальной документации Android есть объяснение каждого из них:
из http://developer.android.com/tools/projects/index.html
assets/
Это пусто. Вы можете использовать его для хранения файлов сырых ресурсов. Файлы, которые вы сохраняете здесь, компилируются в файл .apk как есть, и сохраняется исходное имя файла. Вы можете перемещаться по этому каталогу так же, как в обычной файловой системе, используя URI, и читать файлы как поток байтов с помощью AssetManager. Например, это хорошее место для текстур и игровых данных.
res/raw/
Для произвольных файлов сырых ресурсов. Сохранение файлов ресурсов здесь, а не в каталоге assets / отличается только способом доступа к ним. Эти файлы обрабатываются aapt, и приложение должно ссылаться на них с помощью идентификатора ресурса в классе R. Например, это хорошее место для мультимедийных файлов, таких как файлы MP3 или Ogg.
Ниже приведены некоторые ключевые моменты:
- Необработанные файлы должны иметь имена, которые являются допустимыми идентификаторами Java, тогда как файлы в активах не имеют ограничений по расположению и именам. Другими словами, их можно сгруппировать в любые каталоги, которые мы пожелаем.
- Необработанные файлы. На них легко ссылаться как из Java, так и из xml (т.е. вы можете ссылаться на файл в необработанном виде из манифеста или другого файла xml).
- Сохранение файлов ресурсов здесь, а не в каталоге assets / отличается только способом доступа к ним, как описано здесь http://developer.android.com/tools/projects/index.html.
- Ресурсы, определенные в проекте библиотеки, автоматически импортируются в проекты приложений, которые зависят от библиотеки. Для активов этого не происходит; файлы ресурсов должны присутствовать в каталоге ресурсов проекта (ов) приложения.
- Каталог ресурсов больше похож на файловую систему, что дает больше свободы для размещения любого файла, который вы хотите. Затем вы можете получить доступ к каждому из файлов в этой системе, как если бы вы обращались к любому файлу в любой файловой системе через Java. например, файлы игровых данных, шрифты, текстуры и т. д.
- В отличие от ресурсов, активы могут быть организованы в подпапки в каталоге ресурсов. Однако единственное, что вы можете сделать с активом, - это получить входной поток. Таким образом, не имеет большого смысла хранить ваши строки или растровые изображения в активах, но вы можете хранить данные в настраиваемом формате, такие как словари коррекции ввода или игровые карты.
- Raw может предоставить вам проверку времени компиляции, создав ваш файл R.java, однако, если вы хотите скопировать свою базу данных в личный каталог, вы можете использовать Assets, которые созданы для потоковой передачи.
Заключение
- Android API включает очень удобную структуру ресурсов, которая также оптимизирована для наиболее типичных случаев использования различных мобильных приложений. Вам следует осваивать Ресурсы и стараться использовать их везде, где это возможно.
- Однако, если вам нужна большая гибкость для вашего особого случая, активы предназначены для предоставления вам API более низкого уровня, который позволяет организовывать и обрабатывать ваши ресурсы с более высокой степенью свободы.
Если вам нужно сослаться на них где-нибудь в Java-коде, вы должны поместить свои файлы в каталог «res».
И все файлы в папке res будут проиндексированы в файле R, что значительно ускоряет (и намного упрощает!) Их загрузку.
Используйте ресурсы, такие как файловая система, для дампа любых файлов. И используйте res для хранения того, для чего он создан, макетов, изображений, значений.
Тед Хопп ответил на это очень хорошо. Я использовал res / raw для своих файлов текстур и шейдеров opengl. Я думал о перемещении их в каталог ресурсов, чтобы обеспечить иерархическую организацию.
Эта ветка убедила меня не делать этого. Во-первых, потому что мне нравится использование уникального идентификатора ресурса. Во-вторых, потому что очень просто использовать InputStream / openRawResource или BitmapFactory для чтения файла. В-третьих, потому что очень полезно иметь возможность использовать в переносимой библиотеке.
Ресурсы позволяют включать в приложение произвольные файлы, такие как текст, XML, шрифты, музыку и видео. Если вы попытаетесь включить эти файлы в качестве «ресурсов», Android обработает их в своей системе ресурсов, и вы не сможете получить необработанные данные. Если вы хотите получить доступ к данным нетронутым, активы - один из способов сделать это.
res/raw
, вы можете получить необработанные данные, используя _ 2_.
- person Ted Hopp; 21.07.2013