1. 程式人生 > >Android系統啟動過程

Android系統啟動過程

android 框架的示意圖:


Linux核心啟動之後就到Android Init程序,進而啟動Android相關的服務和應用

啟動的過程如下圖所示:

image

一 Init程序的啟動

  init程序,它是一個由核心啟動的使用者級程序。核心自行啟動(已經被載入記憶體,開始執行,

並已初始化所有的裝置驅動程式和資料結構等)之後,就通過啟動一個使用者級程式init的方式,完成引導程序。init始終是第一個程序。

  啟動過程就是程式碼init.c中main函式執行過程:system\core\init\init.c

在函式中執行了:資料夾建立,掛載,rc檔案解析,屬性設定,啟動服務,執行動作,socket監聽……

下面看兩個重要的過程:rc檔案解析和服務啟動。

1 rc檔案解析

  .rc檔案是Android使用的初始化指令碼檔案 (System/Core/Init/readme.txt中有描述:

four broad classes of statements which are ActionsCommandsServices, and Options.)

  其中Command 就是系統支援的一系列命令,如:export,hostname,mkdir,mount,等等,其中一部分是 linux 命令,

還有一些是 android 新增的,如:class_start <serviceclass>: 啟動服務,class_stop <serviceclass>:關閉服務,等等。

  其中Options是針對 Service 的選項的。

系統初始化要觸發的動作和要啟動的服務及其各自屬性都在rc指令碼檔案中定義。 具體看一下啟動指令碼:\system\core\rootdir\init.rc

       在解析rc指令碼檔案時,將相應的型別放入各自的List中:

  \system\core\init\Init_parser.c  :init_parse_config_file( )存入到

  action_queue、   action_list、 service_list中,解析過程可以看一下parse_config函式,類似狀態機形式挺有意思。

  這其中包含了服務:adbd、servicemanager、vold、ril-daemon、debuggerd、surfaceflinger、zygote、media……

2 服務啟動

       檔案解析完成之後將service放入到service_list中。

檔案解析完成之後將service放入到service_list中。

   \system\core\init\builtins.c

       Service的啟動是在do_class_start函式中完成:

int do_class_start(int nargs, char **args)
{
    service_for_each_class(args[1], service_start_if_not_disabled);
    return 0;
}

遍歷所有名稱為classname,狀態不為SVC_DISABLED的Service啟動

複製程式碼
void service_for_each_class(const char *classname,
                            void (*func)(struct service *svc))
{
       ……
}

static void service_start_if_not_disabled(struct service *svc)
{
    if (!(svc->flags & SVC_DISABLED)) {
        service_start(svc, NULL);
    }
}
複製程式碼

do_class_start對應的命令:

  KEYWORD(class_start, COMMAND, 1, do_class_start)

init.rc檔案中搜索class_start:class_start main 、class_start core、……

  main、core即為do_class_start引數classname

init.rc檔案中Service class名稱都是main:

       service drm /system/bin/drmserver

    class main

  service surfaceflinger /system/bin/surfaceflinger

       class main

於是就能夠通過main名稱遍歷到所有的Service,將其啟動。

do_class_start呼叫:

       init.rc中

    on boot  //action

      class_start core    //執行command 對應 do_class_start

          class_start main

Init程序main函式中:

system/core/init/init.c中:

複製程式碼
int main(){

     //掛在檔案

       //解析配置檔案:init.rc……

       //初始化化action queue

     ……
       for(;;){

              execute_one_command();

              restart_processes();

              for (i = 0; i < fd_count; i++) {

            if (ufds[i].revents == POLLIN) {

                if (ufds[i].fd == get_property_set_fd())

                    handle_property_set_fd();

                else if (ufds[i].fd == get_keychord_fd())

                    handle_keychord();

                else if (ufds[i].fd == get_signal_fd())

                    handle_signal();
            }
        }

       }
}
複製程式碼

  迴圈呼叫service_start,將狀態SVC_RESTARTING啟動, 將啟動後的service狀態設定為SVC_RUNNING。

  pid=fork();

  execve();

  在訊息迴圈中:Init程序執行了Android的Command,啟動了Android的NativeService,監聽Service的變化需求,Signal處理。

