分析シナリオファイルAndroid InitProcess分析心得(1)
,Android Init process Android . Android Init process Linux Kernel . device , Bootloader Kernel, Kernel Android Init process. Linux , :
kernel_init===> init_post ==> run_init_process ==> Android Init process.
AndroidInit process , kernel_init, init_post,run_init_process .
Android Init process .
1. init.rc
2. devicenode file
3.
.
init.rc
init.rc Android , . action list service list. ,
1. "on" actionlist ,
2. "Services" servicelist .
init.rc AIL(Android Init Language) .AIL , Action, Commands, Services, Option. system\core\init\readme.txt . , system\core\init\readme.txt.
Action Services Section, Section Command Option .Command .Option ServicesSection . .
init.rc init_parse_config_file . init.rc .
// \system\core\init\init_parser.c
int init_parse_config_file(const char *fn)
{
char *data;
data = read_file(fn, 0);
if (!data) return -1;
parse_config(fn, data);
DUMP();
return 0;
}
static void parse_config(const char *fn, char *s)
{
struct parse_state state;
// ...
state.filename = fn;
state.line = 0;
state.ptr = s;
state.nexttoken = 0;
state.parse_line = parse_line_no_op;
// ...
for (;;) {
switch (next_token(&state)) {
case T_EOF:
state.parse_line(&state, 0, 0);
goto parser_done;
case T_NEWLINE:
state.line++;
if (nargs) {
int kw = lookup_keyword(args[0]);
if (kw_is(kw, SECTION)) {
state.parse_line(&state, 0, 0);
parse_new_section(&state, kw, nargs, args);
} else {
state.parse_line(&state, nargs, args);
}
nargs = 0;
}
break;
case T_TEXT:
if (nargs < INIT_PARSER_MAXARGS) {
args[nargs++] = state.text;
}
break;
}
}
}
void parse_new_section(struct parse_state *state, int kw,
int nargs, char **args)
{
printf("[ %s %s ]
", args[0],
nargs > 1 ? args[1] : "");
switch(kw) {
case K_service:
state->context = parse_service(state, nargs, args);
if (state->context) {
state->parse_line = parse_line_service;
return;
}
break;
case K_on:
state->context = parse_action(state, nargs, args);
if (state->context) {
state->parse_line = parse_line_action;
return;
}
break;
case K_import:
parse_import(state, nargs, args);
break;
}
state->parse_line = parse_line_no_op;
}
じ
は にとって、そびえ つ だが、 は にすぎず、 から を しているが、 を くことはできない. の で くの のパスワードは、 で する があります. の の で、 も しい を るには、 に する と の 、 と の の を します.
のプログラムコードからはっきり えるのはinitだけです.rcスクリプトファイルのsectionのcommandとoptionの はactionlistとservice listを えて する. したアクションはparse_を できます.アクションとparse_サービスの の れはここまでで、 でparse_を に ます.アクションとparse_サービスの
はinitです.rcスクリプトファイルの プロセス、init.rcスクリプトファイルの プロセスはexecute_one_commandは を えて する.// \system\core\init\init.c
void execute_one_command(void)
{
int ret;
if (!cur_action || !cur_command || is_last_command(cur_action, cur_command)) {
cur_action = action_remove_queue_head();
cur_command = NULL;
if (!cur_action)
return;
INFO("processing action %p (%s)
", cur_action, cur_action->name);
cur_command = get_first_command(cur_action);
} else {
cur_command = get_next_command(cur_action, cur_command);
}
if (!cur_command)
return;
ret = cur_command->func(cur_command->nargs, cur_command->args);
INFO("command '%s' r=%d
", cur_command->args[0], ret);
}
この は にcurを して されます.commandが つfunctionはactionlistのcommandを する.このcur_commandが っているfunctionは から までですか? のコール get_first_commandとget_next_commandが く// \system\core\init\init.c
static struct command *get_first_command(struct action *act)
{
struct listnode *node;
node = list_head(&act->commands);
if (!node || list_empty(&act->commands))
return NULL;
return node_to_item(node, struct command, clist);
}
static struct command *get_next_command(struct action *act, struct command *cmd)
{
struct listnode *node;
node = cmd->clist.next;
if (!node)
return NULL;
if (node == &act->commands)
return NULL;
return node_to_item(node, struct command, clist);
}
ここで たちはこの2つの の がaction listからactioncommand nodeのデータを り しただけであることを っていますが、このcommand nodeが っているfunctionについてはどうやって たのか かりません.
の れにクモの を すしかない. プロセスでparseを するまで します. のための ですrcの に、parse_を び す があるnew_sectionの にlookupを する があります.keyword はkeywordをパラメータとして する.この の から を めます
は わってみんなに のプログラマーのいくつかのジョークの を かち います: くのいわゆる もただこのようにして、あなたを れて、マイクロソフトはまだマイクロソフトで、GoogleはまだGoogleで、アップルはやはりアップルで、 はやはり で、これらの は を れて、 は もありません.