欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Android framework 定制应用接口和服务

程序员文章站 2022-05-01 19:16:43
在系统开发中,定义api是很常见的。因为系统的很多功能是不对外开放的,系统可以通过定义api给应用层调用,方便实现相关的功能。关于定义接口,可参考系统相关服务,如AMS,PMS等模块的实现方式,将接口定义跟具体实现分离出来,当第三方应用需要二次进行开发时,只需要提供接口类封装的jar即可,且具体实现对应用是透明的。定义思路jar包中的类ApiManager.java接口类,作为 应用调用的入口IApiManager.aidlaidl,与功能实现的类进行通信ApiMan...

在系统开发中,定义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

相关标签: Androd系统之旅