编程语言
首页 > 编程语言> > java-通过服务替代方案的插件体系结构

java-通过服务替代方案的插件体系结构

作者:互联网

我正在寻找一种实现基于插件的Android应用程序的方法,结果发现this great article描述了一种基于服务的插件方法.

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

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

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

本文中实现的基于服务的插件演示非常有用,因为…它仅返回内置类型(请参阅IBinaryOp.aidl).

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

这是鸡吗?在那种鸡蛋的情况下,无论我做什么,我将总是不得不公开一些核心课程?

还是这个问题可以解决?

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

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

我在想正确的方向吗?还是您发现一些误解?

是否有更好的方法来解决此问题?

是否有演示项目已经成功解决了这一难题(即上述三个目标),并且可以用作参考或教程?

解决方法:

Are there better ways to approach this problem?

您必须以源形式发送AIDL.那是一个接口.然后,您不必分别拥有另一层接口. AIDL中引用的Java类的实现可以在JAR中.

话虽这么说,由于版本管理,野马无法让我做您正在做的事情.

除非您计划用枪口手段阻止第三方,否则您不能强迫他们升级其JAR版本.因此,您要么:

>永远不能更改这些类别,或者
>必须非常仔细地管理版本控制,例如每个版本具有单独的IPC端点,以便您的核心代码可以处理具有JAR任意版本的第三方代码的任意版本

Are there demo projects out there that have already addressed this challenge (i.e. all 3 goals outlined above) successfully and can be used as a reference or tutorial?

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

>提议使用自定义类的绑定服务
>仅使用股票类的绑定服务,例如String和List and Bundle
>具有服务的命令模式(即,通过startService()发送命令)
>广播意图
>内容提供商
>活动

您遇到困难的关键在于以下假设:

I need to return my own classes

我将完全翻转为:您应该坚持用于实际IPC的标准Android类,您和第三方代码都可以识别并可以使用的类.

它仍然具有您需要执行的版本管理,但取决于更常规的“清理输入”逻辑,即您对任何Web服务或其他公开API进行处理的方式.而且,如果您想在源代码或JAR中附带一些“帮助程序”代码以简化API的使用,那很酷,因为您不再依赖于JAR中这些类的特定版本.

就“演示项目”而言,这完全取决于您要创建哪种API.

标签:dependency-injection,android-service,java,android,inversion-of-control
来源: https://codeday.me/bug/20191030/1965436.html