init
init是Linux系统中用户空间的第一个进程。也是Android中第一个被启动得进程。
内核启动过程: start_kernel()-> init_post()-> run_init_process() ->启动init.
init的pid为0,它通过解析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文件
其实这些选项都是可以搜索得到,所以我这里也没有写全,就写几个常用的。