赞
踩
接到一个集成功能的需求,然后看了一下是由上层应用 + linux进程实现的功能,需要增加开机自动启动linux进程,没弄过有点懵。
这个不怎么正确,仅供参考,在权限那块需要更改,放到system下
因为集成的功能只是demo状态,对应的功能提供公司只提供的是三个apk,5个动态库(*.so),一个linux可执行程序和一个可执行程序的配置文件。
在linux可执行程序执行之前,这个功能还需要设置一个环境变量,尝试了几种方式,改变文件放置位置、权限,但是最终还是失败告终。有点沮丧了,重新分析一次,决定要用shell实现设置环境变量,接着执行linux可执行程序,最终是这种方式实现了。
通过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
需要修改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
在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。
编译不通过,可能是使用了一些noallow的权限,那也是因为在te文件中给可执行程序的权限不够,例如增加coredomain,然后就不会提示一些权限的noallow。这一类问题应该不要在百度搜索,找不到。
在处理这个问题的过程中,因为没有配过这些,还是遇到很多问题,并且一开始尝试的方式都不多,还是花了很长时间,有人可以请教一下就是最好的,少走弯路,就像需要配置te文件,我一开始只是以为只需要增加可执行权限就可以了,但是在init.rc中配置了权限,但是有问题。
文件在system/bin目录下面,直接使用PRODUCT_COPY_FILES实现文件复制。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。