如何修改AOSP实现设备开机运行bash脚本及相关配置?
修改AOSP实现开机自动运行bash脚本的方法
一、核心实现步骤(基于Init系统)
最稳定的方式是通过Android Init系统添加自定义服务,具体操作如下:
- 编写目标bash脚本(比如命名为
my_boot_script.sh),按需求实现逻辑。 - 在AOSP源码中配置脚本的编译规则,确保它能被打包进系统镜像。
- 编写对应的
.rc初始化脚本,告知Init进程何时、如何启动你的脚本。
二、脚本的放置目录
- 源码存放位置:
- 若为设备专属脚本,放在
device/<厂商名>/<设备型号>/目录下; - 若为通用系统脚本,放在
system/bin/目录下。
- 若为设备专属脚本,放在
- 系统运行时位置:编译完成后,脚本会被自动拷贝到设备的
/system/bin/或/vendor/bin/(由编译规则指定),这两个目录属于系统默认可执行路径,Init进程能直接定位并执行。
举个编译规则示例(放在设备目录下的Android.mk):
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := my_boot_script.sh LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := EXECUTABLES LOCAL_SRC_FILES := $(LOCAL_MODULE) LOCAL_MODULE_PATH := $(TARGET_OUT)/bin include $(BUILD_PREBUILT)
三、运行顺序的定义
脚本的启动时机和顺序由以下几个关键因素决定:
- 触发事件:在
.rc脚本中通过on <trigger>指定,比如on boot是系统启动初期触发,on post-fs-data是数据分区挂载完成后触发,on late-init是更晚的初始化阶段。 - 服务类别(class):给service设置
class <类别>,比如class core属于最早启动的核心服务组,class main是普通应用服务组,同一class的服务会批量启动,不同class按Init进程的预设优先级执行。 - 依赖关系:通过
after <service>或requires <service>指定依赖,确保脚本在某个必要服务启动后再运行,比如after zygote可让脚本在虚拟机启动后执行。
示例.rc脚本(与脚本同目录下的my_boot_script.rc):
service my_boot_script /system/bin/sh /system/bin/my_boot_script.sh class main user root group root oneshot
oneshot表示脚本仅运行一次,无需常驻;若需循环执行可移除该属性。
四、权限相关要求
- 脚本自身权限:编译系统会自动为脚本设置
755权限(所有者读写执行,其他用户读执行),也可手动修改源码中脚本的权限为可执行状态。 - 运行身份权限:Init进程启动的服务默认以
root用户运行,脚本拥有最高系统权限;若需限制权限,可在.rc中通过user <用户名>和group <组名>指定,比如user shell会以普通shell用户运行,此时脚本仅能执行该权限范围内的操作。 - SELinux权限:若设备开启SELinux,需添加对应SEPolicy规则,避免脚本被拦截执行。可在设备的SEPolicy目录下添加规则,允许脚本访问所需的文件、设备节点或系统接口。
内容的提问来源于stack exchange,提问作者code
相关产品推荐
相关产品推荐

