Android应用的插件架构?
这个问题已经转移到https://softwarerecs.stackexchange.com/questions/27841/plugins-architecture-for-an-android-app
我想实现一个开放源码应用程序的插件系统,因为它已经变得非常庞大,只有less数用户需要的许多function。 发布不同的应用程序并不是一个好的解决scheme,因为用户A需要feature7和feature24,而用户B需要feature39和feature24。
我在哪里可以find一个插件架构的好例子?
这是我想要一个插件能够做到的:
- 重新定义特定屏幕的布局( 加载压缩的XML ?)
- 重新定义一个类的方法( load dex class ?, AOP ?)
例如,其中一个插件必须在特定的屏幕上添加一个button,然后单击该button将增加应用程序数据库中的值。 据我所知,这对内容提供商和意图来说是不可行的。
我想避免使核心应用程序的代码复杂到处都是大量的钩子。
插件的forms可以是SD卡上的文件,应用程序或其他任何东西。
我已经完成了一个像Robo-guice一样的主要IoCfunction的框架。 (减less加载视图/服务等的样板代码…)
但其中的核心,我相信是你的问题的解决scheme,是能够加载单独的APK“插件”文件,其中包括“res”以及<layouts>.xml
文件。 这个<layouts>.xml
文件可以被该APK中的类独立充气。 也就是说,你可以加载一个CustomView(将自己的<layout>.xml
膨胀)到一个原始/父App中。 所有这些都是在没有父应用APK的情况下完成的,因为它知道用户界面在插件APK中的膨胀程度。
示例我的意思是:我有一个映射应用程序,框架将dynamic扫描已安装的APK,它与“附加function”插件的“契约”相匹配,并将特定于其的UI加载到应用程序视图上作为浮动面板。
我会说Android的插件框架是可行的,因为Android有大部分(如果不是全部)必要的内置API来实现这一点。
这些是你在Android的插件开发领域的朋友:
- PackageManager(扫描安装包,也称为插件)
-
DexClassLoader
(ClassNotFoundException
将是一个痛苦,如果你不使用正确的ClassLoader
btw) - Javareflection
我在哪里可以find一个插件架构的好例子?
Google的Roman Nurik在他的开源应用程序中使用了一个很好的插件框架。 插件本身是在API中扩展DashClockExtension类的服务,并作为完全独立的APK文件与自己的资源一起安装。 通过AIDL定义通信协议的工作量非常大,但它很干净,工作得很好。
其中一个插件必须在特定的屏幕上添加一个button,点击这个button会增加应用程序数据库中的值。
主布局中可以被插件修改的部分需要由核心应用程序预先定义,并通过通信协议公开。 应该可以让插件膨胀任意的布局,并将其发送到主应用程序,这可以把它放在它自己的布局的预分配区域。
如果你只是要增加模块性,我会build议使用dependency injection容器,如PicoContainer , Guice或Spring 。
如果您想要一个轻量级的插件体系结构,那么请使用Java插件框架(JPF) 。
它允许你定义扩展点,这可以由你的模块来实现。 插件框架的主要工作是提供一种方法,您可以将这些模块(作为jar子)捆绑在一起,这些模块由核心应用程序dynamic地find并作为扩展点的实现给出。