一、概述:
在Android项目开发中,有时候需要在init.rc中执行一些脚本命令,但是init.rc文件支持的shell命令并不完整 ,有一种方案,可以在init.rc文件中创建服务,开机则启动脚本实现相应的需求。
本文介绍了如何在展锐平台Android 13设备上通过init.rc配置开机后执行shell脚本来创建目录、复制文件和修改文件的权限。主要步骤包括创建执行脚本,将脚本copy到system/bin目录下,在init.rc文件中创建服务,让系统启动完成后执行脚本,并调整SELinux权限以确保脚本能够顺利执行。
二、创建脚本并将myshell.sh复制到/system/bin
1、创建脚本
在device/sprd/sharkl5/ums312_2h10/product/ums312_2h10_Natvc目录下创建脚本myshell.sh
#!/bin/sh
mkdir /mnt/myfile //创建文件myfile
chmod -R 777 /mnt/myfile //修改文件的权限
cp -r /data/data /mnt/myfile //复制文件
2、复制脚本到/system/bin
在device/sprd/sharkl5/ums312_2h10/product/ums312_2h10_Natv/var.mk添加如下内容
RODUCT_COPY_FILES +=device/sprd/sharkl5/ums312_2h10/product/ums312_2h10_Natvc/myshell.sh:system/bin/myshell.sh
三、init.rc中创建执行脚本的服务
service myshell /system/bin/myshell.sh
user root
group root
disabled
seclabel u:r:shell:s0
oneshot
on property:sys.boot_completed=1
start myshell
四、打开selinux
在system/core/init/selinux.cpp文件中修改selinux的权限,这一点很关键,否则开机后脚本不会执行
bool IsEnforcing() {
{
+ return false; //add
int fd(open("/mboot/selinux", O_RDONLY | O_CLOEXEC | O_BINARY));
if (fd != -1) {
char v = 0xff;
if (read(fd, &v, 1) < 0)
PLOG(ERROR) << "Failed to read /mboot/selinux";
close(fd);
LOG(WARNING) << "/mboot/selinux is " << v;
return v == '1';
}
}
if (ALLOW_PERMISSIVE_SELINUX) {
return StatusFromProperty() == SELINUX_ENFORCING;
}
return true;
}
以上就是Anddroid13 创建脚本,在init.rc中添加shell脚本执行服务,实现开机自启动的完整流程