问题 在android上使用serviceloader


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


13176
2018-04-22 22:17


起源

这将有助于我们知道什么是“serviceloader”。 - CommonsWare
我问的是java.util.ServiceLoader,我认为应该如此,但我无法弄清楚如何在apk上将我的服务文件夹导入META-INF - silverchris
我自己也在尝试,我找到了 这个人 不幸的是,谁设法做到了这一点,他对细节有所了解。我已经要求更多信息,如果他回复我,我一定会在这里告诉你:) - SubmittedDenied
@SubmittedDenied指示的信息中有更多详细信息 Android问题17450,但我无法为我的项目重现它 - 签名后对apk进行修改,因此无法安装 - Ivin
可能重复 在apk中保留'META-INF / services'文件 由于这个问题的作者自2011年以来没有在线,我没有在这里发表我的答案。 - AlexS


答案:


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


5
2017-11-11 22:19





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提供了补丁

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


4
2018-02-02 15:09



它适用于Gradle: code.google.com/p/android/issues/detail?id=59658 - TJR


我已经找到了可能适用于某些情况的解决方案。代替 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目录。


3
2017-12-17 03:32



查找与Java相关,而不适用于Android。this will continue to work on standard Java environments unchanged,而不是Android。 - Infinite Recursion
不,Lookup适用于Android,您只需在应用程序中包含库jar(org-openide-util-lookup.jar)即可。我的观点是,由于Proxy方面的原因,我包含的代码在Android和标准Java环境中都能正常工作。 - djilk


有可能的。你可能想检查一下 http://developer.android.com/reference/java/util/ServiceLoader.html


2
2018-04-23 01:27



你知道如何让META-INF /服务进入apk吗?我已经尝试了几个小时,似乎总是被排除在外。我正在使用eclipse来编写和构建程序 - silverchris
AFAIK您唯一的选择是在创建apk后使用Ant脚本,并使用jar任务插入META-INF文件夹。 - Vicente Plata
看看这个 回答 - AlexS


ServiceLoader是Java语言中与Android无关的东西。我建议不要使用它。如果您只想在.apk中找到要加载的类列表,可以使用各种方法 - 在res / xml中放入列出它们的XMl文件,使用反射,注释等。


-3
2018-04-23 02:20



我无法找到有关您建议加载“插件”的任何方法的大量信息,而我没有指定每个人手动运行。我真的可以使用一个好的链接或例子,因为我是一个主要的java noob谢谢 - silverchris
ServiceLoader类包含在Android API级别9中,因此它是相关的。在资源文件中包含实现类列表将无法正常工作,因为它需要进入一个名为的文件 META-INF/services/<ServiceInterface> 在APK中。 - SubmittedDenied