Android7下app以root权限运行shell脚本的一种方法

本文介绍了在Android7系统中如何以root权限运行shell脚本的方法,涉及修改`init.rc`添加服务,配置文件权限,以及创建相应的策略文件。通过这种方法,可以在不开放root权限的情况下,实现对特定操作的root级别控制,例如控制设备背光亮度。

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

如果我们想要以root权限运行一个shell脚本(如此以来可以做很多的事情,比如直接控制设备节点等操作),那我们可以按照如下方法来做
1)修改system/core/rootdir/init.rc,添加如下的service和对应属性修改时启动的服务(在init.rc中可以添加服务,也可以添加系统属性改变时的对应动作),比如我们添加背光灯控制的相关服务和属性动做如下
service bri_off /system/bin/bri_off.sh
class main
user root
group root
oneshot
disabled
seclabel u:r:bri_off:s0

on property:sys.start_brightness_on=0
start bri_off

service bri_on /system/bin/bri_on.sh
class main
user root
group root
oneshot
disabled
seclabel u:r:bri_on:s0

on property:sys.start_brightness_on=1
start bri_on

小注:service后面的服务名字和sh脚本的名字要一样(.sh除外),不然不起作用。
也就是service名字要和bri_on.sh的名字一致是bri_on才能行。

当我们加好service和属性动作后,如果起作用后(到此还没完成,后续还要再给脚本文件添加属性配置),我们在终端输入,setprop sys.start_brightness_on 0就可以关闭背光灯,setprop sys.start_brightness_on 1就可以开启背光灯。这里需要注意,device/rockchip/rk3288/rk3288_box/init.rc中的内容可能也需要和上面的init.rc中的内容同步修改,我目前是这么做的,但是是否是必须的,还需要验证。
2)可以看到我们添加的服务其运行主体就是两个shell脚本,那么为了使得脚本在运行时具有高权限,我们需要在配置文件中为脚本文件配置权限。在system/sepolicy/file_contexts中加入如下配置
/system/bin/bri_off.sh u:object_r:bri_off_exec:s0
/system/bin/bri_on.sh u:object_r:bri_on_exec:s0
在system/sepolicy/目录下,新增两个文件,分别为bri_on.te和bri_off.te;
bri_on.te的内容如下:

type bri_on, domain;
type bri_on_exec, exec_type, file_type;
init_daemon_domain(bri_on)
bri_off.te的内容如下:

type bri_off, domain;
type bri_off_exec, exec_type, file_type;
init_daemon_domain(bri_off)
至此重新编译源码就可以实现以root权限运行脚本了,这样做的好处就是既可以对外开放特定root权限的操作,但是又不用开放root权限。直接通过读写系统属性值的形式来操作。
上面的bri_on.sh和bri_off.sh是我们加入到内核中的脚本,具体的加入方式是,在
device/rockchip/common目录下新建这两个运行脚本,然后在device/rockchip/common目录下的device.mk中新增加对这两个文件的拷贝动作,
就是在变量PRODUCT_COPY_FILES中新增这俩文件的拷贝动作。
device/rockchip/common/bri_on.sh:system/bin/bri_on.sh
device/rockchip/common/bri_off.sh:system/bin/bri_off.sh
之后再编译这俩文件就会被拷贝到对应的位置,从而最终在运行的rom中处于/system/bin/目录下面

