• MTK(android init.rc) 写一个开机启动的服务


    在开机往往我们想要做一些初始化的操作,这时候可以使用init.rc文件来实现,当然书写一个开机启动的服务也需要规范的。

             假设是C程序,则需要准备C程序的源码,在我的例程中是一个在开机完成(android标志结束后,当然你也可以设置在boot阶段)时进行检测文件存在,没有则创建。代码在package/app/PxTPConfigRead里面。首先将其编译到out目录下的system/bin/下。可以在build/target/product下的base.mk下PRODUCT_PACKAGES+ = px_tp_config。这样编译时则会自动编译。

             在确认system/bin/下生成了执行文件px_tp_config后,书写init.rc,这里建议在device/mediatek/mt67xx/ init.mt67xx.rc中写入。当然system/core/rootdir也是可以的。书写如下:

    service px_tp_config /system/bin/px_tp_config
        user root
        group root
        seclabel u:r:px_tp_config:s0
        class main    
        oneshot

    这里解释下:service后px_tp_config 指的是服务名,而后的路径则是C执行文件在系统中的位置,user root代表使用root用户执行,group root 指的是组在root组,而seclabel与SElinux相关,class main指的是属于main类,当main执行时则会执行该服务,oneshot指的是执行一次,当然如果你的程序是循环的则会一直执行。(这里是服务声明)

             有了声明自然有启动,上面设置的class main,则会自动在mian这个总服务启动时一起启动,当然也可以自己设置,比如:

    on property:sys.boot_completed=1
        write /dev/ttyMT1 "test boot_completed writeing
    "  //在串口打印,测试是否成功加入该服务
        start px_tp_config

    on property:sys.boot_completed=1意思是在开机完全时启动该服务时,执行下面的语句。

    当然你想在boot时或是其他时候执行,则在 on boot下写start px_tp_config。

    写好这些后,全编译一次。

    确认服务执行没有,可在log文件中搜索该服务名字段:

    如果有这些则证明服务已经启动了。

    SElinux 

        当然在运行过程中会遇到问题,AVC问题(未遇到则不添加),则需要添加SElinux权限,或者关闭SElinux。

        在例程中做了一个添加的示范,首先在devicemediatekcommonsepolicyfile_contexts中声明字段或者叫domain,如:/system/bin/px_tp_config u:object_r:px_tp_config_exec:s0。可直接替换成自己的test即可。

        接着添加te规则,命名为: 服务名.te。这里是px_tp_config.te。前面:

    type px_tp_config, domain;
    
    type px_tp_config_exec, exec_type, file_type;
    
    init_daemon_domain(px_tp_config)
    
    domain_trans(init, shell_exec, px_tp_config)

        而后面的allow则需要按照自己的需要一条一条添加,工作比较繁琐,添加依据是:查看打印的log,在log搜索AVC字段,然后找到含有px_tp_config的avc denied。根据规则一步一步添加,规则报错不会一次性报完,只会在添加完当前规则后,报下一条或几条的错误。前面可按照自己的替换为test即可。

        添加了自己的规则,需要再BoardConfig.mk中声明下使其编译时te文件能够被包含进去。

    注:

        1.检查是否编译到了init.rc文件,可在out argetproduct$project oot

    下查看相同名的init.rc中内容是否与你修改的一致。

        2.烧录:若只是修改了init.rc,则只需要烧录boot.img,若修改了C文件则要连syste.img一起烧录。

     在此附上我的demo下载地址,供大家学习参考:https://files.cnblogs.com/files/inkhearts/%E5%BC%80%E6%9C%BA%E5%90%AF%E5%8A%A8C%E4%BB%A3%E7%A0%81.rar

    最后再附上我认为比较有用的链接:

    https://www.cnblogs.com/lxjshuju/p/6915468.html

    https://blog.csdn.net/zhonglunshun/article/details/78615980

    https://blog.csdn.net/qq_28899635/article/details/56289063

    https://blog.csdn.net/feigebangni/article/details/50300063

  • 相关阅读:
    Delphi 与 DirectX 之 DelphiX(28): TDIB.Emboss;
    Delphi 与 DirectX 之 DelphiX(29): TDIB.AddMonoNoise();
    Delphi 与 DirectX 之 DelphiX(33): TDIB.SmoothRotateWrap();
    如何用w.bloggar从桌面发表文章
    可以插入图片了
    在首页可以查看阅读次数了
    .Text的MainFeed.aspx生成RSS的问题
    首页文章显示说明
    欢迎光临博客园
    如果想学习.Net Remoting,请看看MSDN上的一篇文章
  • 原文地址:https://www.cnblogs.com/inkhearts/p/10478981.html
Copyright © 2020-2023  润新知