Android开机自启动C程序调试

Android开机自启动C程序调试
本次记录是关于如何在rk3566的Android11版本下将led时钟显示添加成开机自启动的C程序。
首先,当然是在sdk中会被执行到的.rc文件中将我们所需要执行的C程序添加为服务,可以在init.rc或者/device目录下的.rc文件中。

service led_text /vendor/bin/led_text
class main
user root
oneshot 

前面的一个led_text表示服务的名字,可以自己随意取,后面那个led_text表示你可执行文件的路径,这里我是通过将sdk本地的文件复制到room里面的/vendor/bin/目录下,还有一种方法是直接将可执行文件添加到/system底下,一下两种方法,在之前的调试中,由于一直失败,我就都试过,下面会一一记录。class main表示这个服务会在main服务打开的时候打开,oneshot表示只执行一次,对于这个参数,在后面的时候被我给删掉了,因为我调试的时候发现程序应该是有执行了一次,但是后面就不再执行,所以导致我以为程序没有开机自启动,在后来我将这行删掉之后,程序就正常启动了,但是在之前我第一次成功运行的时候这个参数是没有删掉的,所以我感觉可能是因为没有加载到的原因,可能可以使用touch指令执行一下.rc文件,这个之后待测试。最后,将led_text这个服务在on boot或者on init下面start一下

on boot
start led_text

这样,rc文件就修改完成了。
接下来我要说的是如何将本地文件传到room的目录下呢,在sdk/device文件夹中的device.mk文件中添加如下例子:

PRODUCT_COPY_FILES += $(LOCAL_PATH)/led_text:$/vendor/bin/led_text 

还要讲可执行文件拷到sdk下所指定的目录,最后文件将出现在后面指定的目录中。
当然还有一种方法是添加到/system/bin中的,一样也是在这个device.mk文件中添加

PRODUCT_PACKAGES += led_text

其实在文件中默认是有前面这些宏的,我们只需要在后面添加,或者模仿其他参数的写法,就ok了。
好,这样就完成了将C可执行程序当做服务添加到系统中了。
好,接下来就是比较关键的关于selinux\seAndroid的权限修改问题了,这个我选择的是在/device目录下的/sepolicy目录下进行修改,当然也可以/system目录下的/sepolicy进行修改,这个是总的权限,所以我在device目录下修改。
一般在/sepolicy目录下会有许多的.te文件和一个file_contexts文件,首先我们要先添加一个我们服务的.te文件,也就是led_text.te,然后在file_contexts中将这个.te文件添加进去。

/vendor/bin/led_text		u:object_r:led_text_exec:s0

这个根据情况来添加,前面那个是路劲,我是将可执行文件拷到了/vendor目录下,所以是这个,也有可能是/system/bin,根据你所改的情况而定。当然这个主要是会影响到等等的led_text.te的添加,如果写的不对会导致编译不过。
然后是led_text.te的编写,以led_text为服务名为例:

type led_text, domain;
type led_text_exec, exec_type, vendor_file_type, file_type;
init_daemon_domain(led_text)

前面是这样的,当然这个是我从sdk的资料上参考写的,有一些警告,但是不报错,也不知道是啥原因。对了,还有编译的时候最好要将uboot,kernel,Android一起编,还要将kernel给make clean,不然可能出现改了不成功的现象。
然后接下来就是编译好之后将系统烧入板子,如果运气好,这时候就已经成功了,但是一般来说是还不行,这时候就要进入可执行服务文件所在位置或者直接启动服务

start led_text

这时候就会出现一些权限报错,类似于avc: denied开头的这种的,我就暂且从我看的文档中复制一个例子过来,其实改还是挺简单的,主要是记得在allow命令后面加分号,因为不了解这个语法,编译不过也弄了好久,之后吸取经验,在不懂脚本及其编译规则语法时,要多观察其它的类似的脚本,并进行模仿。好,接下来就是一个.te修改的例子:

auditd ( 627): avc: denied { write } for pid=15848 comm=“system_server” name=“enable” dev=“sysfs” ino=9381 scontext=u:r:zygote:s0
· tcontext=u:object_r:sysfs:s0 tclass=file permissive=1

缺少什么权限: 缺少 write 权限
·
谁缺少权限: scontext=u:r:zygote:s0
·
对哪个文件缺少权限: tcontext=u:object_r:sysfs:s0
·
什么类型的文件: tclass=file
·
最后输入的命令:

allow zygote sysfs:file write;

接下来总结一下,关于如何开机添加一个自启动C程序:
1.将编译好的C程序当做服务添加进系统,修改.rc文件
2.将可执行文件复制到room,或者添加到system下
3.修改selinux\seAndroid权限,在/device或者/system目录下的/sepolicy目录中,添加.te文件,并修改 file_contexts文件。

补充:
1.注意/sepolicy目录,对于system和vendor下的权限是有区分为不同的文件夹,如果将 vendor 下的.te文件放到system下,系统可能无法编入。

2.还有一种方式,在init.rc中直接指定权限.te文件,例如

service watchdogd /sbin/watchdogd 10 20
    class core
    disabled
	seclabel u:r:watchdogd:s0

表示该服务使用的是watchdogd.te权限,如果将节点写入sys中,需要的权限将更多,可以尝试直接指定,然后使用init.te,init.te中的权限一般都比较高。

你可能感兴趣的:(Android底层开发,android,linux)