На Android, как обрабатываются множественные результаты Class.getResources ()? - PullRequest
1 голос
/ 26 февраля 2020

В Java VM, classloader может иметь несколько доменов , обычно это файлы JAR (которые похожи на файлы APK). Каждый из этих доменов имеет одно пространство имен. То есть каждый ресурс имеет уникальное имя.

Вызов ClassLoader.getResources ("foo") может, следовательно, возвращать несколько URL-адресов. Однако, глядя на Android, сборка, похоже, сглаживает пространство имен ресурса, перезаписывая ресурсы тем же путем. Это приводит к havo c с такими механизмами, как Java ServiceLoader. Также кажется, что любое использование META-INF/MANIFEST.MF.

аннулируется. Например, если я использую liba.jar и libb.jar, и оба имеют ресурс OSGI-OPT/com.example.Foo, то, по-видимому, только один из них заканчивается в APK.

Задокументированы ли где-нибудь правила, касающиеся этих ресурсов класса?

1 Ответ

1 голос
/ 26 февраля 2020

Задокументированы ли где-нибудь правила для этих ресурсов класса?

Поведение сборки Android при создании APK описано в разделе Добавить ресурсы приложения гид пользователя. Найдите заголовок Объединение ресурсов .

Вы правы в том, что все источники объединены в одно пространство имен. Идея состоит в том, что объединение ресурсов делает полученный APK меньше 1 .

Android не обязательно должен соответствовать Java (tm), и они принимают различные проектные решения.


1 - APK подобен толстому JAR или uberJAR в мире classi c Java. Вы не ожидаете нескольких копий ресурса в толстом JAR. API getResources также предоставит вам только один ресурс для любого имени в этом контексте.

...