Init程序是作為屬性服務(Property service),維護這些NativeService。

二 ServiceManager啟動

       在.rc指令碼檔案中zygote的描述:

複製程式碼
service servicemanager /system/bin/servicemanager
  class core
  user system
  group system
  critical
  onrestart restart zygote
  onrestart restart media
  onrestart restart surfaceflinger
  onrestart restart drm
複製程式碼

       ServiceManager用來管理系統中所有的binder service,不管是本地的c++實現的還是java語言實現的都需要

這個程序來統一管理,最主要的管理就是,註冊新增服務,獲取服務。所有的Service使用前都必須先在servicemanager中進行註冊。

  do_find_service( )

  do_add_service( )

  svcmgr_handler( )

  程式碼位置:frameworks\base\cmds\servicemanager\Service_manager.c

三 Zygote程序的啟動

  Zygote這個程序是非常重要的一個程序,Zygote程序的建立是真正的Android執行空間,初始化建立的Service都是Navtive service.

(1) 在.rc指令碼檔案中zygote的描述

相關推薦

Android系統啟動過程-uBoot+Kernel+Android

轉載自:http://www.cnblogs.com/pngcui/p/4665106.html 摘要:本文是參考大量網上資源在結合自己檢視原始碼總結出來的,讓自己同時也讓大家加深對Android系統啟動過程有一個更加深入的瞭解!再次強調,本文的大多數功勞應

Android系統啟動過程

android 框架的示意圖: Linux核心啟動之後就到Android Init程序,進而啟動Android相關的服務和應用 啟動的過程如下圖所示: 一 Init程序的啟動   init程序,它是一個由核心啟動的使

Android系統啟動過程學習

使用 android 手機已經長時間了,同時,從大學學習 android 開發開始,也進行過多款 android app 專案的開發,但是對 android 內部的啟動過程,即當我們從按下電源鍵開機開始, android 系統內部是如何執行的,由於android

Android系統啟動過程分析

Android系統啟動過程分析 一、Android平臺架構 首先貼一張Android系統架構圖方便理解整個Android架構,這可以讓我們從整體上對整個啟動流程有個大概認知。 可以看出整個架構由5部分構成,從下到上分別為: 1. Linux核心層 Android 的核心繫統服務基於Linux 核心,在此基

Android系統啟動流程(一)解析init進程啟動過程

option 寫入 android change failed miss 通知 target sna 前言 作為“Android框架層”這個大系列中的第一個系列,我們首先要了解的是Android系統啟動流程,在這個流程中會涉及到很多重要的知識點,這個系列我們就來一一講解它們

Android系統啟動流程(一)解析init程序啟動過程

前言 作為“Android框架層”這個大系列中的第一個系列,我們首先要了解的是Android系統啟動流程,在這個流程中會涉及到很多重要的知識點,這個系列我們就來一一講解它們,這一篇我們就來學習init程序。 1.init簡介 init程序是An

android原始碼4.4.2----系統啟動過程分析

