You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改AOSP实现设备开机运行bash脚本及相关配置?

修改AOSP实现开机自动运行bash脚本的方法

一、核心实现步骤(基于Init系统)

最稳定的方式是通过Android Init系统添加自定义服务,具体操作如下:

  1. 编写目标bash脚本(比如命名为my_boot_script.sh),按需求实现逻辑。
  2. 在AOSP源码中配置脚本的编译规则,确保它能被打包进系统镜像。
  3. 编写对应的.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表示脚本仅运行一次,无需常驻;若需循环执行可移除该属性。

四、权限相关要求

  1. 脚本自身权限:编译系统会自动为脚本设置755权限(所有者读写执行,其他用户读执行),也可手动修改源码中脚本的权限为可执行状态。
  2. 运行身份权限:Init进程启动的服务默认以root用户运行,脚本拥有最高系统权限;若需限制权限,可在.rc中通过user <用户名>和group <组名>指定,比如user shell会以普通shell用户运行,此时脚本仅能执行该权限范围内的操作。
  3. SELinux权限:若设备开启SELinux,需添加对应SEPolicy规则,避免脚本被拦截执行。可在设备的SEPolicy目录下添加规则,允许脚本访问所需的文件、设备节点或系统接口。

内容的提问来源于stack exchange,提问作者code

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:15:35