• 【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"));
    
    • 1
    • 2
    • 3

    添加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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 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

  • 相关阅读:
    7年阿里测试经验之谈 —— 用UI自动化测试实现元素定位
    Anaconda删除虚拟环境
    企业用户如何快速搭建自己官方网站或者是电商网站?
    广度优先遍历详解
    “夭折“的AirPower将复活?iPhone开启长距离无线充电
    php——三篇夯实根基第一篇
    算法竞赛进阶指南 基本算法 0x02 递推与递归
    在hadoop上搭建hive环境
    性能测试方法全解
    二叉堆------小根堆
  • 原文地址:https://blog.csdn.net/qq_39441603/article/details/133861072