MTK添加开机启动脚本

因业务需求,需要在MTK 6768开机启动过程中运行一个shell脚本,下面内容是我实现的方法:

 一、源码中添加自己的shell脚本

--- /dev/null
+++ b/alps/device/mediatek/vendor/common/oad08open.sh
@@ -0,0 +1,3 @@
+#!/vendor/bin/sh
+echo "ZZQ Running i2cset command"
+i2cset -y 5 0x1d 0x52 0x07 b

二、脚本编译到系统中

--- a/alps/device/mediatek/vendor/common/device.mk
+++ b/alps/device/mediatek/vendor/common/device.mk
@@ -3503,6 +3503,9 @@ endif
 # Enable modprobe on second stage by shell script
 PRODUCT_COPY_FILES += device/mediatek/vendor/common/init.insmod.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.insmod.sh

+#OAD08 open shell
+PRODUCT_COPY_FILES += device/mediatek/vendor/common/oad08open.sh:$(TARGET_COPY_OUT_VENDOR)/bin/oad08open.sh
+
 # Header libs for libvcodecdrv
 PRODUCT_PACKAGES += libvcodecdrv_header_stub

三、添加SELinux 策略

--- a/alps/device/mediatek/sepolicy/basic/non_plat/file_contexts
+++ b/alps/device/mediatek/sepolicy/basic/non_plat/file_contexts
@@ -778,6 +778,9 @@
 # Purpose: kernel modules
 /vendor/bin/init\.insmod\.sh u:object_r:init_insmod_sh_exec:s0

+#OAD08 open shell
+/vendor/bin/oad08open\.sh u:object_r:oad08open_sh_exec:s0
+
 # GMS requirement
 /vendor/bin/chipinfo u:object_r:chipinfo_exec:s0


--- /dev/null
+++ b/alps/device/mediatek/sepolicy/basic/non_plat/oad08open_sh.te
@@ -0,0 +1,21 @@
+type oad08open_sh, domain;
+type oad08open_sh_exec, exec_type, vendor_file_type, file_type;
+
+init_daemon_domain(oad08open_sh)
+
+allow oad08open_sh vendor_toolbox_exec:file rx_file_perms;
+allow oad08open_sh self:capability sys_module;
+allow oad08open_sh vendor_file:system module_load;
+allow oad08open_sh kernel:key search;
+allow oad08open_sh device:chr_file { read };
+allow oad08open_sh device:chr_file { open };
+allow oad08open_sh device:chr_file { ioctl };
+
+
+# Date : WK20.46
+# Purpose : modprobe need proc_modules
+allow oad08open_sh proc_modules:file r_file_perms;
+
+# Date : WK20.46
+# Purpose : Set the vendor.all.modules.ready property
+set_prop(oad08open_sh, vendor_mtk_device_prop)




/*
allow oad08open_sh device:chr_file { read };
allow oad08open_sh device:chr_file { open };
allow oad08open_sh device:chr_file { ioctl };
/*
这部分根据自己脚本实际内容添加,可以通过启动日志,看缺少啥,添加啥
实例:
[425:logd.auditd]type=1400 audit(1725072881.804:63): avc: denied { ioctl } for comm="i2cset" path="/dev/i2c-5" dev="tmpfs" ino=16402 ioctlcmd=0x703 scontext=u:r:oad08open_sh:s0 tcontext=u:object_r:device:s0 tclass=chr_file permissive=0

进程:oad08open_sh 类型:device 类型类别:chr_file 缺少权限:ioctl 

四、添加启动服务

--- a/alps/device/mediatek/mt6768/init.mt6768.rc
+++ b/alps/device/mediatek/mt6768/init.mt6768.rc
@@ -1060,3 +1060,12 @@ service osi /system/bin/osi
     oneshot
     #seclabel u:r:osi:s0

+on property:dev.bootcomplete=1
+    start oad08open
+
+service oad08open /vendor/bin/oad08open.sh
+    class main
+    user root
+    group root
+    oneshot

补充:

oad08open    指的是服务名,而后的路径则是shell执行文件在系统中的位置

class    指定服务的类名。命名类中的所有服务必须一起启动和停止。如果未通过class选项指定服务,则将其视为“默认”类。

user root    执行此服务前,请更改为用户名。当前默认为root

group root    执行此服务之前,请更改为groupname。除了第一个必需的其他组名外,还用于设置流程的其他组(带有setgroups())。当前默认为root。

oneshot    退出服务时不要重新启动它。当然如果你的程序是循环的则会一直执行

disabled    该服务不会自动从其类开始。必须通过名称显式启动(即 start)。

<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、付费专栏及课程。

余额充值