在android init.xxx.rc中启动shell脚本

本文详细介绍了如何在启动时设置shell环境,包括用户权限、组权限及一次性运行的服务配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


on boot
# start essential services
    start shell-setup

service shell-setup /system/etc/init.shell.sh

    user root
    group root

    oneshot



<think>好的,我现在需要帮助用户查找Android中sys.boot.reason的设置位置或初始化来源。首先,我得理解sys.boot.reason这个属性的作用。在Android系统中,系统属性通常用于记录和传递各种状态信息,比如启动原因、调试信息等。sys.boot.reason可能记录了设备最近一次启动的原因,比如正常重启、恢复模式或者崩溃导致的重启。 接下来,用户提供的引用中有几个可能与启动流程相关的信息。引用[1]提到内核通过启动参数传递以androidboot开头的字符串,如果是qemu启动,会设置ro.kernel.xxx。这可能涉及到启动参数的解析和系统属性的设置。引用[4]展示了日志中的重启命令,比如'recovery',这可能导致sys.boot.reason被设置为相应的值。因此,sys.boot.reason可能是在系统重启过程中由init进程或相关服务设置的。 我需要回顾Android启动流程中的关键步骤。根据引用[2],AMS属于引导服务,在startBootstrapServices()中启动。不过AMS主要负责Activity管理,可能不直接处理启动原因属性。而引用[3]提到Uboot的初始化流程,这可能属于更底层的启动阶段,但Android系统属性通常在Linux内核启动后的用户空间设置,比如由init进程处理。 在Android系统中,init进程是第一个用户空间进程,负责解析init.rc文件并设置系统属性。当系统重启时,比如进入恢复模式,init进程可能会根据接收到的重启命令设置相应的属性。例如,在引用[4]的日志中,重启命令是'recovery',这可能触发init进程设置sys.boot.reason为'recovery'。 另外,系统属性可能通过不同的方式设置:例如,通过内核命令行参数(androidboot.*)、init.rc脚本中的命令(setprop)、或者由特定服务(如bootanim、vold)设置。根据引用[1],androidboot参数会被转换为ro.boot.*属性,但sys.boot.reason可能属于运行时属性,而非只读的ro属性。 我需要进一步确认sys.boot.reason的具体设置位置。可能在init进程中处理重启命令时,会将重启原因写入该属性。例如,当用户通过fastboot或adb发出reboot recovery命令时,init进程接收到重启请求,设置sys.boot.reason为'recovery',然后执行重启操作。这样在下次启动时,该属性仍然保留,直到被新的启动原因覆盖。 此外,查看Android源码中的相关部分可能会有帮助。例如,在init进程中,处理重启命令的代码可能会调用property_set函数来设置sys.boot.reason。或者在系统服务启动时,根据启动参数设置该属性。 总结可能的设置路径: 1. 内核启动参数通过bootloader传递,如androidboot.bootreason=xxx,然后由init进程转换为ro.boot.bootreason属性。 2.init.rc脚本中,根据重启命令(如recovery、bootloader)设置sys.boot.reason。 3. 在系统服务(如AMS)处理重启时,设置该属性。 根据用户提供的引用,尤其是引用[4]中的日志,显示重启命令是'recovery',并且arch_reset处理了该命令。此时,init进程可能在处理重启前设置sys.boot.reason为'recovery',以便下次启动时系统可以读取该原因。 因此,sys.boot.reason可能由init进程在接收到重启命令时设置,具体代码可能在init进程中处理reboot的部分,或者在解析启动参数时从内核获取相关信息并设置属性。</think>在Android系统中,`sys.boot.reason`属性用于记录设备启动原因,其设置位置和初始化来源主要涉及以下环节: --- ### **1. 内核启动参数传递** - 在内核启动阶段,Bootloader(如U-Boot)会通过`androidboot.xxx`参数传递启动原因(例如`androidboot.bootreason=recovery`)。 - 这些参数会被转换为只读属性`ro.boot.bootreason`,而非直接设置`sys.boot.reason`[^1]。 - **代码路径**:`system/core/init/property_service.cpp`中的`ProcessKernelCmdline()`函数负责解析内核参数。 --- ### **2. init进程动态设置** - **主要来源**:`sys.boot.reason`通常由`init`进程在系统重启前动态设置。 - 当系统收到重启指令(如`reboot recovery`)时,`init`进程会通过`property_set("sys.boot.reason", reason)`写入启动原因[^4]。 - **代码路径**:`system/core/init/reboot.cpp`中的`SetProperty("sys.boot.reason", reason)`调用。 --- ### **3. 系统服务或硬件异常触发** - 若系统因异常(如看门狗超时、内核崩溃)重启,硬件或底层服务(如`hwservicemanager`)可能直接设置该属性。 - 例如,高通的RAM dump流程会通过`msm_set_reboot_reason()`函数设置启动原因。 --- ### **验证方法** 1. **查看当前属性值**: ```bash adb shell getprop sys.boot.reason ``` 2. **内核日志过滤**: ```bash adb logcat | grep "boot reason" ``` 3. **源码关键函数**: - `init`进程中的`HandlePowerctlMessage()`(处理`reboot`命令)[^4]。 - `PropertyService`的`PropertySet()`(属性写入逻辑)。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值