init.rc中getprop获取,setprop设置以及whatchprops命令

本文介绍了Android系统中的关键配置文件如/init.rc、/default.prop及/system/build.prop的作用,并详细解释了如何利用setprop、getprop及watchprops命令来设置、获取和监控系统属性。

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

在android系统中,有一些初始化的配置文件,例如:
freescal android4.4中
/init.rc                    /android/device/fsl/sabresd_6dq$ vim init.rc

/default.prop     /android./out/target/product/sabresd_6dq/root/default.prop

/system/build.prop   /android /out/target/product/sabresd_6dq/system/build.prop

文件里面里面配置了开机设置的系统属性值,
这些属性值,可以通过getprop获取,setprop设置,
它的格式如下:
getprop [key]
获取指定key的配置值,如果不带参数,只是getprop则是显示系统所有的配置值。
[dalvik.vm.heapsize]: [24m]
[curlockscreen]: [1]
[ro.sf.hwrotation]: [0]
[ro.config.notification_sound]: [OnTheHunt.ogg]
[ro.config.alarm_alert]: [Alarm_Classic.ogg]
setprop [key] [value]
设置指定key的属性值,
watchprops
监听系统属性的变化,如果期间系统的属性发生变化则把变化的值显示出来
/system # watchprops
1307501833 sys.settings_system_version = '37'
1307501836 sys.settings_system_version = '38'
1307501862 persist.sys.timezone = 'Asia/Hong_Kong'
其实这三个命令都是toolbox的子命令,如果有兴趣的可以看在android源码中看到其对应的源码:
system/core/toolbox/
setprop [key] [value] 是设置指定key的属性值的,望采纳
表示「ro.product.device = "dma6410xp"」的意思。Android 系統有非常多 property,這些 property 都是 Android 作業系統本身在使用的重要變數,例如:上例的「ro.product.board」就是給 HAL 使用的重要變數。
玩转Android中的setprop, getprop, watchprops命令
       setprop, getprop和watchprops都与环境变量有关, setprop和getprop很简单, 我就不多说了。 下面简单聊聊非常实用的watchprops命令。

       在调试程序时候, 经常需要关注环境变量的状态, 当然, 你总用getprop也可以, 但是感觉很不连贯, 没有实现实时监控。 此时, watchprops命令刚好可以解决这个问题。

实验: 用adb连上android手机, 进入shell, 然后输入whatchprops命令, 然后玩转你的手机, 进行各种设置, 观察shell界面的变化。

在 init.rc 裡找到類似以下的命令片斷:

on boot
    setprop ro.FOREGROUND_APP_ADJ 0
    setprop ro.VISIBLE_APP_ADJ 1
    setprop ro.SECONDARY_SERVER_ADJ 2
    ...

以上是一個動作(action)區段的設定,說明如下:

1. on boot 表示在開機時(boot)觸發此動作區段裡的所有命令。
2. setprop 是設定 Android property 的命令。

上述提及的「動作區段」設定格式如下:

on <trigger>
   <command>
   <command>
   <command>

當 "trigger" 為 "boot" 時,表示「開機觸發」。一個動作區段裡,可以有任意個命令(command),每個命令獨立於一行。最常見,也最重要的命令就是 'setprop'。'setprop' 用來設定 'property' 的值,property 有點像是系統的「環境變數(environment variable)」。其命令格式如下:


