跟随老罗学习虚拟寄存器硬件抽象层开发8.0版本笔记

本文介绍了在Ubuntu16.4环境下,基于Android8.0源码和3.18内核版本开发虚拟设备驱动的过程,包括下载内核源码、创建驱动程序工程、编写及编译驱动,以及处理dev目录的权限问题,特别是涉及到SELinux的配置。同时,文章还讲解了添加HelloandroidService服务的步骤,包括修改SystemServer.java和配置SELinux权限。
摘要由CSDN通过智能技术生成

跟随老罗学习虚拟寄存器硬件抽象层开发(8.0)


主机: ubuntu 16.4
android源码版本:8.0
kernel: 3.18

开发内核虚拟设备驱动程序

  1. 下载内核源码
 //在源码根目录下新建kernel目录
mkdir kernel 
cd kernel
//下载清华源的内核源码,goldfish是专门给模拟器用的。google的需要科学上网
git clone https://aosp.tuna.tsinghua.edu.cn/kernel/goldfish.git
//下载完后切换到对应分支,分支需要打开模拟器,然后adb shell 进去,然后 cat /proc/version 获取linux内核版本
git check -b $对应分支
  1. 建立内核驱动程序工程
// kernel/goldfish/drivers 是内核驱动程序的目录
cd kernel/goldfish/drivers
//在这个目录下新建我们的helloandroid工程
mkdir helloandroid
  1. 编写完代码后需要在 kernel/goldfish/drivers/Kconfig 这个文件里添加我们的工程的Kconfig文件
vim kernel/goldfish/drivers/Kconfig
//在文件末尾的endmenu上一行添加如下代码, ""里的内容是我们工程的Kconfig路径
source "drivers/helloandroid/Kconfig"
  1. 在 kernel/goldfish/drivers/Makefile 文件里添加我们工程的Makefile文件
vim kernel/goldfish/drivers/Makefile
//在文件末尾添加
obj-$(CONFIG_HELLOANDROID)             += helloandroid/
  1. 编译
// 这里选择按照老罗书上说的操作就没问题
make menuconfig
make

dev 目录权限问题

首先在system/core/rootdir/ueventd.rc这个文件的末尾添加如下代码设置权限

/dev/helloandroid 0666 root root

如果是早期没有selinux的设备,这里就可以了.但是在4.0以后强制开启了selinux以后.还需要另外的配置.有两种办法.

  1. vim system/core/init/init.cpp ,搜索"status = ", 将 return status; 改成return SELINUX_PERMISSIVE, 重新编译系统
  2. 允许应用读写文件
 // system/sepolicy/public/device.te
 // system/sepolicy/prebuilts/api/26.0/public/device.te
 type helloandroid_device, dev_type;
 
 // system/sepolicy/private/file_contexts
 // system/sepolicy/prebuilts/api/26.0/private/file_contexts
 /dev/helloandroid u:objcet_r:helloandroid_device:s0

// system/sepolicy/private/system_server.te
// system/sepolicy/prebuilts/api/26.0/private/system_server.te
allow system_server helloandroid_device:chr_file {open read write };

// system/sepolicy/private/system_app.te
// system/sepolicy/prebuilts/api/26.0/private/system_app.te
allow system_app helloandroid_device:chr_file {open read write getattr};

添加HelloandroidService服务

1.修改 frameworks/base/services/java/com/android/server/SystemServer.java文件,在startOtherServices方法中添加如下代码

try {
				traceBeginAndSlog("HelloAndroidService");
				ServiceManager.addService("helloandroid", new HelloAndroidService());
				traceEnd();
			} catch(RuntimeException e) {
				Slog.e("System", "**********fail start service HelloAndroidService");
			}

2. 为helloandroidservice添加selinux权限

// system/sepolicy/public/service.te
// system/sepolicy/prebuilts/api/26.0/public/service.te
type helloandroid_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;

// system/sepolicy/private/service_contexts
// system/sepolicy/prebuilts/api/26.0/private/service_contexts
helloandroid                              u:object_r:helloandroid_service:s0
  1. 重新编译系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值