如何从 OS 框架层面实现应用服务功能解耦
作者:赵俊民
01 背景
在 HarmonyOS 中,将 Ability 作为应用的基本构成单元,调度单元,迁移单元,服务单元。
何为服务单元呢?在 Android 上开发一个应用,此应用需要去查看和编辑一个图片,如何
实现这个功能?大概有两种实现方式:
1. 应用开发者集成相应的 jar/so SDK 库,通过调用 API 完成查看和编辑功能
2. 应用开发者通过调用另外一个应用(如图库)提供的图片查看和编辑功能完成
在 Android 系统上,应用的一些功能都是通过方式二实现的。方式二有如下几个好处:
1. 查看和编辑图片,可能不是应用的核心业务,无需要浪费太多的时间
2. 应用本身 ROM 发布包体较小
3. 应用可以借助 OS 系统提供的能力,在不同的国家调用不同的图库应用,避免一些安全隐
私问题
我们将方式二称之为图库应用为应用开发者提供了图片服务。
图库应用就是“服务化应用”。
来源:HarmonyOS 开发者微信号 https://mp.weixin.qq.com/s/PoYHQHeUgUkTEihwelBJrA
• Consumer App:服务的使用方
• Provider App:服务的提供方
基于上面的场景解释,本文重点讨论的问题是:如何从 OS 应用框架层面提供能力,解耦服
务的提供方和使用方?是否在移动应用/IOT 领域存在服务中间商的商业模式可能性?
要回答这个问题,让我们先调研一下业界现有应用服务调用模式。
02 业界技术调研
2.1Android 系统中应用服务化设计
Android 的最大创新之一就是应用服务化,单一 UI 入口变为服务多入口,Android 应用模
型不仅为用户提供了 UI 入口,而且可以暴露出更多的服务入口给其他应用。Android 的
activity,service,provider 都可以 exported,被外部应用进行调用。Android 中不同的
组件类型,提供了不同的调用方式:
来源:HarmonyOS 开发者微信号 https://mp.weixin.qq.com/s/PoYHQHeUgUkTEihwelBJrA
• Activity 组件
通过 Intent 方式进行调用,Intent 描述启动那个 Activity 和携带必要的启动数据。Intent
分为显示和隐式类型,其中隐式 Intent 类型不需要显示指定组件的名称,只需要描述需要
组件完成的 Action 就可以。这种方式就可以把使用方和提供方进行松绑。Android 中定义
了非常多的 Action:
https://developer.android.com/reference/android/content/Intent
ACTION_VIEW: Display the data to the user
ACTION_OPEN_DOCUMENT : Allow
the
user
to
select
and
return one or more existing documents.
ACTION_EDIT:Provide explicit editable access to the given data.
...
我们以 ACTION_VIEW 为例,Android 如何写一个被服务 Activity 被外部调用
Android 给的一个记事本 App 例子,在 Manifest 文件里面声明了一个支持 mimetype 的
文件
//https://android.googlesource.com/platform/development/+/05523fb/samples/
NotePad
来源:HarmonyOS 开发者微信号 https://mp.weixin.qq.com/s/PoYHQHeUgUkTEihwelBJrA
...
如果使用方需要服务方 Activity 返回接口,调用
https://developer.android.com/training/basics/intents/filters
// Create intent to deliver some kind of result data
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://re
sult_uri"));
setResult(Activity.RESULT_OK, result);
finish();
• Service 组件
来源:HarmonyOS 开发者微信号 https://mp.weixin.qq.com/s/PoYHQHeUgUkTEihwelBJrA
Service 组件被外部人调用有两种方式:startService 和 bindService。前者适合比较简单
的交互通信,后者可以提供 IDL 更加丰富的交互。Service 是 Android APP 向外提供无界
面服务的主要组件。GMS 提供的大部分功能都是基于 SDK(封装了 IDL) + Service 方式。
可以参考:
https://developers.google.com/android/guides/overview
Google 在 Android 上通过 Service 组件调用方式,从架构上实现了 App 与 GMS 的解耦,
从而实现了自己的导流的商业模式。
• Provider 组件
Provider 是 Android 提供的一种数据组件。如果应用需要有些数据可以被外部其他应用进
行使用,基本都是通过 Provider 组件进行暴露。
providers and provider clients offer a consistent,
standard interface to data that also handles inter-process communication and
secure data access.
Android 提供统一的 ContentResolver 机制访问一个 Provider
//https://developer.android.com/guide/topics/providers/content-provider-basics
// Does a query against the table and returns a Cursor object
mCursor = contentResolver.query(
UserDictionary.Words.CONTENT_URI, // The content URI of the words table
来源:HarmonyOS 开发者微信号 https://mp.weixin.qq.com/s/PoYHQHeUgUkTEihwelBJrA
projection, // The columns to return for each row
selectionClause, // Either null, or the word the user entered
selectionArgs, // Either empty, or the string the user entered
sortOrder // The sort order for the returned rows
)
总体看,Android 的 Activity,Service 和 Provider 这三种应用组件都可以导出某种服务
能力,以不同的方式被其他应用使用:
• Activity:携带 UI 界面,OS 通过 Intent 消息在提供方和消费方进行调用和回复。
• Service:无 UI 界面,
应用通过 Client Library+Service 方式对外提供服务
• Provider:应用通过 ContentResolver 机制对外暴露数据。
Android 提供了各种灵活的机制实现了应用服务化,部分解耦了服务的使用方和服务提供
方,总体来说,功能是比较强大的,但我个人认为提供的调用机制比较复杂,是否可以简化
有待商榷。
2.2 IOS 系统中应用服务化设计
IOS 并没有像 Android 一样提供如此灵活的应用组件框架,IOS 中提供了 App Extensions
机制,用于一个 APP 导出功能弥补系统功能或者给其他 APP 使用。
An app extension lets you extend custom functionality and content beyond your
来源:HarmonyOS 开发者微信号 https://mp.weixin.qq.com/s/PoYHQHeUgUkTEihwelBJrA
app and make it available to users while they’re interacting with other apps or the
system.
https://developer.apple.com/library/archive/documentation/General/Conceptual/Exte
nsibilityPG/ExtensionOverview.html#//apple_ref/doc/uid/TP40014214-CH2-SW2
从上图可以看出,理解 App extension 需要理解三个概念:
• Host App:用户正在使用的应用,可以启动 extension,如在图库中使用分享扩展,图
库即 HostApp。
• App extension: 一个独立的编程组件,跟 App 有不相同的声明周期,声明周期基本伴随
Host App 调用进行启动,调用完即销毁。
• Containing App:包含 App extension 功能代码和可以共享 Shared resources 的 App,
本身 App extension 跟 Containing App 在运行中交互通过 IPC 机制。App extension 和
Containing app,Hostapp 分别运行在不同的进程。
IOS 中定义了很多类型的 App extension,
来源:HarmonyOS 开发者微信号 https://mp.weixin.qq.com/s/PoYHQHeUgUkTEihwelBJrA
包括 Action,Audio Unit,Broadcast UI,Broadcast Upload,...,Photo Editing,Share (iOS
and macOS)。
IOS App extension 设计可以看出:IOS 提供统一的 App extension 设计(组件定义,生
命周期管理,通信机制,系统管理)便于三方应用开发者向系统注册能力,给其他应用进行
使用。
2.3 Windows 系统中应用服务化设计
• COM 组件模型
Windows 系统中大家所知就是 COM(Component Object Model)组件化模型,允许应
用从二进制软件组件构建应用。COM 模型定义了一套标准,按照 COM 标准实现的组件,
提供统一的组件定义,注册,查询,调用,版本兼容方法。
COM has a number of parts that work together to enable the creation of
applications that are built from reusable components: 1.A host system that
provides
a
run-time environment that conforms
to
the
COM
specification. 2.Interfaces that define feature contracts, and components that
implement interfaces. 3.Servers that provide components to the system, and clients
that use the features provided by components. 4.A registry that tracks where
components are deployed on local and remote hosts.5.A Service Control Manager
that locates components on local and remote hosts and connects servers to
来源:HarmonyOS 开发者微信号 https://mp.weixin.qq.com/s/PoYHQHeUgUkTEihwelBJrA