Существуют ли какие-либо существенные различия или ограничения при использовании активов или резервных/необработанных папок?

Фон

Некоторые файлы приложения могут храниться только в папках res/raw или assets.

Каждая из этих папок работает очень похожей на другую. папка res/raw позволяет легче обращаться к файлам со всеми другими преимуществами файлов ресурсов, в то время как папка с данными позволяет обращаться к ним независимо от имени и структуры файла (включая папки и подпапки).

Основная идея загрузки файлов примерно одинакова для обоих. У вас просто выбор простоты использования, зависит от ваших потребностей.

Проблема

Я помню, что очень давно я нашел какое-то особое поведение обеих этих папок:

  • В каждой папке в папке с ресурсами было максимальное количество файлов. Я думаю, что это было около 500, но не уверен. Я заметил это поведение очень давно,

  • Некоторые сказали, что файлы в папке с активами имеют максимальный размер для файлов (пример здесь), Я никогда не видел такого ограничения. Даже на Android 2.3 в то время.

  • Некоторые сказали (пример здесь), и он по-прежнему полагал даже сегодня (пример здесь), что если вы загружаете файл из res/raw, это может занять гораздо больше памяти, чем если бы вы взяли его из активов папка.

Что я пробовал

Для # 1 мне никогда не приходилось использовать больше файлов после проекта, над которым я работал, и в то время, когда я работал над ним, мы просто разбивали файлы на несколько папок.

Для # 2, как я уже писал, я никогда не замечал этого. Я использовал гораздо большие размеры файлов.

Для # 3 я попытался создать образец проекта, который сравнивает использование памяти между двумя методами. Я не заметил никакой разницы (использования памяти или времени для загрузки) между двумя методами. Особенно не важно. К сожалению, у меня есть только одно устройство (Nexus 5x), и у него есть совершенно новая версия Android (8.1). Возможно, начиная с конкретной версии Android нет никакой разницы между этими двумя методами. Другой причиной этого является то, что сложнее измерить использование памяти на Java из-за GC, и я уже заметил, что на Android 8.x память работает немного иначе, чем раньше (написано об этом здесь).

Я попытался прочитать о различиях и ограничениях выше, но все, что я нашел, это очень старые статьи, поэтому я думаю, что с тех пор все могло измениться.

Вопросы

На самом деле это всего один вопрос, но я хотел бы разбить его, если ответ будет сложным:

  • Существуют ли какие-либо существенные или уникальные ограничения или различия между использованием папок res/raw и активов?

  • Чтение файла из папки с ресурсами (путем создания потока ввода из него) действительно занимает меньше памяти, чем использование res/raw? Настолько, что даже один из самых оцененных разработчиков ( здесь) решает выбрать его, даже сейчас?

  • Были ли указанные ограничения существовали до конкретных версий Android, а затем они стали идентичными с точки зрения каких-либо ограничений (кроме файлов, обозначающих файлы для res/raw, но это только то, как это работает)?

  • Если да, то из какой версии Android они работают примерно одинаково?

Ответ 1

Существуют ли какие-либо существенные или уникальные ограничения или различия между использованием папок res/raw и активов?

Теперь в Android у нас нет ограничений на максимальный размер для любого файла в активах или в raw.

Документация для Android:

Произвольные файлы для сохранения в их исходной форме. Чтобы открыть эти ресурсы с сырым InputStream, вызовите Resource.openRawResource() с помощью Идентификатор ресурса, который является R.raw.filename.

Однако, если вам нужен доступ к исходным именам файлов и иерархии файлов, вы можете рассмотреть возможность сохранения некоторых ресурсов в каталоге assets/ (вместо res/raw/). Файлы в активах/не имеют идентификатора ресурса, поэтому вы можете прочитать их только с помощью AssetManager.

Ли чтение файла из папки с ресурсами (путем создания потока ввода из него) действительно занимает меньше памяти, чем использование res/raw? Настолько, что даже один из самых оцененных разработчиков (здесь) решает выбрать его, даже сейчас?

Нет, я не нашел различий в использовании памяти. Это один из самых больших беспорядков, с которыми сейчас работает андроид. Также у нас нет официальной документации об их ограничении памяти.

Были ли указанные ограничения существовали до конкретных версий Android, и тогда они стали идентичными с точки зрения каких-либо ограничений (кроме файлов, обозначающих файлы для res/raw, но это только то, как это работает)?

Перед Android 2.3 у нас было ограничение памяти для папки с ресурсами, которая составляет 1 МБ. Обратитесь ссылка.

Если это так, из какой версии Android они работают примерно одинаково?

От android 2.3, У нас нет ограничений, связанных с памятью, которые они запускали в Декабрь 2010