Android framework 中间件开发(一)_android中间件开发
在Android开发中,经常会调用到一些系统服务,这些系统服务简化了上层应用的开发,这便是中间件的作用,中间件是介于系统和应用之间的桥梁,将复杂的底层逻辑进行一层封装,供上层APP直接调用,或者将一些APP没有权限一些操作放到中间件里面来实施.
假设一个需求,通过中间件调节系统亮度,这边我们使用DisplayManager来调节亮度,DisplayManager在上层应用中是获取不到setBrightness函数的,但是在中间件中可以,这便是中间件的作用.
这里我将一步一步展示中间件开发的步骤:
总共分为三部分:
Android framework 中间件开发(一)
Android framework 中间件开发(二)
Android framework 中间件开发(三)
目录
1.定义接口文件
2.实现接口
3.添加到系统服务
4.定义代表服务的字符串
5.定义外部控制类
6.实例化
7.添加权限
8.编译源码
9.调用中间件
1.定义接口文件
frameworks\\base\\core\\java\\android\\路径下新建一个文件夹,名字为\"darkcontrol\",在文件夹中新建一个文件,名字为IDarkControlManager.aidl,里面定义一个函数,传入需要调节的亮度值(0~1),内容如下
package android.darkcontrol;/** {@hide} */interface IDarkControlManager{ void setBright(float bright);}
注意:这边开头的/** {@hide} */不能少,要不然会编译不通过
2.实现接口
frameworks\\base\\services\\core\\java\\com\\android\\server\\路径下新建文件,名字为DarkControlService.java,实现IDarkControlManager里面的接口
package com.android.server;import static android.view.Display.DEFAULT_DISPLAY;import android.content.Context;import android.util.Log;import android.hardware.display.DisplayManager;import android.os.PowerManager;import android.darkcontrol.IDarkControlManager;public class DarkControlService extends IDarkControlManager.Stub { private final String TAG = \"--==>>DarkControlService\"; private final Context mContext; private float maxBrightness = 1; private float minBrightness = 0; private DisplayManager mDisplayManager; private PowerManager mPowerManager; public DarkControlService(Context context) { mContext = context; Log.i(TAG, \"DarkControlService init\"); mDisplayManager = context.getSystemService(DisplayManager.class); mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); maxBrightness = mPowerManager.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM); minBrightness = mPowerManager.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM); } /** * 设置亮度 * * @param bright 0~1 */ @Override public void setBright(float bright) { Log.i(TAG, \"setBright: \" + bright); if (bright > 1) { bright = 1; } if (bright < 0) { bright = 0; } float brightness = (maxBrightness - minBrightness) * bright; setBrightnessToSystem(brightness ); } //设置亮度到系统 private void setBrightnessToSystem(float brightness) { Log.i(TAG, \"setBrightnessToSystem: \" + brightness); // 设置系统亮度 mDisplayManager.setBrightness(DEFAULT_DISPLAY, brightness); }}
到这里我们需要的业务逻辑基本完成了, 接下来在系统中注册我们的服务.
3.添加到系统服务
frameworks\\base\\services\\java\\com\\android\\server\\SystemServer.java
在startOtherServices函数中添加
这些就按照系统原有的服务添加即可.
4.定义代表服务的字符串
frameworks\\base\\core\\java\\android\\content\\Context.java
文件中定义字符串,这边的字符串内容要和SystemServer中addService中的一致
5.定义外部控制类
frameworks\\base\\core\\java\\android\\darkcontrol\\路径下新建文件,名字为DarkControlManager.java,内容如下:
package android.darkcontrol;import android.annotation.SystemService;import android.content.Context;import android.os.RemoteException;import android.os.ServiceManager;import android.util.Log;import android.darkcontrol.IDarkControlManager;@SystemService(Context.DARK_CONTROL_SERVICE)public class DarkControlManager { private final String TAG = \"--==>>DarkControlManager\"; private final Context mContext; private final IDarkControlManager mService; /** * {@hide} */ public DarkControlManager(Context context) { mContext = context; mService = IDarkControlManager.Stub.asInterface(ServiceManager.getService(Context.DARK_CONTROL_SERVICE)); } /** * 设置亮度 * * @param bright 0~1 */ public void setBright(float bright){ try { mService.setBright(bright); } catch (Exception e) { e.printStackTrace(); } }}
注意:1.开头的@SystemService(Context.DARK_CONTROL_SERVICE)
2.调用services中的函数需要包裹一层try{}catch(){};
6.实例化
frameworks\\base\\core\\java\\android\\app\\SystemServiceRegistry.java
在SystemServiceRegistry文件中,找到开头的static{}代码块,实例化DarkControlManager
至此,中间件开发已经完成一半了.接下来的都是体力活...
7.添加权限
system/sepolicy/路径下,添加权限,总共41个文件.挨个添加
这些文件中的权限添加方式都差不多,大致分为一下几种,照着系统的抄就行,注意版本号的改动
*\\service_contexts:
*\\system_server.te
*\\service.te
*\\*.cil(注意这边的28,每个文件中的不一样)
到这里就中间件全部完成了
8.编译源码
不出意外,编译过程会出现这个error的情况:
意思是修改了API,需要更新下,执行一下这行:
m api-stubs-docs-non-updatable-update-current-api
然后再重新编译一下就行了
9.调用中间件
调用方式为getSystemService
注意不能直接new中间件对象,因为系统启动时已经new了一个对象了,这边不要重复new,使中间件保持单例.
下一篇:打包中间件
Android framework 中间件开发(二)