在 Android 上,如何处理 Class.getResources() 的多个结果?
On Android, how are the multiple results of Class.getResources() handled?
在Java VM中,一个classloader可以有多个域,通常是JAR文件(类似于 APK 文件)。每个 域 都有一个命名空间。也就是说,每个资源都有一个唯一的名称。
因此,调用 ClassLoader.getResources("foo") 可以 return 多个 URL。但是,查看 Android,构建似乎扁平化了资源命名空间,覆盖了具有相同路径的资源。这会对 Java ServiceLoader 等机制造成严重破坏。它似乎也使 META-INF/MANIFEST.MF
.
的任何使用无效
例如,如果我使用 liba.jar
和 libb.jar
,并且两者都有一个资源 OSGI-OPT/com.example.Foo
,那么似乎只有一个最终出现在 APK 中。
这些 class 资源的规则是否记录在某处?
Are the rules around these class resources documented somewhere?
创建 APK 时的 Android 构建行为在 Add app resources section of the user guide. Look for the heading on Resource merging 中进行了描述。
您说得对,所有源都合并到一个命名空间中。这个想法是资源合并使生成的 APK 更小1.
Android 不受限于 Java(tm) 兼容,他们做出了不同的设计决策。
1 - APK 就像经典 Java 世界中的胖 JAR 或 uberJAR。您不会期望在一个胖 JAR 中包含多个资源副本。 getResources API 也只会为该上下文中的任何名称提供一个资源。
在Java VM中,一个classloader可以有多个域,通常是JAR文件(类似于 APK 文件)。每个 域 都有一个命名空间。也就是说,每个资源都有一个唯一的名称。
因此,调用 ClassLoader.getResources("foo") 可以 return 多个 URL。但是,查看 Android,构建似乎扁平化了资源命名空间,覆盖了具有相同路径的资源。这会对 Java ServiceLoader 等机制造成严重破坏。它似乎也使 META-INF/MANIFEST.MF
.
例如,如果我使用 liba.jar
和 libb.jar
,并且两者都有一个资源 OSGI-OPT/com.example.Foo
,那么似乎只有一个最终出现在 APK 中。
这些 class 资源的规则是否记录在某处?
Are the rules around these class resources documented somewhere?
创建 APK 时的 Android 构建行为在 Add app resources section of the user guide. Look for the heading on Resource merging 中进行了描述。
您说得对,所有源都合并到一个命名空间中。这个想法是资源合并使生成的 APK 更小1.
Android 不受限于 Java(tm) 兼容,他们做出了不同的设计决策。
1 - APK 就像经典 Java 世界中的胖 JAR 或 uberJAR。您不会期望在一个胖 JAR 中包含多个资源副本。 getResources API 也只会为该上下文中的任何名称提供一个资源。