【问题标题】:Using serviceloader on android在安卓上使用服务加载器
【发布时间】:2011-04-22 22:17:21
【问题描述】:

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

【问题讨论】:

  • 这将有助于我们了解“serviceloader”是什么。
  • 我在询问 java.util.ServiceLoader,我认为应该,但我不知道如何将我的服务文件夹放入 apk 上的 META-INF
  • 我自己也在尝试,我发现this person 成功地做到了,不幸的是,他对细节有点了解。我已经要求提供更多信息,如果他回复我,我一定会在这里告诉你:)
  • @SubmittedDenied 在Android issue 17450 中指示的信息中有更多详细信息,但我无法为我的项目重现它 - 对 apk 的修改发生在签名后,因此无法安装
  • Keep 'META-INF/services'-files in apk 的可能重复由于此问题的作者自 2011 年以来一直未在线,因此我没有在此处发布答案。

标签: java android meta-inf serviceloader


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    META-INF 文件夹被 ApkBuilder 故意从 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 的补丁

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

    【讨论】:

      【解决方案3】:

      我想出了一个可能适用于某些情况的解决方案。我使用的是 NetBeans 附带的 org.openide.util.Lookup 类/库,而不是 ServiceLoader——它是 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 目录。

      【讨论】:

      • 查找与 Java 相关,与 Android 无关。this will continue to work on standard Java environments unchanged,与 Android 无关。
      • 不,Lookup 适用于 Android,您只需在应用程序中包含库 jar (org-openide-util-lookup.jar)。我的观点是,由于代理方面,我包含的代码在 Android 和标准 Java 环境中都能正常工作。
      【解决方案4】:

      【讨论】:

      • 您知道如何将 META-INF/services 放入 apk 中吗?我已经尝试了几个小时,它似乎总是被排除在外。我正在使用eclipse编写和构建程序
      • AFAIK 您唯一的选择是在创建 apk 后使用 Ant 脚本,并使用 jar 任务插入 META-INF 文件夹。
      【解决方案5】:

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

      【讨论】:

      • 我无法找到有关您建议加载“插件”的任何一种方法的大量信息,而无需我指定每个手动运行。我真的可以使用一个好的链接或示例,因为我是一个主要的 java 菜鸟谢谢
      • ServiceLoader 类包含在 Android API 级别 9 中,因此具有相关性。在资源文件中包含实现类的列表将不起作用,因为它需要进入 APK 中名为 META-INF/services/<ServiceInterface> 的文件。
      猜你喜欢
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多