Android framework 定制应用接口和服务
在系统开发中,定义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 定制应用接口和服务
-
黑马Android76期学习笔记01基础--day08--start/bind开启服务、电话录音,特别广播接收者,bindService/接口调用服务内方法,混合开启服务,进程间通讯,aidl应用场景
-
Android Framework 常见解决方案(05)Android默认所有应用横屏 解决方案
-
在Android应用中定制菜单
-
Android 产品定制之资源定制(同一应用程序使用不同资源)
-
Android framework 定制应用接口和服务
-
黑马Android76期学习笔记01基础--day08--start/bind开启服务、电话录音,特别广播接收者,bindService/接口调用服务内方法,混合开启服务,进程间通讯,aidl应用场景
-
Android Framework 常见解决方案(05)Android默认所有应用横屏 解决方案