我对java和android开发非常陌生,为了学习,我正在尝试从一个像munin那样收集统计数据和信息的应用程序开始。这些插件已经在应用程序中了,但我不想单独调用它们,但可以遍历它们。我正在尝试使用serviceloader,但无法将META-INF/services放入我的apk中。
编辑:我正在询问java.util.ServiceLoader,我认为它应该是这样的,但是我不知道如何将我的服务文件夹放入apk上的META-INF中
发布于 2013-11-12 06:19:28
有一个关于这个问题的开放的bug报告。请参阅https://code.google.com/p/android/issues/detail?id=59658
发布于 2012-02-02 23:09:31
ApkBuilder故意将APK INF文件夹排除在外;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提供了一个补丁
希望这能有所帮助,欢迎任何反馈。
发布于 2013-12-17 11:32:34
我已经想出了一个可能适用于某些情况的解决方案。我使用的不是ServiceLoader,而是NetBeans附带的org.openide.util.Lookup类/库-它是ServiceLoader的超集。它本身并不需要NetBeans,而且似乎可以与Eclipse一起工作。有必要将您在应用程序中使用的任何ServiceLoader功能替换为Lookup等效项,并添加org-openide-util-lookup库。然后,您可以这样做:
Lookup lookup = new ProxyLookup(Lookup.getDefault(),
Lookups.metaInfServices(myClass.getClassLoader(), "services/"));并将您的服务文件从META-INF/ ServiceLoader /移动到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目录。
https://stackoverflow.com/questions/5760607
复制相似问题