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

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

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

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

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

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

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

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

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

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

assets/

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

res/raw/

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

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

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

Вывод

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

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

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

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

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

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

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

  • Как получить отчет о покрытии jacoco с помощью плагина Android gradle 0.10.0 или новее?
  • Добавление Admob в libgdx
  • В чем разница между fill_parent и wrap_content?
  • Как запускать службу каждый день в полдень и при каждой загрузке
  • Как изменить или добавить тему в Android Studio?
  • Получение java.net.SocketTimeoutException: время ожидания подключения в android
  • Как игнорировать акцент в запросе SQLite (Android)
  • Autoincrement VersionCode с дополнительными свойствами gradle
  • IllegalStateException: не удается выполнить это действие после onSaveInstanceState с помощью ViewPager
  • Как использовать InputFilter для ограничения символов в EditText в Android?
  • Как получить экземпляр fragmentа из FragmentActivity?
  • Давайте будем гением компьютера.