通过服务替代方案的插件架构

sfi*_*nja 3 java android dependency-injection inversion-of-control android-service

我正在寻找一种实现基于插件的 Android 应用程序的方法,并发现了这篇很棒的文章,描述了基于服务的插件方法。

我尝试这种基于服务的插件架构的目标是:

  1. 避免将附加模块(“插件”)静态链接到核心应用程序。
  2. 避免分发核心应用程序或库的源代码。
  3. 可以选择通过 Proguard 传递核心应用程序/库,以保护关键部分。

基于服务的方法很好地满足了目标 #1,但是当涉及目标 #2 和 #3 时,我发现自己陷入了无限循环(即“追我的尾巴”):

本文中实现的基于服务的插件演示效果很好,因为...它只返回内置类型(请参阅 参考资料IBinaryOp.aidl)。

但在我的实际应用程序中,我需要返回我自己的类,其中一些很复杂并且包含“商业秘密”。

这是一种先有鸡还是先有蛋的情况吗?无论我做什么,我总是必须暴露一些核心类?

或者这个问题可以解决吗?

我考虑解决这个问题的方法之一(真的是解决方法吗?)是使用我的类通过服务返回的接口,因此:

  1. 插件(由其他人编写)仍然需要了解我的命名空间,因此在构建时需要我的库项目的 JAR ,但它无法访问实现源代码。
  2. 我也许可以将当前的整体库项目分为 2 个 JAR:一个仅包含接口,另一个甚至没有作为 JAR 发布,而是作为我的应用程序 APK 的一部分。

我的思考方向正确吗?或者你发现一些误解吗?

有更好的方法来解决这个问题吗?

是否有演示项目已经成功解决了这一挑战(即上述所有 3 个目标)并可以用作参考或教程?

Com*_*are 5

有更好的方法来解决这个问题吗?

您必须以源代码形式发送 AIDL。那一个接口。您不必再单独拥有另一层接口。AIDL 中引用的 Java 类的实现可以在 JAR 中。

话虽如此,由于版本管理的原因,野马无法让我做你正在做的事情。

除非您打算用枪指着第三方,否则您不能强迫他们升级您的 JAR 版本。因此,您可以:

  • 永远不能改变这些类,或者

  • 必须非常仔细地管理版本控制,例如每个版本都有单独的 IPC 端点,以便您的核心代码可以使用任意版本的 JAR 处理任意版本的第三方代码

是否有演示项目已经成功解决了这一挑战(即上述所有 3 个目标)并可以用作参考或教程?

您的目标可以通过任何 Android 的 IPC 机制来实现:

  • 正如您所建议的,使用自定义类绑定服务
  • 仅使用库存类的绑定服务,例如StringandListBundle
  • 带有服务的命令模式(即通过 发送命令startService()
  • 播送Intents
  • ContentProviders
  • 活动

你的困难的症结在于这个假设:

我需要归还我自己的课程

我会完全翻转过来:您应该坚持使用实际 IPC 的标准 Android 类,您和第三方代码都可以识别并能够使用这些类。

这仍然需要您进行版本管理,但它取决于更传统的“清理您的输入”逻辑,就像您对任何 Web 服务或其他公开的 API 所做的那样。如果您想在源代码或 JAR 中发布一些“帮助程序”代码,以便更轻松地使用您的 API,那很酷,因为您不再依赖于 JAR 中这些类的特定版本。

就“演示项目”而言,这完全取决于您尝试创建哪种类型的 API。