【Android开发】Android服务和系统服务

Android中的服务和系统服务

  • Android服务:一个后台运行的组件,执行长时间运行且不需要用户交互的任务。在Android开发中作为一个应用组件,通过继承类extern Service来使用。

  • Android系统服务:随着Andorid系统启动运行的service,分为Java系统服务和Native系统服务。

添加Java系统服务

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/

  1. 使用 aidl 定义服务接口
    编写IHelloService.aidl,
    执行 mm -j 命令编译 framework.jar 模块
    编译成功后会生成IHelloService.java 这个文件

  2. 实现接口
    实现 HelloService.java 文件

  3. 将服务添加到 ServiceManager
    修改 SystemServer.java 文件,在 startOtherServices 方法里面增加代码

  4. 设置selinux 规则

  5. 编译验证

  6. 客户端调用

import android.pure.IHelloService;
……
service = IHelloService.Stub.asInterface(ServiceManager.getService("HelloService"));

添加Native系统服务

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 系统服务。

  1. 声明服务接口
    编写HelloNativeService.h
class HelloNativeService: public BBinder {
    
    
public:
    HelloNativeService();
    static int instantiate();
    virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);

};
  1. 实现服务功能
    创建文件 HelloNativeService.cpp
#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);
}
  • code : 表示要执行的动作,类似Handler发送的Message的what。code指示了当前远程操作的命令,IBinder定义了像INTERFACE_TRANSACTION、PING_TRANSACTION 这样的几个通用命令。自己使用的命令的标识值需要在FIRST_CALL_TRANSACTION和LAST_CALL_TRANSACTION之间。
  • request, reply : request 和 reply 参数相当于普通函数里的调用参数和返回值。Parcel类型是可以跨进程的数据。
  • flag : 参数 flags 只有 0 和 FLAG_ONEWAY 两种。0 表示阻塞调用, FLAG_ONEWAY 表示异步调用。这个参数不需要我们在服务端处理, Binder 框架会自动处理。
  1. 添加 main.cpp
    前面我们定义了服务接口而已,这个服务也是需要依赖在某个进程才能运行的

  2. 编写Android.bp

  3. 设置selinux 规则

  4. 设置开机自动运行

  5. 编写 client 调用服务

  6. 编译运行


参考:https://bbs.huaweicloud.com/blogs/311242

猜你喜欢

转载自blog.csdn.net/qq_39441603/article/details/133861072