<think>好的,我需要帮助用户在Android 9上通过Shell脚本检查某个应用是否已安装,如果未安装则进行安装。首先,我需要回顾用户提供的引用内容,看看有没有相关的信息可以利用。 用户提到了三个引用。引用[1]提到使用`adb install`命令安装APK,并涉及调用shell脚本和cmd程序。引用[2]讨论了PackageInstallerActivity的启动和权限处理。引用[3]涉及如何在编译时复制文件和脚本到系统目录。虽然这些引用主要关于安装过程和系统配置,但用户的问题是关于检查应用是否已安装,并根据结果执行安装。 首先,我需要确定如何在Shell脚本中检查应用是否安装。在Android中,每个应用都有一个唯一的包名,例如`com.example.myapp`。可以通过`pm`(Package Manager)工具来查询已安装的包。常用的命令是`pm list packages [包名]`,如果包存在,会输出对应的包名。 接下来,需要编写Shell脚本,使用条件判断。在AndroidShell环境中,通常使用`sh`或`busybox`,所以需要注意语法的兼容性。例如,可以使用`if`语句结合`grep`来判断包是否存在。 然后,安装部分可以使用`adb install`或者在设备上直接使用`pm install`命令,但需要注意权限问题。如果是通过adb,可能需要设备已启用USB调试,并且在脚本中正确指定APK路径。如果是在设备内部执行脚本,可能需要root权限才能安装到系统目录,或者用户授权安装。 还需要考虑Android 9的特性,比如对非系统应用安装的限制,可能需要处理权限弹窗或使用静默安装(需要系统签名或root权限)。不过,用户可能只是希望在普通环境下执行,所以可能需要用户手动确认安装,除非有更高权限。 另外,用户引用[3]提到在编译时复制APK和脚本到系统目录,这可能意味着用户有系统编译的权限,或者希望预装应用。如果应用被预装到系统分区,可能不需要每次检查安装,但用户的需求是运行时检查,所以可能需要动态处理。 总结步骤: 1. 使用`pm list packages`检查包是否存在。 2. 如果不存在,调用安装命令。 3. 处理权限和路径问题。 需要注意的地方: - Shell脚本Android环境中的可执行性,可能需要使用`sh`来执行。 - 安装命令的可用性,比如`pm install`需要正确的权限,或者使用`adb install`从外部安装。 - APK文件的路径是否正确,特别是在设备内部脚本中,需要指定APK的绝对路径。 可能的代码结构: ```shell #!/system/bin/sh PACKAGE_NAME="com.example.myapp" APK_PATH="/sdcard/myapp.apk" if pm list packages | grep -q "$PACKAGE_NAME"; then echo "应用已安装" else echo "正在安装应用..." pm install $APK_PATH fi ``` 但需要注意,`pm install`可能需要`-r`参数覆盖安装,或者处理其他选项。此外,如果APK在设备上,可能需要确保路径可访问,并且有读取权限。如果通过adb执行,可能需要使用`adb shell`来运行脚本,或者直接在adb命令中嵌入检查逻辑。 另外,用户可能需要将脚本推送到设备,例如使用`adb push script.sh /data/local/tmp/`,然后执行`adb shell sh /data/local/tmp/script.sh`。这种情况下,要确保设备有执行权限,可能需要`chmod +x script.sh`。 还需要测试在Android 9上`pm install`是否可以直接使用,或者是否需要额外的参数。例如,普通应用安装可能需要用户交互,除非有root权限使用`-i`参数指定安装器,或者使用`--user 0`来指定用户。 可能的问题:非root环境下,`pm install`可能无法静默安装,会启动PackageInstallerActivity,如引用[2]所述,需要用户手动确认。如果用户希望完全自动化,可能需要系统权限或使用辅助工具绕过确认界面,这可能比较复杂,并且取决于具体设备。 因此,在回答中需要区分两种情况:有root权限和无root权限。如果有root权限,可能可以使用`pm install -r -d`等命令静默安装。否则,可能需要用户手动确认,或者通过adb辅助。 总结,用户的解决方案需要结合包检查、安装命令的选择以及权限处理。需要根据用户的实际环境和需求调整脚本。</think>在Android 9上通过Shell脚本检查应用是否安装并自动安装的实现方法如下: ### 实现步骤 1. **获取应用包名** 每个Android应用都有唯一包名(如`com.example.app`),可通过APK文件解析或开发者文档获取。 2. **Shell脚本检查安装状态** 使用`pm list packages`命令检查包名是否存在: ```shell #!/system/bin/sh PACKAGE_NAME="com.example.myapp" if pm list packages | grep -q "$PACKAGE_NAME"; then echo "应用已安装" else echo "未安装,开始安装..." pm install /sdcard/myapp.apk # 替换为实际APK路径 fi ``` 3. **处理安装权限** - **普通环境**:需手动确认安装弹窗(受限于Android安全策略)[^2] - **Root环境**:添加`-i`参数静默安装(需su权限): ```shell su -c "pm install -i com.android.packageinstaller /sdcard/myapp.apk" ``` 4. **ADB环境安装(推荐)** 通过`adb install`命令可直接绕过部分限制: ```shell adb shell " if ! pm list packages | grep -q 'com.example.myapp'; then pm install /sdcard/myapp.apk fi " ``` ### 完整脚本示例 ```shell #!/system/bin/sh APK_PATH="/sdcard/myapp.apk" PACKAGE_NAME="com.example.myapp" # 检查安装状态 if pm list packages | grep -q "$PACKAGE_NAME"; then echo "[STATUS] 应用已存在" else echo "[ACTION] 正在安装..." if pm install -r -t $APK_PATH | grep "Success"; then echo "[RESULT] 安装成功" else echo "[ERROR] 安装失败,请检查APK路径和权限" fi fi ``` ### 注意事项 1. **APK存储路径** 需确保设备有读取权限,推荐使用`/sdcard/`或`/data/local/tmp/` 2. **系统级预装** 若需预装到系统分区,需修改ROM编译配置(参考引用[3]的`PRODUCT_COPY_FILES`方法) 3. **Android 9限制** - 禁止非系统应用直接静默安装(需用户交互)[^2] - 目标API等级需≤28(Android 9对应API 28)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值