失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Android 开机启动shell脚本

Android 开机启动shell脚本

时间:2023-04-12 01:19:00

相关推荐

Android 开机启动shell脚本

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

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

环境

android 9.0mtk 平台

实现思路

因为集成的功能只是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.shuser root group rootclass mainoneshot

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实现文件复制。

如果觉得《Android 开机启动shell脚本》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。