在Android五层架构中,native层基本上全是c++的世界,这些c++进程基本上靠android世界的第一个进程init进程创建,init通过rc配置文件,创建了众多的c++子进程,也是这众多的c++进程,构建了整个android世界的native层。
这里介绍一下如何自定义一个native进程,或者c++进程,或者init服务。在阅读本篇之前,可以先看看Android Native 之 Init进程分析_android init进程-CSDN博客
一、System分区native进程
在system分区创建native进程,我们可以先在system代码里面创建一个目录,这里以BootLogo目录举例子,在这个目录下面,我们需要做的事情可以总结如下:
- 编写Android.bp:通过cc_binary生成system/bin可执行文件,通过init_rc指定init对改进程的启动入口
- 实现main函数:实现该进程的逻辑,注意需要正确引用android native层的动态库
- 实现rc脚本:配置启动参数,或者启动逻辑
- 配置selinux权限
- 通过PRODUCT_PACKAGES预装该模块到系统
1、Android.bp配置
2、init.rc配置
init.rc的配置完全基于init进程的机制,因此这里的参数和具体使用,均可参考Android Native 之 Init进程分析_android init进程-CSDN博客
3、实现main函数
如下代码,实现main函数,main函数里面可以接受来自rc的参数,这里简单实现
4、编译预装模块
在system代码下面的mk编译脚本中,通过PRODUCT_PACKAGES来预装集成该模块
二、Vendor分区natvie进程
在vendor创建native进程,大体流程和system的基本一致,但是需要考虑的几个点如下:
- Android.bp指定生成的可执行文件在vendor/bin目录下
- rc脚本需要指定vendor/bin
- selinux权限需要符合vendor的规则
- 需要在vendor预装此模块,即需要放在vendor代码侧
1、Android.bp配置
与system的核心差异,就是需要将可执行文件输出在vendor/bin目录下,而不是system/bin目录下,同样rc文件也需要输出在vendor/etc/init/目录下,而不是vendor/etc/init/目录下,这里我们在bp文件使用vendor: true字段即可满足。
2、init.rc配置
这里基本上和第一章内容一致,值得注意的是,这里需要指定vendor/bin目录下的可执行文件
3、实现main函数
同上。
4、编译预装模块
同上。
在vendor侧代码下面的mk编译脚本中,也是通过PRODUCT_PACKAGES来预装集成该模块