获取更多相关的【RK3576】【Android14】驱动开发,可收藏系列博文,持续更新中:
【RK3576】Android 14 驱动开发实战指南
驱动开发
Android下的根文件系统
Android系统使用的根文件系统是ramdisk(基于内存的文件系统)加上后续挂载的多个分区的组合:
初始根文件系统:
ramdisk(initramfs),包含init进程和基本配置
系统分区:
system:只读,包含Android系统主要组件
vendor:包含厂商特定的硬件和软件
product:包含产品特定的应用和配置
data:可读写,存储用户数据和应用数据
odm:设备制造商特定的配置和二进制文件
Android系统启动根文件系统过程:
1、Bootloader加载内核
2、内核启动,执行init进程作为第一个用户空间进程
3、init进程解析init.rc文件,按照定义启动系统服务
4、通过init.rc中的触发器(如on boot、on property:sys.boot_completed=1)在特定阶段执行我们的脚本
init.rc是Android的初始化语言,用于定义系统启动时需要执行的服务和命令。可以通过修改或添加init.rc文件,告诉init进程在适当的时机执行启动脚本。
通过init.rc添加启动脚本
例如希望在Android14的根文件系统/etc目录下添加一个initrun.sh脚本,并在设备启动过程中运行
创建启动脚本
在设备对应的device/rockchip/rk3576/目录下创建initrun.sh脚本文件:
#!/system/bin/sh
# 在这里添加你的脚本内容
log -t initrun "Initrun script is running"
# 其他操作...#上述命令的作用是在系统日志中记录一条信息,标记initrun脚本已经开始执行
#便于开发者和系统管理员通过logcat工具追踪脚本的执行情况#可以通过 " logcat -s initrun " 命令来查看所有标签为"initrun"的日志信息
创建init.rc配置
在device/rockchip/rk3576/目录下创建init.rk3576.rc文件,添加以下内容:
on boot
# 系统基本服务启动后执行
exec /system/bin/sh /product/etc/initrun.sh#
on boot
是Android init语言中的一种特殊触发器,它的执行机制如下#Android init进程在完成基本初始化后,会加载解析所有.rc文件
#按.rc文件加载顺序和内部顺序执行所有收集到的on boot命令
#加载目录:
/system/etc/init/*.rc
/vendor/etc/init/*.rc
/product/etc/init/*.rc
/odm/etc/init/*.rc
或者定义为服务:
service initrun /system/bin/sh /product/etc/initrun.sh
class main #将服务归类为"main"类,这是Android系统中的核心服务类别
user root #指定以root用户和组的权限运行此服务
group root
oneshot #表示服务只执行一次,执行完成后不会自动重启
disabled #表示服务默认不会自动启动,需要显式地通过start initrun
命令来启动
修改设备配置文件
在device/rockchip/rk3576/BoardConfig.mk或device.mk中添加:
# 添加init.rc文件
PRODUCT_COPY_FILES += \
device/rockchip/rk3576/init.rk3576.rc:product/etc/init.rk3576.rc# 添加启动脚本
PRODUCT_COPY_FILES += \
device/rockchip/rk3576/initrun.sh:product/etc/initrun.sh