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

Фон

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

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

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

Эта проблема

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

  1. Каждая папка в папке с активами содержит максимальное количество файлов. Думаю, около 500, но не уверен. Я заметил такое поведение очень давно,

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

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

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

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

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

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

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

Вопросы

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

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

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

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

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


person android developer    schedule 10.01.2018    source источник


Ответы (1)


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

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

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

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

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

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

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

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

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

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

Начиная с Android 2.3, у нас нет ограничений, связанных с памятью, которые были введены в декабре 2010 года.

person Jitesh Mohite    schedule 31.01.2018
comment
1. Тем не менее, я помню, что было ограничение, о котором я нигде не упоминал. У меня должно было быть много файлов, и из-за проблем с ними мне пришлось разбить их на большее количество папок. 2. Почему же тогда он потратил на это время? Он даже поместил ссылку на статью об этом 2013 года (здесь: blog.danlew. net / 2013/08/20 / joda_time_s_memory_issue_in_android). В статье это написано. По какой-то причине getResourceAsStream () выполняет довольно экстремальное кэширование и занимает уйму памяти, если вы ее используете. 3. + 4. Ok. - person android developer; 31.01.2018