在工作中有一个需求是android手机开机启动一个C可执行文件,起初尝试是将在android源码里面写一个bash脚本,然后在脚本里面执行/data目录下的可执行文件,然后将系统烧写进手机,开机后将可执行文件放入手机/data目录里面,然后重启,最终的结果是没有成功。
需求一直在这里,后来将尝试别的方法,对于文件的放置可以在源码里面将可执行文件在烧写系统的时候直接烧写进手机里面,还有就是bash脚本问题,在手机源码里面找到一个现成的脚本,然后将自己的执行命令添加到该脚本的后面,最终成功了。
下面就是该实现的全过程,系统是Android6.0 硬件是MTK6735
一、需求分析:
手机每次开机自动执行可执行文件
二、问题汇总
1、脚本里面不能打开spidev,通过在手机里面执行logcat | grep avc可以发现spidev0.1没有read write权限。
2、Socket没有连接权限,socket的服务器是在一个APP里面,客户端是在可执行文件里面,通过Android studio发现该不可信app没有connect权限。
avc:denied{connectto } for scontext=u:r:enableswap:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=unix_stream_socket permissive=0
三、解决方法
首先将可执行文件放到系统源码的/alps/device/mediatek/mt6735目录下面,并修改其权限,然后进入/alps/device/mediatek/mt6735/device.mk文件,将该可执行文件放到手机的/system/bin目录下面,shell脚本只能执行手机源码/system/bin目录下的文件。
然后在shell脚本里面执行该可执行文件/alps/device/mediatek/mt6735/enableswap.sh
因为可执行文件里面会打开spidev0.1,此时问题也就出现了。
由于Android4.x以上的系统都有SEliunx安全保护机制,app对于设备的操作以及资源的访问都有可能没有对应的权限,应对方法便是缺少什么权限就条件什么权限,有一个修改权限的万能公式:allow scontext tcontext:tclass {缺少的权限}
对于第一个问题
1、在alps/device/mediatet/mt6735/init.mt6735.rc修改spidev0.1的权限和所有者,以及enable swap的所有者。
2、打开文件.../alps/external/sepolicy/file_contexts
3、打开文件.../alps/external/sepolicy/device.te
4、打开文件.../.../external/sepolicy/init.te,万能公式allow scontext tcontext:tclass {权限}
此时在手机里面执行logcat | grep avc,则不会报打开spidev设备没有权限问题。
对于第二个问题,和第一问题类似都是缺少权限
修改app以及程序对设备以及资源的访问权限的文件都是.te后缀的文件,而.te的文件存在系统源码的两个地方,/alps/device/mediatek/common/sepolicy/和/alps/external/sepolicy/下面。
因为我们是在enablswap.sh脚本里面执行的文件,所以我们已经在enableswap.te文件里面添加APP的connect权限,在/alps/device/mediatek/common/sepolicy/下面正好有enableswap.te文件,我们只需套用万能公式,允许untrusted_app的connect权限。
打开文件/alps/device/mediatek/common/sepolicy/enableswap.te