android init过程

[轉]Android 啟動流程: Init.c 閱讀筆記

Android kernel 啟動後會執行Init初始化,代碼在 system/core/init 中。


- 創建 /dev、/proc、/sys目錄,創建/dev/pts目錄(偽終端)和/dev/socket,並分別mount
- 創建空設備節點,創建kmsg設備節點,初始化log
- 解析init.rc
- 讀取保存在/proc/cmdline中的kernel啟動參數:
- qemu
- androidboot.console
- androidboot.mode
- factory
- factory2
- androidboot.serialno
- androidboot.baseband
- androidboot.carrier
- androidboot.bootloader
- androidboot.hardware

- 讀取hardware信息,如果cmdline中沒有指出則到/proc/cupinfo中找
- 解析/init.「hardware信息」.rc
- early-init
- 設備初始化,coldboot /sys/class /sys/block/sys/devices,將這些目錄下的uevent文件找出,並使kernel重新生成那些在init的設備管理器開始前的設備添加事件。
- 初始化property,從/default.prop中讀取property。
- 如果ro.debuggable為1,則初始化組合鍵(keychord)監聽
- 打開console,如果cmdline中沒有指定console則打開默認的/dev/console
- 讀取/initlogo.rle,是一張565 rle壓縮的位圖,如果成功則在/dev/fb0顯示Logo,如果失敗則將/dev/tty0設為TEXT模式並打開/dev/tty0,輸出文本的ANDROID字樣。
- 判斷cmdline 中的參數:
- 如果 bootmode為
- factory,設置ro.factorytest值為1
- factory2,設置ro.factorytest值為2
- 其他的設ro.factorytest值為0
- 如果有serialno則設置ro.serialno,否則為""
- 如果有bootmod則設置ro.bootmod,否則為"unknown"
- 如果有baseband則設置ro.baseband,否則為"unknown"
- 如果有carrier則設置ro.carrier,否則為"unknown"
- 如果有bootloader則設置ro.bootloader,否則為"unknown"
- 設置ro.hardware
- 設置ro.version

- 執行所有觸發標識為init的action
-開始property服務,讀取一些property文件,這一動作必須在前面那些ro.foo設置後做,以便/data/local.prop不能干預到他們。
- /system/build.prop
- /system/default.prop
- /data/local.prop
- 在讀取默認的property後讀取presistent propertie,在/data/property中

- 為sigchld handler創建信號機制
- 確認所有初始化工作完成
- device_fd(device init 完成)
- property_set_fd(property server start 完成)
- signal_recv_fd (信號機制建立)

- 執行所有觸發標識為early-boot的action
- 執行所有觸發標識為boot的action
- 基於當前property狀態,執行所有觸發標識為property的action
- 註冊輪詢事件:
- device_fd
- property_set_fd
-signal_recv_fd
-如果有keychord,則註冊keychord_fd

- 如果支持BOOTCHART,則初始化BOOTCHART
- 進入主進程循環:
- 重置輪詢事件的接受狀態,revents為0
- 查詢action隊列
- 重啟需要重啟的進程
- 輪詢註冊的事件
- 如果signal_recv_fd的revents為POLLIN,則得到一個信號,獲取並處理
- 如果device_fd的revents為POLLIN,呼叫handle_device_fd
- 如果property_fd的revents為POLLIN,呼叫handle_property_set_fd
- 如果keychord_fd的revents為POLLIN,呼叫handle_keychord

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值