当前位置: 首页 > news >正文

【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

http://www.dtcms.com/a/347085.html

相关文章:

  • PostgreSQL表分区与复杂查询性能优化实践指南
  • 【AI基础:神经网络】17、神经网络基石:从MP神经元到感知器全解析 - 原理、代码、异或困境与突破
  • 当 /etc/sysctl.d/ 目录下存在多个配置文件且配置项冲突时最终会使用哪个配置项
  • 嵌入式linux开发板 IP配置
  • Redis配置与数据类型详解及缓存优化实践
  • 使用VLLM部署大模型embedding/chat 的API
  • 秋招面试准备
  • Git的下载安装和使用以及和IDEA的关联
  • PLECS 中使用 C-Script 来模拟 NTC 热敏电阻(如 NTC3950B)
  • Spring Boot 校验分组(Validation Groups)高级用法全指南
  • 从词源和输出生成等角度详细解析PHP中常用文件操作类函数
  • Mac简单测试硬盘读写速度
  • 计算机网络 TLS握手中三个随机数详解
  • 鸿蒙应用网络开发实战:HTTP、WebSocket、文件下载与网络检测全攻略
  • Ubuntu 操作系统深度解析:从入门到精通(2025 最新版)
  • AP5414 LED驱动芯片:高效灵活,专业级照明解决方案
  • 20250823解决荣品RD-RK3588-MID核心板的底板的adb不通
  • Unity其他--【MMD】如何在Unity中制作MMD
  • Go数据结构与算法-常见的排序算法
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘arviz’问题
  • Boost.Asio 库中的 async_read_some用法
  • JAVA核心基础篇-操作符
  • 嵌入式LINUX——————网络TCP
  • 如何在Ubuntu中删除或修改已有的IP地址设置?
  • 在Excel和WPS表格中快速插入多行或多列
  • 生成一个竖直放置的div,宽度是350px,上面是标题固定高度50px,下面是自适应高度的div,且有滚动条
  • LeetCode算法日记 - Day 19:判定字符是否唯一、丢失的数字
  • 可转换债券高频交易Level-2五档Tick级分钟历史数据分析
  • 什么?OpenCV调用cv2.putText()乱码?寻找支持中文的方法之旅
  • Vue3+ElementPlus倒计时示例