我是java和android开发的新手并且学习我正在尝试从应用程序开始收集像munin那样的统计数据和信息。我试图能够在我的应用程序中加载“插件”。这些插件已经在应用程序中,但我不想单独调用它们,但能够迭代它们。我试图使用serviceloader,但永远不会将META-INF /服务放入我的apk。所以我想知道是否可以在android上使用serviceloader
谢谢
编辑:我问的是java.util.ServiceLoader,我认为它应该,但我无法弄清楚如何在apk上将我的服务文件夹导入META-INF
该 META-INF ApkBuilder故意将文件夹排除在APK之外; ApkBuilder.java中唯一的评论是 “我们需要排除其他一些文件夹(如/ META-INF)” 但没有其他解释。
即使在使用ant添加META-INF之后,如果你想使用Proguard,它仍会遇到麻烦,Proguard拒绝替换META-INF / services / *文件的内容或重命名它们(这是另一个故事,作者希望保留Proguard不可知论者)。
但是,使用maven的人可能想要检查 https://github.com/pa314159/maven-android-plugin (名为“modified”的分支),试图解决这两个问题。它是我原来的“android-maven-plugin”的一个分支,我在一个月前修改了我自己的Android项目。
它还为Proguard-4.7提供了补丁
希望这有帮助,欢迎任何反馈。
我已经找到了可能适用于某些情况的解决方案。代替 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 /服务中查找)。
以下是该库文档的链接: http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/Lookups.html
UPDATE
在使用了几天之后,它似乎运行良好 - 我在环境(标准Java和Android)之间移动,并且它在每个位置都能正常工作。主要缺点是必须手动将文件复制到/ services目录。
ServiceLoader是Java语言中与Android无关的东西。我建议不要使用它。如果您只想在.apk中找到要加载的类列表,可以使用各种方法 - 在res / xml中放入列出它们的XMl文件,使用反射,注释等。