13

我对 java 和 android 开发非常陌生,并且学习我正在尝试从一个应用程序开始,以像 munin 一样收集统计数据和信息。我试图能够在我的应用程序中加载“插件”。这些插件已经在应用程序中,但我不想单独调用它们,但能够迭代它们。我试图使用 serviceloader 但永远无法将 META-INF/services 放入我的 apk。所以我想知道是否可以在android上使用serviceloader谢谢
编辑:我在问java.util.ServiceLoader,我认为应该,但我不知道如何将我的服务文件夹放入META-INF APK

4

5 回答 5

5

有一个针对此问题的开放错误报告。请参阅https://code.google.com/p/android/issues/detail?id=59658

于 2013-11-11T22:19:28.073 回答
4

ApkBuilder 故意将META-INF文件夹从 APK 中排除;ApkBuilder.java 中唯一的注释是“我们需要排除一些其他文件夹(如 /META-INF)”但没有其他解释。

即使用ant添加了META-INF,如果你想使用Proguard,你仍然会遇到麻烦,它拒绝替换META-INF/services/*文件的内容或重命名它们(这是另一个故事,作者想保留Proguard 不可知论者)。

但是,使用 maven 的人可能想要检查https://github.com/pa314159/maven-android-plugin(名为“modified”的分支),它试图解决这两个问题。它是我一个月前为我自己的 Android 项目修改的原始“android-maven-plugin”的一个分支。

它还为 Proguard-4.7 提供了补丁

希望这会有所帮助,欢迎任何反馈。

于 2012-02-02T15:09:30.667 回答
3

我想出了一个可能适用于某些情况的解决方案。ServiceLoader我使用的org.openide.util.Lookup是 NetBeans 附带的类/库,而不是ServiceLoader. 它本身不需要 NetBeans,而且似乎可以与 Eclipse 一起使用。有必要ServiceLoader用 Lookup 等价物替换您在应用程序中使用的任何功能,并添加 org-openide-util-lookup 库。然后,您可以执行以下操作:

Lookup lookup = new ProxyLookup(Lookup.getDefault(),
                Lookups.metaInfServices(myClass.getClassLoader(), "services/"));

并将您的ServiceLoader文件从 META-INF/services/ 移动到 services/。

请注意,由于ProxyLookup,这将继续在标准 Java 环境中保持不变(即,在这些情况下,它将继续在 META-INF/services 中查找)。

这是该库文档的链接:http: //bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/Lookups.html

更新

在使用了几天后,它似乎运行良好 - 我在环境(标准 Java 和 Android)之间移动,它在每个位置都能正常工作。主要的缺点是必须手动将文件复制到 /services 目录。

于 2013-12-17T03:32:33.650 回答
2

有可能的。您可能需要检查http://developer.android.com/reference/java/util/ServiceLoader.html

于 2011-04-23T01:27:28.090 回答
-5

ServiceLoader is stuff from the Java language that is not really relevant on Android. I recommend not using it. If you just want to find a list of classes within your .apk to load, there are all kinds of ways to do this -- put in XMl file in res/xml that lists them, use reflection, annotations, etc.

于 2011-04-23T02:20:07.017 回答