Android 新增可执行脚本方式总结

Shell脚本

怎么添加可执行脚本,小白如何开始,首先就是参考google 的,看看他们是怎么做的

device/google/sunfish/init.sensors.sh

#! /vendor/bin/sh

version=`grep -ao "OEM_IMAGE_VERSION_STRING[ -~]*" \
              /vendor/firmware/adsp.b04 | \
         sed -e s/OEM_IMAGE_VERSION_STRING=ADSP.version.// -e s/\(.*\).//`
setprop vendor.sys.adsp.firmware.version "$version"

可以看到这是一个标准的shell 语句,android是基于linux操作系统,linux支持shell脚本,所以安卓也是支持的一些shell命令的运行,如果有特殊功能需要在shell 里面执行的话,可以学习shell 知识,看看是否能实现,这个不再赘述.

上面知识脚本文件,那么他是如何运行的呢,我们根据init.sensors.sh 这个关键字继续在源码中查找

定义shell 脚本

device/google/coral/init.hardware.rc

service init-sensors-sh /vendor/bin/init.sensors.sh
    class main  #服务类型
    user root
    group root system
    disabled   #默认是不启动,由其他动作触发才会启动
    oneshot   #只执行一次

 # Init sensor specific services
    start init-sensors-sh  #启动服务

上面是服务启动的一种方式,还有其他方式,rc 文件都有,就不一一举例了

方式一:

 start init-sensors-sh  #启动服务

方式二:

exec u:r:vendor_qti_init_shell:s0 -- /vendor/bin/init.qti.can.sh #系统标签可以不加,可以在context 中定义

方式三:

property_set("ctl.start", service_xx);//C++

SystemProperties.java.set("ctl.start", service_xx);//java

方式四:

class_start main #启动所有class 为main 的所有服务,diaabled 不能被启动,只能通过以上三种方式启动,也可以先enable  class_servcexx,然后通过class_start 启动

方式五:

通过组合按键启动,下面的是通过音量+,-,电源键,启动服务

# bugreport is triggered by holding down volume down, volume up and power

service bugreport /system/bin/dumpstate -d -p -z

class main

disabled

oneshot

keycodes 114 115 116

这里面有涉及到可执行脚本的selinux 配置,可以参考android 开机动画动态替换_xss534890437的博客-优快云博客_安卓开机动画替换

rc 文件和sh 脚本文件一些读写文件区别

其实rc 文件和脚本语法完全不一样,都是区别......不过我整理了一些我工作常用的,都是抄google 原生的,记录分享一下,以免大家搞混了.

system/core/init/README.md  rc 的语法都在这里哦

rc文件sh 脚本文件
setprop xxxx ${yyyy}#去yyyy这个宏值,或者对应propery 值bootanimtionp=`getprop vendor.animation.file.path`#取值同样是${bootanimtionp}
on property:xxxx.xxxx=1#监听属性值变化setprop qemu.hw.mainkeys 0#也可以取其他值同上${xxx}
copy 原始路径 目标路径  #复制文件cp -rf $bootanimtionp  /mnt/vendor/bootanim/  #复制文件
write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno}#写节点echo "$nv_sn" > /config/usb_gadget/g1/strings/0x409/serialnumber #读取宏变量,写节点

上面都是我工作中用到的,其实还有很多类似的功能,后续用到会补充上去哈,我的经验是如果有需要的功能,可以优先到原生的里面去找,抄google 的作业,实在没有那就只能百度学习啦

ps:读写节点和属性值,启动脚本的时候,有时候语法都是对的,但是莫名其妙读写不成功,这个时候可以怀疑是不是selinux 问题哦,我也总结了一小点.

Android selinux 入门学习_xss534890437的博客-优快云博客_android selinux自学

rc 和sh 可以说相当于一门独立的小语言知识点了,我也是边学习根据实际经验更新,后续学习后会持续更新.....

<think>好的,用户想了解如何在Android中添加启动脚本。首先,我需要回忆一下相关的知识,并结合提供的引用内容来组织答案。 首先,根据引用[3]和[4],Android 8.1和8.0系统中,添加启动脚本涉及到init.rc配置、sepolicy权限以及脚本文件的放置位置。可能需要考虑不同Android版本的差异,比如MTK板子的情况可能需要特别的处理。 用户的问题分为配置启动脚本和应用中添加,可能需要分两种情况:系统级和服务/应用级。系统级的启动脚本通常在init.rc中配置,但有时候会遇到权限问题,这时候需要修改sepolicy,比如添加.te文件和file_contexts,如引用[3]所述。此外,引用[4]提到在domain.te中添加启动代码,这也是解决权限问题的一部分。 另外,引用[1]和[2]虽然主要关于Gradle和清单文件,但可能不直接相关,不过需要注意用户是否有混淆的可能。但用户的问题明确是关于启动脚本,所以应集中在init和sepolicy方面。 需要分步骤说明:创建脚本文件、配置init.rc、处理sepolicy权限、编译和烧写镜像。同时,可能提到常见问题,比如脚本不执行的原因,如权限不足或sepolicy限制,需要如何解决。 可能还需要提到Android不同版本的处理差异,比如在Android 8.0之后对sepolicy的严格要求,需要将自定义的te文件放在vendor目录下,如引用[3]中的system/sepolicy/vendor/路径。 最后,生成相关问题时要围绕启动脚本的调试、sepolicy配置、不同版本差异等。</think>在 Android 系统中添加启动脚本需要根据系统版本和需求选择不同的实现方式,以下是两种典型场景的配置方法: --- ### 一、系统级启动脚本(需 root 权限或定制系统) #### 1. **创建脚本文件** 编写脚本文件 `init.custom.rc`,例如实现开机自动挂载目录: ```sh # 示例脚本:/vendor/etc/init/init.custom.rc on boot exec u:r:vendor_init:s0 -- /system/bin/sh /vendor/etc/scripts/mount_data.sh ``` #### 2. **配置 init.rc 触发** 在系统 `init.rc` 文件中添加导入语句: ```sh # 位于 system/core/rootdir/init.rc import /vendor/etc/init/init.custom.rc ``` #### 3. **处理 SELinux 权限** - 在 `system/sepolicy/vendor/` 下新增 `.te` 文件(如 `vendor_init.te`): ```sh allow vendor_init shell_exec:file { execute }; ``` - 配置 `file_contexts` 添加标签: ```sh /vendor/etc/scripts/mount_data.sh u:object_r:vendor_init_exec:s0 ``` #### 4. **编译与烧写** 通过编译系统生成 `vendor.img` 并烧录到设备[^3][^4]。 --- ### 二、应用/服务级启动脚本(无需 root) #### 1. **通过 Android 服务调用** 在 `AndroidManifest.xml` 声明后台服务权限: ```xml <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> ``` #### 2. **编写 Shell 脚本执行器** 通过 `Runtime.getRuntime().exec()` 执行脚本: ```java public class BootService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { try { Process process = Runtime.getRuntime().exec("sh /data/local/tmp/start_script.sh"); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); // 处理输出日志 } catch (IOException e) { e.printStackTrace(); } return START_STICKY; } } ``` --- ### 三、常见问题解决 1. **脚本未执行** - 检查文件权限:`chmod 755 /path/to/script.sh` - 确认 SELinux 策略是否放行,可通过 `dmesg | grep avc` 查看拒绝日志[^4] 2. **Android 高版本限制** Android 8.0 后需将自定义 SELinux 规则置于 `vendor` 分区策略中[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值