Android服务:一个后台运行的组件,执行长时间运行且不需要用户交互的任务。在Android开发中作为一个应用组件,通过继承类extern Service来使用。
Android系统服务:随着Andorid系统启动运行的service,分为Java系统服务和Native系统服务。
http://qiushao.net/2019/12/20/Android%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8/7-%E6%B7%BB%E5%8A%A0java%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1/
使用 aidl 定义服务接口
编写IHelloService.aidl,
执行 mm -j 命令编译 framework.jar 模块
编译成功后会生成IHelloService.java 这个文件
实现接口
实现 HelloService.java 文件
将服务添加到 ServiceManager
修改 SystemServer.java 文件,在 startOtherServices 方法里面增加代码
设置selinux 规则
编译验证
客户端调用
import android.pure.IHelloService;
……
service = IHelloService.Stub.asInterface(ServiceManager.getService("HelloService"));
http://qiushao.net/2019/12/29/Android%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8/9-%E6%B7%BB%E5%8A%A0native%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1/
上一小节是Java层系统服务的实现方式。有时候出于性能方面的考虑,有些服务是需要使用 C++ 来实现的,比如音视频编解码,图形绘制等。 Android 系统原生的 MediaPlayerService 和 SurfaceFlinger 就是使用 c++ 实现的 Native 系统服务。
class HelloNativeService: public BBinder {
public:
HelloNativeService();
static int instantiate();
virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);
};
#include "HelloNativeService.h"
static void sayHello(const char *name) {
LOGD("hello %s from HelloNativeService", name);
}
static int sum(int a, int b) {
return a + b;
}
HelloNativeService::HelloNativeService() {
LOGD("HelloNativeService created");
}
status_t HelloNativeService::onTransact(uint32_t code, const Parcel &request, Parcel *reply, uint32_t flag) {
switch (code) {
case CMD_SAY_HELLO:
sayHello(request.readCString());
return NO_ERROR;
case CMD_CAL_SUM:
int a = request.readInt32();
int b = request.readInt32();
reply->writeInt32(sum(a, b));
return NO_ERROR;
}
return BBinder::onTransact(code, request, reply, flag);
}
添加 main.cpp
前面我们定义了服务接口而已,这个服务也是需要依赖在某个进程才能运行的
编写Android.bp
设置selinux 规则
设置开机自动运行
编写 client 调用服务
编译运行
参考:https://bbs.huaweicloud.com/blogs/311242