【问题标题】:Plugins architecture for an Android app? [closed]Android应用程序的插件架构? [关闭]
【发布时间】:2012-05-01 15:32:27
【问题描述】:

此问题已移至https://softwarerecs.stackexchange.com/questions/27841/plugins-architecture-for-an-android-app


我想为an Open Source app 实现一个插件系统,因为它已经变得非常大,具有许多只有少数用户需要的功能。发布不同的应用程序不是一个好的解决方案,因为用户 A 想要 feature7 和 feature24,而 userB 想要 feature39 和 feature24。

我在哪里可以找到插件架构的好例子?

这是我希望插件能够做到的:

例如,其中一个插件必须在特定屏幕上添加一个按钮,单击此按钮会增加应用程序数据库中的一个值。据我所知,这不适用于 Content Providers 和 Intents。

我想避免让核心应用的代码变得复杂,到处都有大量的钩子。

插件的形式可以是 SD 卡上的文件、应用程序或其他任何东西。

【问题讨论】:

  • 应用程序“Doplhin”有很多他们称之为“附加组件”的东西。我没有使用过该应用程序,所以我不知道它们的集成程度如何,但似乎他们找到了一个有效的插件架构。知道他们是怎么做的吗? play.google.com/store/apps/developer?id=Dolphin+Add-ons 我猜他们不需要在每次创建新插件时都用新的钩子更新核心应用程序。
  • 我不确定,但这虽然过时可能有用dreamincode.net/forums/topic/…
  • 您需要添加挂钩,否则其他应用程序会挂钩什么?您也许可以使用 Services 和 IBinders 来做到这一点
  • 也看看这个类似的问题(有答案)stackoverflow.com/questions/5120220/…
  • @Irwin1138:我看过这个页面但决定问,因为这个问题质量非常低,没有任何调查工作。此外,正如他们所说,唯一的答案是“大型项目中的噩梦”,因为它们对标识符进行了硬编码。

标签: android dalvik layout-inflater android-inflate dex


【解决方案1】:

我已经完成了一个框架,它与 Robo-guice 类似,具有一些主要的 IoC 功能。 (减少加载视图/服务等的样板代码......)

但我相信解决您的问题的核心是能够加载单独的 APK“插件”文件,其中包括“res”以及 <layouts>.xml 文件。 <layouts>.xml 文件可以由该 APK 中的类独立扩展。也就是说,您可以将 CustomView(它自己的 <layout>.xml 膨胀)加载到原始/父应用程序中。所有这一切都是在父应用 APK 不知道 UI 是如何在插件 APK 中膨胀的情况下完成的。

我的意思的例子: 我有一个映射应用程序,该框架将动态扫描与“附加功能”插件的“合同”匹配的已安装 APK,并将特定于它的 UI 作为浮动面板加载到应用程序的视图中。

我会说 Android 的插件框架是可行的,因为 Android 拥有大部分(如果不是全部)必要的内置 API 来实现这一点。

这些是您在 Android 插件开发领域的朋友:

  1. PackageManager(扫描安装包,又名插件)
  2. DexClassLoader(如果你不使用正确的ClassLoader btw,ClassNotFoundException 会很痛苦)
  3. Java 反射

【讨论】:

  • 既然这是一个很常见的问题,也是一个难题,您介意分享一些关于您如何实现此类解决方案的代码吗?
  • @jucas 你有没有找到实现这种方法的框架或code-sn-p?
【解决方案2】:

我在哪里可以找到插件架构的好例子?

来自 Google 的 Roman Nurik 在他的开源应用 dash clock 中实现了一个不错的插件框架。插件本身是扩展API 中的DashClockExtension 类的服务,并安装为具有自己资源的完全独立的APK 文件。通过 AIDL 定义通信协议需要做很多工作,但它既干净又好用。

其中一个插件必须在特定屏幕上添加一个按钮,单击此按钮会增加应用数据库中的一个值。

主布局中可以被插件修改的部分需要由核心应用预先定义,并通过通信协议暴露出来。插件应该可以扩展任意布局,并将其发送到主应用程序,主应用程序可以将其放在它自己布局的预分配区域内。

【讨论】:

  • 太棒了!我看到所有钩子都必须提前定义,对吗?还是可以通过插件轻松完成问题第4段中的示例而无需修改核心应用程序?
  • 我稍微更新了答案...我不太确定在这种情况下需要如何实现回调,而无需自己花一些时间尝试,但我猜onClick 属性按钮的 可以设置为在主应用程序中运行具有已知名称的钩子,或者onClickListener 可以由执行某些操作的插件以编程方式设置。
【解决方案3】:

如果您只是想增加模块化,我建议使用依赖注入容器,例如 PicoContainerGuiceSpring

如果您想要轻量级插件架构,请选择Java Plugin Framework (JPF)

它允许您定义扩展点,这些扩展点可以由您的模块实现。插件框架的主要工作是提供一种捆绑这些模块(作为 jar 包)的方式,这些模块由核心应用程序动态找到并作为扩展点的实现提供。

【讨论】:

  • 我添加了链接,您可能需要检查 URL 是否确实指向您所指的内容。
  • 但从技术上讲,一个用户可以将他下载的 .jar 文件提供给另一个用户!如果我们不希望这种情况发生怎么办?有没有办法将新代码插入应用程序?
  • @FranciscoCorralesMorales:作为最初的提问者,我不介意用户共享插件。
猜你喜欢
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 2012-12-30
  • 2015-09-05
  • 2011-10-23
  • 2020-04-19
  • 2011-03-20
相关资源
最近更新 更多