android 自定义驱动(第五篇:Framework Java服务篇)

简介

上一章实现了JNI C++,这篇主要实现Java去调用JNI并为应用层提供AIDL服务!

一、定义AIDL接口

frameworks/base/core/java/android/os目录下创建IHelloService.aidl文件:

package android.os;
interface IHelloService {
    void setVal(int val);
    int getVal();
}

这里提供了设值和取值两个对外函数;

二、修改编辑脚本Android.mk

frameworks/base目录,打开Android.mk文件,修改LOCAL_SRC_FILES变量的值,增加IHelloService.aidl源文件:

LOCAL_SRC_FILES += \
.....
    core/java/android/os/IHelloService.aidl \
.....

三、创建服务HelloService

frameworks/base/services/java/com/android/server目录,创建HelloService.java服务类文件;


package com.android.server;
import android.content.Context;
import android.os.IHelloService;
import android.util.Log;
public class HelloService extends IHelloService.Stub {
    private static final String TAG = "HelloService";
    HelloService() {
        Log.d(TAG, "HelloService init_native");
        init_native();
    }
    public void setVal(int val) {
        Log.d(TAG, "HelloService setVal val:" + val);
        setVal_native(val);
    }   
    public int getVal() {
        Log.d(TAG, "HelloService getVal val");
        return getVal_native();
    }
    
    private static native boolean init_native();
    private static native void setVal_native(int val);
    private static native int getVal_native();
};

HelloService主要是通过调用JNI方法init_native、setVal_native、getVal_native为提供硬件服务;

四、启动服务

服务在SystemServer服务中启动,运行在安卓第二大进程system_server中!
修改frameworks/base/services/java/com/android/server/SystemServer.java文件,在startOtherServices()中增加加载HelloService的代码

import com.android.server.HelloService;
......
    private void startOtherServices() {
......
     // 启动 HelloService 并添加到ServiceManager中
     // add HelloService start
     try {
         traceBeginAndSlog("HelloService");
         Slog.i(TAG, "add HelloService");
                 ServiceManager.addService("hello", new HelloService());
         traceEnd();
     } catch (RuntimeException e) {
         Slog.e("HelloService", "******************************************");
         Slog.e("HelloService", "************ Failure starting HelloService", e);
    }
     // add Hello Service end
......
}

五、服务添加Selinux权限:

  • 5.1修改system/sepolicy/private/service_contexts
bluetooth                                 u:object_r:bluetooth_service:s0
+hello                                     u:object_r:hello_service:s0
  • 5.2修改system/sepolicy/public/service.te
+type hello_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;
type search_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;

这一步是为了上次App能够访问到AIDL;

六、编译

直接编译system.img,或单模块编译之后adb push进行测试;

root@ubuntu:make snod -j8
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容