日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

分析脚本文件AndroidInitProcess分析心得(1)

發布時間:2024/4/11 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分析脚本文件AndroidInitProcess分析心得(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 ]\n", 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_actionparse_service的實作.分析流程先到此, 以后再來看parse_actionparse_service的實作.

??????? 以上是作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)\n", 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\n", 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); }

????到此我們只知道這兩個數函只是從action list把actioncommand node的據數取出來, 至于這個command node所帶的function還是不知道怎么來的?

??????? 只好在往分析流程去找蛛絲馬跡了. 在分析流程中直一執行到利用parse_config數函來做析解init.rc的動作時, 有發明在呼叫parse_new_section之前會須要先執行lookup_keyword數函去獲得一個keyword作當參數. 就來從這數函開始分析

文章結束給大家分享下程序員的一些笑話語錄: 很多所謂的牛人也不過如此,離開了你,微軟還是微軟,Google還是Google,蘋果還是蘋果,暴雪還是暴雪,而這些牛人離開了公司,自己什么都不是。

總結

以上是生活随笔為你收集整理的分析脚本文件AndroidInitProcess分析心得(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。