当前位置: 首页 > 工具软件 > Object Shell > 使用案例 >

Android 开机启动shell脚本

左丘善
2023-12-01

接到一个集成功能的需求,然后看了一下是由上层应用 + linux进程实现的功能,需要增加开机自动启动linux进程,没弄过有点懵。

这个不怎么正确,仅供参考,在权限那块需要更改,放到system下

环境

  1. android 9.0
  2. mtk 平台

实现思路

因为集成的功能只是demo状态,对应的功能提供公司只提供的是三个apk,5个动态库(*.so),一个linux可执行程序和一个可执行程序的配置文件。

在linux可执行程序执行之前,这个功能还需要设置一个环境变量,尝试了几种方式,改变文件放置位置、权限,但是最终还是失败告终。有点沮丧了,重新分析一次,决定要用shell实现设置环境变量,接着执行linux可执行程序,最终是这种方式实现了。

实现

1. 编写shell

通过shell脚本实现设置环境变量,再启动目标linux进程
shell文件/system/bin/acr/startacr.sh

#!/system/bin/sh
#因为这个linux可执行程序需要在可写目录执行,需要在对应目录写入记录文件,所以这里切换到可写的data目录
cd /data/
#因为需要,先设置环境变量
export LD_LIBRARY_PATH=/mnt/vendor/linux_rootfs/lib:/system/bin/acr
#执行linux程序
/system/bin/acr/alacr
2. 配置开机启动shell脚本

需要修改init.rc文件(所在目录:system\core\rootdir,有些平台在device/projectName/也可以),实现开机启动shell脚本,具体的init.rc语法可以看深入分析AIL语言及init.rc文件

直接在init.rc文件后面加入就好。
因为我这个linux进程需要在root权限执行,所以user、group设置了root,如果不设置是当前用户,并不是root用户
注意:在网上看到有人说名字不应超过16个字符,没试过。如果还是启动不了,尝试将service后面的进程名字应该跟脚本的名字一致

service startacr /system/bin/acr/startacr.sh
	user root 
	group root
    class main
    oneshot

class main 就实现开机执行了,并不需要在on property:sys.boot_completed=1 后面添加start startacr

3. 增加需要的权限

在shell 脚本启动的前,还需要设置selinux的权限
1) 在 下面增加一个.te文件,文件名字需要与执行的shell脚本一致,这里增加startacr.te文件
permissive startacr 在调试阶段需要这一句,这样权限就可以获得豁免,并且在logcat中可以打印出需要的权限

#####################
# startacr sh selinux
#
#####################
type startacr, domain,coredomain;
type startacr_exec, exec_type, file_type;
init_daemon_domain(startacr)
permissive  startacr
 

2) 修改文件device/projectName/seplolicy/file_contexts,增加可执行权限。
在编译进去之后,可以通过在 /system/bin/acr/目录,执行ls -Z filePath,可以看到文件增加了可执行权限。

/system/bin/acr/startacr.sh    u:object_r:startacr_exec:s0

3)在te文件中增加权限,在logcat中找到

avc: denied { search } for pid=11710 comm="startacr.sh" name="sh" dev="mmcblk0p21" ino=502 scontext=u:r:startacr:s0 tcontext=u:object_r:shell_exec:s0 tclass=file permissive=1

根据规则allow scontext tcontext : tclass permission在startacr.te后面增加对应的权限。

allow startacr shell_exec:file { search };

permissive=1 这是权限已经获得,这里只是打印,不存在权限问题了,但是后面正式版本的时候,应该加上对应缺少的权限,去掉permissive startacr。

4 编译不通过

编译不通过,可能是使用了一些noallow的权限,那也是因为在te文件中给可执行程序的权限不够,例如增加coredomain,然后就不会提示一些权限的noallow。这一类问题应该不要在百度搜索,找不到。

总结

在处理这个问题的过程中,因为没有配过这些,还是遇到很多问题,并且一开始尝试的方式都不多,还是花了很长时间,有人可以请教一下就是最好的,少走弯路,就像需要配置te文件,我一开始只是以为只需要增加可执行权限就可以了,但是在init.rc中配置了权限,但是有问题。

文件在system/bin目录下面,直接使用PRODUCT_COPY_FILES实现文件复制。

 类似资料: