Android framework 定制应用接口和服务

2022-07-31,,,,

在系统开发中,定义api是很常见的。因为系统的很多功能是不对外开放的,系统可以通过定义api给应用层调用,方便实现相关的功能。关于定义接口,可参考系统相关服务,如AMS,PMS等模块的实现方式,将接口定义跟具体实现分离出来,当第三方应用需要二次进行开发时,只需要提供接口类封装的jar即可,且具体实现对应用是透明的。
定义思路

jar包中的类
ApiManager.java 接口类,作为 应用调用的入口
IApiManager.aidl aidl,与功能实现的类进行通信
ApiManagerImpl.java ApiManager的实现类,下发控制指令与系统通信的控制接口

.具体文件路径如下:
ApiManager.java 和 IApiManager.aidl :
frameworks/base/core/java/com/android/server
ApiManagerImpl.java:
frameworks/base/services/core/java/com/android/server

我们只是定义了定义文件路径,如果要将它编译成jar包,还需要在 mk 文件中添加规则。修改frameworks/base/Android.mk,在frameworks.jar的规则中加入声明。

LOCAL_SRC_FILES := \
	core/java/com/android/server/IApiManager.aidl 

在frameworks/base/Android.bp中加入aidl定义

core/java/com/android/server/IApiManager.aidl 

在frameworks/base/Android.mk中添加新的module定义,用于编译可供第三方接入的jar包,加在 mk 的 build之前,而不是文件最后。

include $(CLEAR_VARS) LOCAL_SRC_FILES := \
	core/java/com/android/server/IApiManager.aidl \
	core/java/com/android/server/ApiManager.java
LOCAL_MODULE := apimanager
include $(BUILD_STATIC_JAVA_LIBRARY) 

在build/target/product/core.mk 或 device的device.mk中加入指令,在编译固件时将apimanager作为目标module进行编译(如果没有做这一步则编译固件时不会生成apimanager.jar,只能手动编译模块)

PRODUCT_PACKAGES += apimanager 

然后直接 make 或 make apimanager 。 编译完成后,jar的位置out/target/common/obj/JAVA_LIBRARIES/apimanager_intermediates/classes.jar ,将这个jar包导入到Android studio中,导入之后并不能直接调用,还需要配置系统签名(平台不同系统签名不同)。

接口类和实现类设计

aidl设计比较简单,可把它理解为一个提供方法的接口

interface IApiManager { // 函数名 } 

再看接口实现类ApiManagerImpl.java,继承aidl并实现里面的方法,需声明apimanager,让其他 服务和应用可以访问该服务。

public class ApiManagerImpl extends IApiManager.Stub { public static class Lifecycle extends SystemService { private ApiManagerImpl mApiManager; public Lifecycle(Context context) { super(context); } @Override
        public void onStart() { mApiManager = new ApiManagerImpl(getContext()); publishBinderService("apimanager", ApiManagerImpl); } } public ApiManagerImpl(Context context) { // 实例化对象 } @Override // aidl中的函数 } 

接口类也比较简单,就是调用实现类中的函数,不是直接实例化ApiManagerImpl,而是通过 aidl 获取服务类。

public class ApiManager { private final IApiManager mService; private static ApiManager instance; private Context mContext; private final static Object syncObj = new Object(); public ApiManager(Context context) { Log.d(TAG, "ApiManager created"); mService = IApiManager.Stub.asInterface(ServiceManager.getService("apimanager")); mContext = context; } public static ApiManager getInstance(Context context) { synchronized(syncObj) { if (instance == null) { instance = new ApiManager(context); } return instance; } } 函数名 { try { mService.函数名; } catch (RemoteException e) { e.printStackTrace(); } } } 

这样,一个完整的服务架构算是完成了,之后如果应用需要系统提供功能接口,只需要按步骤添加相关函数实现就行了。

本文地址:https://blog.csdn.net/qq_36252688/article/details/107772867

《Android framework 定制应用接口和服务.doc》

下载本文的Word格式文档,以方便收藏与打印。