【RK3576】【Android14】Android平台跟文件系统

获取更多相关的【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