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

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


person Cris    schedule 07.04.2011    source источник


Ответы (8)


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

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

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

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

person Ted Hopp    schedule 07.04.2011
comment
res означает ресурсы, тогда что означает assets ?? - person Vivek Warde; 13.06.2014
comment
@vwvwvwvwvwvwvwvwvw - Гм ... это ни для чего не означает; это просто означает активы (как во множественном числе английского слова asset: полезная или ценная вещь). - person Ted Hopp; 13.06.2014
comment
Возможна ли запись в файлы в каталоге raw/? - person Prince; 13.05.2015
comment
@Prince - Нет. Все в каталогах /res и '/ assets' доступно только для чтения, поскольку они упакованы в файл .apk. - person Ted Hopp; 13.05.2015
comment
можем ли мы поместить файл apk в папку с ресурсами, и когда пользователь щелкнет по этому пользовательскому интерфейсу, установите этот apk? - person Vivek Mishra; 01.09.2016
comment
@VivekMishra - Вполне возможно. Вы можете установить файлы apk программно, как описано в этой теме. Решения существуют для файла apk, хранящегося в файловой системе устройства. Вы можете попробовать тот же подход, используя URI для файла, хранящегося в папке с ресурсами вашего приложения; см. этот поток, чтобы узнать, как создать такой URI. В худшем случае вам придется скопировать apk из папки с ресурсами в файловую систему и использовать первый метод. - person Ted Hopp; 01.09.2016
comment
как насчет производительности? Используя, например, изображение из активов против использования из res в recyclerview? - person Yaroslav Dukal; 28.11.2017
comment
@MaksimKniazev - для этого варианта использования я предполагаю, что загрузка изображений из ресурсов будет менее эффективной, чем загрузка их из res. RecyclerView любит работать с объектами Drawable, и вы не получаете их, загружая изображения из ресурсов; вам придется заключить полученный Bitmap в BitmapDrawable в коде. В общем, я думаю (хотя я могу ошибаться в этом), что загрузка из res и загрузка из активов используют один и тот же базовый механизм загрузки, поэтому любые различия в производительности будут в лучшем случае второстепенными. - person Ted Hopp; 28.11.2017

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

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

person DRiFTy    schedule 07.04.2011
comment
Если мы хотим добавить external_fonts в наше приложение, мы помещаем их в папку с ресурсами. - person Tushar Pandey; 19.04.2014
comment
@TusharPandey Теперь нам не нужно помещать шрифты в папку Assets, система Android теперь содержит каталог fonts, и мы можем поместить туда наш файл пользовательских шрифтов или попросить студию Android загрузить его для нас. - person CopsOnRoad; 26.09.2017
comment
@ Джек, это для Орео. - person Tushar Pandey; 27.09.2017
comment
@TusharPandey Он добавлен в Oreo, но был обратно перенесен в библиотеку поддержки Android до уровня API 16. - person CopsOnRoad; 27.09.2017

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

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

assets/

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

res/raw/

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

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

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

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

Заключение

  1. Android API включает очень удобную структуру ресурсов, которая также оптимизирована для наиболее типичных случаев использования различных мобильных приложений. Вам следует осваивать Ресурсы и стараться использовать их везде, где это возможно.
  2. Однако, если вам нужна большая гибкость для вашего особого случая, активы предназначены для предоставления вам API более низкого уровня, который позволяет организовывать и обрабатывать ваши ресурсы с более высокой степенью свободы.
person Shubhang Malviya    schedule 23.04.2014
comment
Согласно принятому ответу, пункт 4 больше не соответствует действительности для проектов, использующих систему сборки Gradle; активы из библиотек включены в коллекцию активов проекта приложения. - person Venryx; 28.02.2017

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

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

person L.Butz    schedule 07.04.2011
comment
Вы также можете получить доступ к файлам в активах с Java - person Heiko Rupp; 07.04.2011
comment
Да, но они не индексируются - ›Будут медленнее, какая реальная проблема в мобильной разработке. - person L.Butz; 07.04.2011
comment
Итак, в чем разница между res / raw и asset? Res / raw тоже будет индексироваться? - person anticafe; 07.04.2011
comment
Проверьте сообщение от @TedHopp - он дает очень ясный ответ. - person L.Butz; 07.04.2011

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

person Bajji    schedule 12.03.2015

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

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

person dturvene    schedule 03.04.2014

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

person KCRaju    schedule 20.07.2013
comment
Это неверно. Если вы поместите данные в res/raw, вы можете получить необработанные данные, используя _ 2_. - person Ted Hopp; 21.07.2013
comment
У меня есть файлы текстур и шейдеров opengles в библиотеке. Я ДОЛЖЕН использовать res / raw для их хранения. Я использую InputStream и BitmapFactory для их чтения. Я добавлю это как независимый комментарий. - person dturvene; 03.04.2014
comment
Кажется, скопировано из Xamarin Microsoft docs. Укажите свой источник при копировании текста. docs. microsoft.com/en-us/xamarin/android/app-fundamentals/ - person Sjoerd Pottuit; 02.10.2018