跟随老罗学习虚拟寄存器硬件抽象层开发(8.0)
主机: ubuntu 16.4
android源码版本:8.0
kernel: 3.18
开发内核虚拟设备驱动程序
- 下载内核源码
//在源码根目录下新建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 $对应分支
- 建立内核驱动程序工程
// kernel/goldfish/drivers 是内核驱动程序的目录
cd kernel/goldfish/drivers
//在这个目录下新建我们的helloandroid工程
mkdir helloandroid
- 编写完代码后需要在 kernel/goldfish/drivers/Kconfig 这个文件里添加我们的工程的Kconfig文件
vim kernel/goldfish/drivers/Kconfig
//在文件末尾的endmenu上一行添加如下代码, ""里的内容是我们工程的Kconfig路径
source "drivers/helloandroid/Kconfig"
- 在 kernel/goldfish/drivers/Makefile 文件里添加我们工程的Makefile文件
vim kernel/goldfish/drivers/Makefile
//在文件末尾添加
obj-$(CONFIG_HELLOANDROID) += helloandroid/
- 编译
// 这里选择按照老罗书上说的操作就没问题
make menuconfig
make
dev 目录权限问题
首先在system/core/rootdir/ueventd.rc这个文件的末尾添加如下代码设置权限
/dev/helloandroid 0666 root root
如果是早期没有selinux的设备,这里就可以了.但是在4.0以后强制开启了selinux以后.还需要另外的配置.有两种办法.
- vim system/core/init/init.cpp ,搜索"status = ", 将 return status; 改成return SELINUX_PERMISSIVE, 重新编译系统
- 允许应用读写文件
// 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
- 重新编译系统