<think>我们正在讨论如何修改Android10的init.rc文件以实现应用自启动。注意:从Android7.0(Nougat)开始,Google加强了安全限制,普通应用无法直接修改系统文件(如init.rc),因为这需要root权限和修改系统分区。此外,init.rcinit进程的配置文件,位于系统分区的根目录(/),在启动早期由init进程解析执行。重要提醒:修改init.rc通常需要解锁bootloader、刷入自定义Recovery、获取root权限,并且重新打包系统镜像。这会使设备失去保修,并可能带来安全风险。请谨慎操作。步骤概述:1.获取设备的root权限(通常需要解锁bootloader并刷入Magisk等root工具)。2.挂载系统分区为可读写(在Android10中,系统分区通常是只读的,需要重新挂载)。3.修改init.rc文件,添加启动你的应用的命令。4.确保修改后的系统镜像被重新刷入。具体步骤:步骤1:解锁bootloader和root-不同设备解锁方法不同,通常需要在开发者选项中启用OEM解锁,然后通过fastboot命令解锁。-刷入自定义Recovery(如TWRP),然后通过Recovery刷入Magisk以获取root权限。步骤2:挂载系统分区-在root后的设备上,可以使用adbshell和su命令进入rootshell。-然后重新挂载系统分区为可读写:```shelladbshellsumount-orw,remount/system```注意:在Android10中,由于动态分区和系统分区的只读挂载,上述命令可能不工作。你可能需要修改/vendor/etc/fstab文件来改变挂载选项,或者使用Magisk挂载模块。步骤3:修改init.rc-init.rc文件通常位于根目录下的系统分区,路径为`/system/etc/init/`或者`/`(根目录)下的init.rc。实际上,在Android10中,init.rc被拆分到多个文件,通常位于`/system/etc/init/`和`/vendor/etc/init/`等目录。-你需要找到合适的init.rc文件(例如,可以在`/`目录下有一个主init.rc,但建议在`/system/etc/init/`下创建自己的rc文件,以免破坏系统原有文件)。-添加一个service来启动你的应用。例如,假设你的应用包名为com.example.myapp,你可以添加如下服务:```iniservicemyapp/system/bin/amstart-ncom.example.myapp/.MainActivityclassmainuserrootgrouprootoneshot```注意:使用`am`命令(ActivityManager)来启动应用。但请注意,在init.rc中运行shell命令需要使用`exec`或直接指定可执行文件。上面的例子中,我们使用`/system/bin/am`,但请注意`am`是一个shell脚本,在init环境中可能无法正常运行(因为缺少环境变量)。因此,更可靠的方式是编写一个sh脚本,然后在rc文件中调用该脚本。替代方案:编写一个启动脚本(例如`/system/bin/start_myapp.sh`):```shell#!/system/bin/sh#等待系统基本服务就绪sleep10amstart-ncom.example.myapp/.MainActivity```然后修改权限:```shellchmod755/system/bin/start_myapp.sh```然后在init.rc(或新建的rc文件)中添加:```iniservicestart_myapp/system/bin/start_myapp.shclassmainuserrootgrouprootoneshot```步骤4:保存并重启-保存修改后的rc文件和脚本。-重启设备。注意事项:-修改系统文件后,OTA更新可能会覆盖这些修改。-在Android10中,系统分区是只读的,即使你暂时挂载为读写,重启后也会恢复。因此,你需要将修改后的系统分区重新打包成系统镜像并刷入。替代方案:使用Magisk模块-由于直接修改系统分区复杂且易被覆盖,推荐使用Magisk模块来修改启动脚本。Magisk模块可以在系统启动时挂载自定义文件到系统目录。-创建Magisk模块,在模块的`post-fs-data.sh`或`service.sh`中编写启动逻辑,或者将自定义的rc文件放在模块的`system/etc/init/`目录下,这样在启动时会被挂载到系统的`/system/etc/init/`。创建Magisk模块的步骤:1.创建以下目录结构:```myautostart/├──META-INF/│└──com/│└──google/│└──android/│├──update-binary│└──updater-script├──module.prop├──system/│└──etc/│└──init/│└──myautostart.rc#你的rc文件└──custom.sh#可选,如果需要脚本```2.`myautostart.rc`内容如前所述。3.打包成zip文件,通过MagiskManager安装。但是,请注意:在Android10中,init.rc的执行环境可能没有`am`命令,因为`am`是一个通过`cmd`调用的服务(在Androidshell中可用,但在init的上下文中不可用)。因此,更安全的方式是使用`start`命令(这是init内置的命令)来启动一个activity,但`start`命令init.rc中只能启动由init进程定义的服务,而不能直接启动应用组件。因此,我们可能需要通过执行一个shell脚本来启动应用,并且这个脚本需要等待系统服务(包括ActivityManager)就绪。通常的做法是延迟一段时间(如30秒)或者检测系统服务的状态(例如,通过`getpropsys.boot_completed`)。修改启动脚本`start_myapp.sh`:```shell#!/system/bin/sh#等待系统启动完成while["$(getpropsys.boot_completed)"!="1"];dosleep1done#启动应用amstart-ncom.example.myapp/.MainActivity```然后在rc文件中调用这个脚本。总结:由于Android系统的限制,实现开机自启动应用最常用的方法是监听开机广播(`BOOT_COMPLETED`),但这种方法可能会被系统省电策略限制。如果确实需要更可靠的自启动(例如在系统启动早期运行),修改init.rc是一种方式,但需要root和修改系统,且实现起来较为复杂。因此,请根据实际需求选择方案。由于修改init.rc的复杂性和风险,建议优先考虑使用`BOOT_COMPLETED`广播接收器,除非有特殊需求。如果坚持修改init.rc,请务必做好备份,并了解如何恢复设备。相关问题:1.如何在不修改init.rc的情况下实现Android应用开机自启动?2.如何创建Magisk模块来修改系统文件?3.Android10中系统分区只读,如何永久修改系统文件?4.如何编写一个在Androidinit.rc中可靠运行的启动脚本?5.修改init.rc后设备无法启动怎么办?</think>### 修改 Android 10 的 init.rc 实现应用自启动 #### 核心原理 Android 启动时,`init` 进程会解析 `/system/etc/init/` 和 `/vendor/etc/init/` 目录下的 `.rc` 文件。通过添加自定义服务(service)并设置触发条件(如 `on property:sys.boot_completed=1`),可实现应用自启动。需注意: 1. **需解锁 Bootloader 和 Root 权限**:修改系统分区需解 BL 锁并刷入 Magisk 等工具 2. **系统分区只读**:Android 10 后系统分区默认为只读,需重新挂载为可写 3. **签名验证**:修改系统文件可能触发 AVB 验证失败 #### 详细步骤 ##### 1. 准备环境 ```shell adb root # 获取ADB root权限 adb remount # 重新挂载系统分区为可写 adb pull /system/etc/init/init.rc # 备份原始文件 ``` ##### 2. 修改 init.rc 文件 在文件末尾添加自定义服务(示例以启动包名为 `com.example.app` 的应用): ```ini service start_myapp /system/bin/sh /data/start_app.sh class main user root group root oneshot on property:sys.boot_completed=1 # 在系统启动完成后触发 ``` ##### 3. 创建启动脚本 `/data/start_app.sh` ```shell #!/system/bin/sh # 等待系统服务就绪 until [ "$(getprop sys.boot_completed)" = "1" ]; do sleep 1; done # 启动应用 am start -n com.example.app/.MainActivity ``` ##### 4. 推送修改后的文件 ```shell adb push start_app.sh /data/ adb push init.rc /system/etc/init/ adb shell chmod 755 /data/start_app.sh # 添加执行权限 adb shell chmod 644 /system/etc/init/init.rc ``` ##### 5. 重新打包系统镜像(关键步骤) ```shell make_ext4fs -l 1024M system_new.img system/ # 生成新镜像 fastboot flash system system_new.img # 刷入设备 ``` #### ⚠️ 注意事项 1. **系统兼容性**: - Android 8.0+ 使用 Treble 架构,需同时修改 `/vendor/etc/init/hw/` 下的 rc 文件 - SELinux 策略需调整:添加 `allow init app_data_file:file execute` 规则 2. **替代方案推荐**: ```java // 标准广播接收器(无需root) public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { context.startActivity(new Intent(context, MainActivity.class)); } } } ``` 在 `AndroidManifest.xml` 声明权限: ```xml <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> ``` 3. **风险提示**: - 错误修改可能导致系统无法启动(需提前备份) - OTA 更新会覆盖修改 - 部分厂商设备有启动签名验证(如 Samsung KNOX) #### 推荐安全方案 1. **Magisk 模块方案**(无需修改系统分区): - 创建模块在 `/post-fs-data.d/` 添加启动脚本 - 使用 `setprop persist.myapp.start 1` 触发自定义服务 2. **利用系统服务**: ```ini # 在 /vendor/etc/init/myapp.rc 添加 service myapp /system/bin/app_process ... com.example.AppService class core user system ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值