框架层添加硬件访问服务

这是一个系列文章:

  1. Android 内核添加驱动
  2. 测试freg驱动的功能内置C程程序
  3. 添加HAL层代码
  4. 添加JNI层
  5. 框架层添加硬件访问服务

该系列能对android的从下到上的各层有一个简单的设计,麻雀虽小,五脏俱全。enjoy now!

本节内容包括添加硬件访问服务,配置selinux权限,启动服务.

1. 添加硬件访问服务

由于freg服务是在system_server进程中,而访问该服务的app是在自己的进程里,属于两个不同的进程,因此需要用到跨进程通讯Binder,freg服务是一个stub端,要实现AIDL方法.
frameworks/base/core/java/android/os/IFregService.aidl:

package android.os;

/** @hide */
interface IFregService {
        void setVal(int val);
        int getVal();
}

该方法中注意要添加/** @hide */,否则编译会报错,提示更新更新API.加了hide相当于不对外公开,就不需要更新API
frameworks/base/Android.mkLOCAL_SRC_FILES添加:

    core/java/android/os/IFregService.aidl \

作用是添加IFregService.aidl源文件.需要注意的是在mk文件的书写中,每行的开头要用table键,而不是8个空格!!!

添加系统服务代码frameworks/base/services/core/java/com/android/server/FregService.java:

package com.android.server;

import android.content.Context;
import android.os.IFregService;
import android.util.Slog;

public class FregService extends IFregService.Stub {
        private static final String TAG = "FregService";

        private int mPtr = 0;

        FregService() {
                mPtr = init_native();

                if(mPtr == 0) {
                        Slog.e(TAG, "Failed to initialize freg service.");
                }
        }

        public void setVal(int val) {
                if(mPtr == 0) {
                        Slog.e(TAG, "Freg service is not initialized.");
                        return;
                }

                setVal_native(mPtr, val);
        }

        public int getVal() {
                if(mPtr == 0) {
                        Slog.e(TAG, "Freg service is not initialized.");
                        return 0;
                }

                return getVal_native(mPtr);
        }

        private static native int init_native();
        private static native void setVal_native(int ptr, int val);
        private static native int getVal_native(int ptr);
};

调用native方法,实现对dev/freg的读写操作.

2. 配置selinux权限

在device.te文件中添加:

type freg_device, dev_type;

在domain.te文件中添加:

allow domain freg_device:chr_file rw_file_perms;

在file_contexts文件中添加:

/dev/freg           u:object_r:freg_device:s0

在service.te中文件中添加:

type freg_service, system_api_service, system_server_service, service_manager_type;

在service_contexts文件中添加:

freg                                      u:object_r:freg_service:s0

在system_server.te文件中添加:

allow system_server freg_device:chr_file rw_file_perms;

在untrusted_app.te文件中添加:

allow untrusted_app freg_service:service_manager find;

在system_app.te文件中添加:

allow system_app freg_service:service_manager find;

参考blog:在/dev下添加新设备驱动下Selinux相关设置

3. 启动服务

在'frameworks/base/services/java/com/android/server/SystemServer.java'中的startOtherServices()添加如下代码:

           try {
               Slog.i(TAG, "Freg Service");
               ServiceManager.addService("freg", new FregService());
           } catch (Throwable e) {
               Slog.e(TAG, "Failure starting Freg Service", e);
           }

把new的实例FregService注册到ServiceManager,取名:freg.这个名字在配置selinux权限

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,978评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,859评论 18 139
  • 他们告诉我帖子标题一定要长,要不没人看。 依着快速阅读潜规则,先放结论:这个标题是解构文章的滥觞;解构文章的好景不...
    连看客都不是阅读 3,515评论 3 22
  • 距离N1还有75天,很迷茫,但我知道这很正常,下决心改掉强迫症,不在一遍遍的重复上面浪费时间,决定背单词和语法以眼...
    Devil昊阅读 180评论 0 0
  • 老树 这是一棵老树,一棵长在沙河岸边苍老遒劲高大伟岸的老梧桐树。 每天清晨,在河堤上跑步的我,都要从它身边跑过,每...
    5780933168ec阅读 322评论 4 5