public class SystemServer {   private static final String TAG = "SystemServer";   public static final int FACTORY_TEST_OFF = 0;   public static final int F

Android系統啟動流程(二)解析Zygote程序啟動過程

前言 上一篇文章我們分析了init程序的啟動過程,啟動過程中主要做了三件事,其中一件就是建立了Zygote程序,那麼Zygote程序是什麼,它做了哪些事呢?這篇文章會給你這些問題的答案。 1.Zygote簡介 在Android系統中,DVM(D

Linux啟動流程-bootloader至kernel的過程--android系統啟動流程

1 Bootloader 對於一般的ARM處理器,CPU上電或復位執行第一條指令所在地址,即第一段程式Bootloader的開始地址,Bootloader一般存於Nor-flash(XIP),支援晶片內執行。 Bootloader的功能可總結為:1)初始化CPU時鐘,記憶體

Android系統啟動流程——解析init程序啟動過程

最近主要是在看android關機充電流程,對android啟動有些迷惑,結合網上部落格專家的文章,加一些自己的理解。 1.init簡介 init程序是Android系統中使用者空間的第一個程序,作為第一個程序,它被賦予了很多極其重要的工作職責,比如建立zygote(孵化器

Android原始碼學習之八—系統啟動過程

Android原始碼數量龐大,雖然對它的學習從未停止,但是整理成這樣的文字,實在是費時費力的一件事情,不過好在前文已經對其基本機制加以分析,相信以此為基礎,其他的內容學習起來就沒那麼困難了。 今天是20

Android系統啟動流程(四)Launcher啟動過程系統啟動流程

相關文章  Android系統架構與系統原始碼目錄  Android系統啟動流程(一)解析init程序啟動過程  Android系統啟動流程(二)解析Zygote程序啟動過程  Android系統啟動流程(三)解析SyetemServer程序啟動過程 前言

Android系統啟動流程(三)解析SyetemServer程序啟動過程

相關文章  Android系統架構與系統原始碼目錄  Android系統啟動流程(一)解析init程序啟動過程  Android系統啟動流程(二)解析Zygote程序啟動過程 前言 上一篇我們學習了Zygote程序,並且知道Zygote程序啟動了SyetemServ

Android編譯過程總結及android中各種img檔案的作用以及系統啟動過程

編譯環境:ubuntu 10.04(或者更高)(windows平臺目前不被支援) 本文以編譯android2.3為例,64位作業系統 1、編譯環境的準備  (1)確保安裝有ubuntu系統或者虛擬機器 (2)安裝JDK1.6(對於Android2.3以上程式碼) $ sud

Android 的 ramdisk.img、system.img、userdata.img 作用說明,以及UBoot 系統啟動過程

一個分割槽影像檔案,它會在kernel 啟動的時候,以只讀的方式被 mount , 這個檔案中只是包含了 /init 以及一些配置檔案,這個ramdisk 被用來呼叫init,以及把真正的root file system mount 起來。 #其實ramdisk.img的內容就是/out/target/pro

linux系統啟動過程具體解釋-開機加電後發生了什麽 --linux內核剖析(零)

界面 種類 system pos 放置 nlog 提示 mar .com 本文參考了例如以下文章 深入理解linux啟動過程 mbr (主引導記錄(Master Boot Record)) 電腦從開機加電到操作系統main函數之前執行的過程

為什麽要有uboot?帶你全面分析嵌入式linux系統啟動過程中uboot的作用

統一 一次 fail 進入 是我 臺式機 平板 配置 webp 1.為什麽要有uboot 1.1、計算機系統的主要部件 (1)計算機系統就是以CPU為核心來運行的系統。典型的計算機系統有:PC機(臺式機+筆記本)、嵌入式設備(手機、平板電腦、遊戲機)、單片機(家用電器像

linux 系統啟動過程分析

系統root 密碼丟失故障 linux啟動順序主板BIOS加電自檢 檢查硬件--> 讀取硬盤引導扇區(MBR)--> 啟動引導程序(grub)--> 選擇系統--> 加載系統內核(kernel shell)--> 啟動系統讀取相應的默認設置(環境變量,運行級別)--

linux系統啟動過程

字符 tty 我們 變量 默認 終端 .... 用戶 關聯 初始化進程 會根據字符終端設備,打開getty程序,並關聯在字符終端設備上tty0上 getty打開login 進程 login會讀取用戶信息,查詢出登陸shell 登陸成功,啟動shell,開始讀取shell啟動

linux學習-Linux系統啟動過程

linux 關機 mage 模式 服務 關機 win sin class windows系統 linux系統啟動過程 Linux系統的啟動過程並不是大家想象中的那麽復雜,其過程可以分為5個階段: 內核的引導。 運行init。 系統初始化。 建立終端 。 用戶登錄系統。