美文网首页
android 自定义驱动(第五篇:Framework Java

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

作者: momxmo | 来源:发表于2020-05-25 23:08 被阅读0次

    简介

    上一章实现了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
    

    相关文章

      网友评论

          本文标题:android 自定义驱动(第五篇:Framework Java

          本文链接:https://www.haomeiwen.com/subject/kepaghtx.html