一口Linux

电子技术应用专栏作家——一口Linux。一起学习嵌入式、Linux、网络、驱动、arm知识

安卓如何设置开机自动启动某个程序?ramdisk + init.rc给你搞定

0
阅读(1757)

一、如何设置开机启动某个程序?

1.需求描述

最近有个项目需要在Android开机启动之后,自动执行一个C语言编写的程序:pengd

该程序运行时需要修改网络ip地址及其他网络操作,所以需要root权限

根据需求描述,我们需要做一下操作:

  1. pengd 预置到Android中的某个路径下,比如放在 /sbin/pengd ;

  2. 然后修改init.rc文件,实现开机后自动运行我们的程序pengd

  3. 本次项目用到的安卓设备的init.rc和sbin下的文件重启后会恢复默认,主要是安卓部分目录是基于ramdisk,因此我们需要重新制作ramdisk.img,将前面2个步骤的操作同步到到ramdisk.img,然后再重新烧录设备对应分区

2.移植步骤

image.png

注意rc文件最后一定要有空行,否则编译报错!

init.rc语法见第二章 该配置文件并不是唯一写法,具体要参考实际厂家提供的sdk中的ramdisk

image.png

3. 运行测试

采用厂家提供的烧录工具烧录ramdisk即可,不在截图。

可以adb shell登录安卓设备,用以下命令查看进程是否生效:

ps -ef | grep pengd

二、init.rc详解

0、 什么是init.rc?

1)init.rc基础概念

Adnroid系统就像是是运行在linux系统上的一个“服务进程”,并不算是一个完整的操作系统。

这些服务进程是维持设备正常运转的关键,而这些进程的鼻祖就是init进程。

进程ID为1,源代码位于system/core/init 目录。

作为Android系统的第一个进程,Init进程承担这很多重要的初始化任务,一般Init进程的初始化可以分为两部分,前半部分挂载文件系统,初始化属性系统和Klog, selinux的初始化等,后半部分重要通过解析init.rc来初始化系统daemon服务进程,然后以epoll的监控属性文件,系统信号等。

init.rc则是init进程启动的配置脚本,这个脚本是用一种叫Android Init Language(Android初始化语言)的语言写的。

2) init.rc语法

init.rc语法官方文档路径:system/core/init/Readme.txt

下图是瑞芯微sdk的改文件路径:

image.png

一个完整的init.rc脚本由4种类型的声明组成:

  1. Action(动作)

  2. Commands(命令)

  3. Services(服务)

  4. Options(选项)

    image.png

3)语法规则:

  • 注释以 # 开头

  • 关键字和参数以空格分隔,每个语句以行为单位

  • C语言风格的 \ 转义字符可以用来为参数添加风格

  • 字符串使用 “ ”

  • 行尾的 \ 用来表示和下面一行是同一行

  • Actions(动作)和Services(服务)就是一个新语句的开始,这个两个后面跟着Commands(命令)或Options(选项)都属于这个新语句

  • Actions(动作)和Services(服务)有唯一的名字,如果出现重名就会被当成错误忽略掉

1、Actions(动作)

一个动作其实就是响应某个事件的过程。

如下图所示:当early-init这个触发条件产生时,依次执行下面的命令1、命令2、命令3、命令4

image.png

【改文件位于system/core/rootdir/init.rc 】

源码实现思想:

当相应的事件发生后,系统就会对init.rc中的各个触发条件进行匹配,只要匹配成功就会把这个动作加到“命令执行队列的尾部”,等待执行。如果已经存在是不会再次添加的。

2、Commands(命令)

命令会在条件触发后一条一条的执行。

image.png

image.png

3、Services(服务)

Services其实是可执行程序,他们在特定选项的约束下会被init程序运行或者重启。

一般格式:

image.png

4、Option选项

Option用来定义Service的行为,决定了Service将在何时启动,如何运行等。常用的Option有包括以下一些。

image.pngimage.png

原文链接:https://mp.weixin.qq.com/s/61MUjG1d0ZAVXAsGvOIzsg


微信图片_20220701092006.jpg

电子技术应用专栏作家  一口Linux