Android启动init.rc与Android.mk简单介绍

本文简要介绍了Android系统启动过程中的init.rc脚本和Android.mk编译文件。init.rc负责构建系统的初始运行形态,通过定义动作、命令、服务和选项来启动系统服务。而Android.mk是模块构建配置文件,定义了模块名、源文件、依赖库等,用于编译生成相应的可执行或库文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

init

 initLinux系统中用户空间的第一个进程。也是Android中第一个被启动得进程。

内核启动过程: start_kernel()-> init_post()-> run_init_process() ->启动init.

 initpid0,它通过解析init.rc脚本构建出系统的初始运行形态,很多其他的系统服务是在这个init.rc脚本中描述并启动。

 关于init.rc的语法注释在源码目录有个官方文档,/system/core/init/Readme.txt

下面简要介绍下:

init语法包括四类,

1、动作(Action)

2、命令(Commands)

3、服务(Services)

4、选项(Options)

 

注意:

a、注释以“#”开头

b、空格分隔,语句以行为单位

c、“\”也可以用来添加空格

d、双引号可以防止空格分割成多个部分

e、在行尾“\”表示下一行与本行是同一行

 1动作(Action)

格式:

on  <trigger>   #触发条件

    <command>  #命令

    <command>  #

<command>

 2 命令(Commands)

 3 服务(Services)

格式:

service <name> <pathname> [ <argument> ]*

   <option>

   <option>

   ...

 4 选项(Options)

用来修饰服务的,影响服务何时以及如何初始化。

 critical 

这是系统关键服务,如果四分钟超过四次退出,则重启并进入恢复模式。

 

disabled

服务不会自动启动,必须通过名称显式调用。

 

setenv <name> <value>

设置环境变量 <name>为某个值<value>

 

socket <name> <type> <perm> [ <user> [ <group> ] ]

创建一个名称为/dev/socket/<name>unix domain socket named并将fd传给启动它的进程。

<type> must be "dgram", "stream" or "seqpacket".User and group default to 0.

 

user <username>

在启动这个服务之前切换用户名(默认情况下是root

 

group <groupname> [ <groupname> ]*

在启动这个服务之前切换用户组,默认为root

 

seclabel <securitycontext>

运行服务之前改变为securitycontext,如果没有指定则默认init context

oneshot

服务退出时候不需要去重启
class <name>

指定一个class名,同个class下的服务同时开始停止,默认的class为“default

onrestart

当服务重启的时候会运行命令

 

Android.mk

 LOCAL_PATH 

用于确定源码所在的目录,最常见的是 “$(call my-dir)”。宏函数‘my-dir,  由编译系统提供, 用于返回当前路径,最好放在CLEAR_VARS前面,不会被清除。

 CLEAR_VARS

#include $CLEAR_VARS) 清空很多以LOCAL开头的变量。这是必要的,因为所有的编译文件都在同一个 GNU MAKE 执行环境中,所有的变量都是全局的。所以我们需要先清空这些变量(LOCAL_PATH除外)

 

LOCAL_MODULE 

模块名,必须定义

名称必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀

一个被命名为'foo'的共享库模块,将会生成'libfoo.so'文件。

注意:如果把库命名为‘libhelloworld’,编译系统将不会添加任何的 lib 前缀,也会生成 libhelloworld.so


LOCAL_MODULE_PATH

模块输出路径


 LOCAL_SRC_FILES

模块编译过程所涉及的源文件。

注意,默认的 C++源码文件的扩展名是‘.cpp’ 。指定一个不同的扩展名也是可能的,只要定义LOCAL_DEFAULT_CPP_EXTENSION 变量,不要忘记开始的小圆点(也就是定义为  ‘.cxx,而不是‘cxx)


LOCAL_STATIC_LIBRARIES

静态库

 

LOCAL_SHARED_LIBRARIES

编译所需要的共享库列表

 

LOCAL_JAVA_LIBRARIES

JAVA类库

 

LOCAL_LDLIBS

链接库

 

include $BUILD_EXECUTABLE

 

BUILD_SHARED_LIBRARY 是编译系统提供的变量,指向一个 GNU Makefile 脚本(应该

就是在 build/core  目录下的 shared_library.mk) ,将根据LOCAL_XXX系列变量中的值,来编译生成共享库(动态链接库)。

 

BUIDL_ECECUTABLE

编译为可执行文件

 

BUILD_JAVA_LIBRARY

java库,即是那种jar文件

 

其实这些选项都是可以搜索得到,所以我这里也没有写全,就写几个常用的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值