Різниця між каталогами / res та / активами


266

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

Відповіді:


284

З ресурсами існує вбудована підтримка для надання альтернатив для різних мов, версій ОС, орієнтації екрана тощо, як описано тут . Нічого з цього немає в наявності активів. Також багато частин API підтримують використання ідентифікаторів ресурсів. Нарешті, назви ресурсів перетворюються на постійні імена полів, які перевіряються під час компіляції, тому менше можливостей для невідповідностей між кодом та самими ресурсами. Ніщо з цього не стосується активів.

То навіщо взагалі мати папку активів? Якщо ви хочете обчислити актив, який ви хочете використовувати під час виконання, це досить просто. За допомогою ресурсів вам доведеться оголосити список усіх ідентифікаторів ресурсів, які можуть бути використані, та обчислити індекс у списку. (Це щось незручно і створює можливості для помилок, якщо набір ресурсів змінюється в циклі розробки.) (EDIT: ви можете отримати ідентифікатор ресурсу за назвою, використовуючи getIdentifier, але це втрачає переваги перевірки часу компіляції.) Активи можуть також буде організовано в ієрархію папок, яка не підтримується ресурсами. Це інший спосіб управління даними. Хоча ресурси охоплюють більшість випадків, активи мають їх періодичне використання.

Ще одна відмінність: ресурси, визначені в бібліотечному проекті, автоматично імпортуються до прикладних проектів, які залежать від бібліотеки. Для активів цього не відбувається; Файли активів повинні бути в каталозі активів проектних проектів. [EDIT: З новою системою збирання на базі Gradle (використовується в Android Studio) на Android, це вже не відповідає дійсності. Каталоги активів для бібліотечних проектів упаковуються у файли /assets.

EDIT: Ще одна різниця виникає, якщо ви хочете упакувати спеціальний шрифт у свою програму. Існують дзвінки API для створення Typefaceфайлу шрифту, що зберігається у файловій системі або в assets/каталозі вашого додатка . Але немає API для створення Typefaceфайлу шрифту, що зберігається в res/каталозі (або з InputStream, що дозволило б використовувати res/каталог). [ ПРИМІТКА. За допомогою Android O (тепер доступна в алфавітному попередньому перегляді) ви зможете включати власні шрифти як ресурси. Дивіться опис тут цієї давно назрілої особливість. Однак, поки ваш мінімальний рівень API становить 25 або менше, вам доведеться дотримуватися упаковки спеціальних шрифтів як активів, а не як ресурсів.]


1
resрозшифровується як ресурси, то для чого assetsозначає ??
Vivek Warde

40
@vwvwvwvwvwwwvwwvwvw - Гм ... він нічого не "стоїть"; це просто означає "активи" (як у множині англійського слова актив : корисна чи цінна річ ).
Тед Хопп

1
Чи можливо записувати у файли в raw/каталозі?
Принц

6
@Prince - Ні. Все, що знаходиться в /resкаталогах « і» активів, є лише для читання, оскільки вони упаковані у файл .apk.
Тед Хопп

чи можемо ми помістити файл apk у папку активів, і коли користувач натисне на цей інтерфейс, встановить цей apk?
Вівек Мішра

63

Обидва досить схожі. Справжня основна відмінність між ними полягає в тому, що в resкаталозі кожному файлу надається попередньо складений файл, до ID якого можна легко отримати доступ R.id.[res id]. Це корисно для швидкого та легкого доступу до зображень, звуків, піктограм ...

assetsКаталог більше схожа на файлову систему і забезпечує більшу свободу , щоб помістити будь-який файл , який ви хотіли б там. Потім ви можете отримати доступ до кожного з файлів у цій системі так само, як і під час доступу до будь-якого файлу в будь-якій файловій системі через Java. Цей каталог хороший для таких речей, як деталі гри, словники, тощо. Сподіваюся, що це допомагає.


5
Якщо ми хочемо додати external_fonts у наш додаток, тоді ми помістимо їх у папку активів.
Тушар Пандей

1
@TusharPandey Зараз нам не потрібно ставити шрифти в Assetsпапку, система Android тепер містить fontsкаталог, і ми можемо помістити туди свій власний файл шрифтів, або ми можемо, щоб студія Android завантажила його для нас.
CopsOnRoad

@Jack, це для Oreo.
Тушар Пандей

1
@TusharPandey Додано в Oreo, але його було повернено до бібліотеки підтримки Android назад до рівня API 16
CopsOnRoad

36

Я знаю, що це старе, але для того, щоб зрозуміти, в офіційній документації на android є пояснення кожного:

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

assets/

Це порожнє. Ви можете використовувати його для зберігання необроблених файлів активів. Файли, які ви зберігаєте тут, компілюються у файл .apk як є, а вихідне ім'я файлу зберігається. Ви можете орієнтуватися в цьому каталозі так само, як у типовій файловій системі, використовуючи URI і читати файли як потік байтів за допомогою AssetManager. Наприклад, це вдале місце для текстур та даних про ігри.

res/raw/

Для довільних файлів із сировинними активами. Збереження файлів активів тут, а не в ресурсах / каталозі, відрізняється лише тим способом доступу до них. Ці файли обробляються aapt і на них слід посилатись із програми, використовуючи ідентифікатор ресурсу в класі R. Наприклад, це хороше місце для медіа, таких як MP3 або Ogg файли.


4
Я думаю, це насправді плутає проблему - і текстури, і файли ogg - це великі кулі даних, які ви подаєте в API користувальницької програми (openGL / MediaPlayer) ... чому б вони тут дискримінували?

9

Нижче наведено кілька ключових моментів:

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

Висновок

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

Відповідно до прийнятої відповіді, точка 4 вже не відповідає дійсності для проектів, що використовують систему побудови Gradle; активи з бібліотек входять до колекції активів прикладного проекту.
Венрікс

4

Якщо вам потрібно вказати їх десь у коді Java, ви б рахтер помістив свої файли в каталог "res".

І всі файли в папці res будуть індексуватися у файлі R, що дозволяє значно швидше (і набагато простіше!) Завантажити їх.


6
Ви також можете отримати доступ до файлів активів з Java
Heiko Rupp

2
Так, але вони не індексуються -> Буде повільніше, яка реальна проблема в мобільному розвитку.
L.Butz

Отже, чим відрізняються res / raw та активи? Чи буде індексовано також res / raw?
антикафе

Перевірте публікацію від @TedHopp - Він дає відповідь дійсно зрозумілою.
L.Butz

1

Використовуйте такі активи, як файлова система, щоб скидати будь-які файли. І використовуйте res, щоб зберігати те, для чого він створений, макети, зображення, значення.


0

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

Ця нитка переконала мене не робити. По-перше, тому що мені подобається використання унікального ідентифікатора ресурсу. По-друге, тому що дуже просто використовувати InputStream / openRawResource або BitmapFactory для читання у файлі. По-третє, тому що це дуже корисно мати можливість користуватися переносною бібліотекою.


1
Пункт 2 підтримки InputStreams та BitmapFactory стосується як ресурсів, так і активів (див. Тут: stackoverflow.com/a/8501428/2441655 ). Пункт 3 більше не застосовується. (див. прийняту відповідь)
Венрікс

-5

Активи пропонують спосіб включення до вашої програми довільних файлів, таких як текст, XML, шрифти, музика та відео. Якщо ви спробуєте включити ці файли як "ресурси", Android обробить їх у своїй ресурсній системі, і ви не зможете отримати необроблені дані. Якщо ви хочете отримати доступ до даних недоторканими, активи - це один із способів зробити це.


5
Це неправильно. Якщо ви вводите дані res/raw, ви можете отримати вихідні дані openRawResource(resourceName).
Тед Хопп

У мене в бібліотеці є файли текстур і шейдерів. Я ПОВИНЕН використовувати res / raw для їх зберігання. Я використовую InputStream та BitmapFactory для їх читання. Я додам це як незалежний коментар.
dturvene

Здається, скопійовано з документів Xamarin Microsoft. Укажіть джерело під час копіювання тексту. docs.microsoft.com/en-us/xamarin/android/app-fundamentals/…
Sjoerd Pottuit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.