生活随笔
收集整理的這篇文章主要介紹了
Android系统的启动流程简要分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這是我結合網上的資料以及自己分析android4.4的源碼整理的筆記,對整個安卓系統的流程啟動進行了梳理,很多細節并未展開,只是簡要的進行了介紹.
一.Android系統的架構介紹
Android的整個系統分為四層,從上至下為應用層、框架層、系統庫、Linux內核層.
1.應用層
各種系統應用,比如電話、瀏覽器、日歷等.
2.框架層
也就是Framework層,提供各種服務,比如下圖的一些.
3.系統庫
3.1. 提供核心類庫,比如OpenGl,SQlite
3.2.提供Davlik虛擬機和Java核心類庫
如下圖舉例
4.Linux內核層
提供各種驅動和硬件抽象層.
二.Android系統的啟動流程
先放張啟動流程圖,跟著流程走
Linux內核啟動后會啟動init進程,init是所有進程的父進程,代碼位于根目錄下 system\core\init
init進程的作用主要是顯示開機動畫,通過解析init.rc腳本然后啟動一系列服務和進程. 這里的服務包括媒體服務MediaServer和服務管理者ServiceManager,ServiceManager是服務的管家,添加、注冊和獲取服務都通過它. 這里的進程包括安裝app、內存管理、Zygote等進程等. 最核心的的是Zygote進程,它是Android系統的第一個Java進程. ,它是由init進程執行app_process程序啟動的,app_process 程序代碼位于frameworks/base/cmds/app_process
在app_main.cpp里啟動ZygoteInit和Davlik虛擬機
[java]?view plain?copy if?(zygote)?{?? ?????? ????runtime.start("com.android.internal.os.ZygoteInit",?? ???????????????startSystemServer???"start-system-server"?:?"");?? ???}?else?if?(className)?{?? ????????? ???????runtime.mClassName?=?className;?? ???????runtime.mArgC?=?argc?-?i;?? ???????runtime.mArgV?=?argv?+?i;?? ???????runtime.start("com.android.internal.os.RuntimeInit",?? ???????????????application???"application"?:?"tool");?? ???}?else?{?? ???????fprintf(stderr,?"Error:?no?class?name?or?--zygote?supplied.\n");?? ???????app_usage();?? ???????LOG_ALWAYS_FATAL("app_process:?no?class?name?or?--zygote?supplied.");?? ???????return?10;?? ???}??
看下ZygoteInit這個類,它位于frameworks\base\core\java\com\android\internal\os目錄下.
它的代碼如下,看它在main方法里究竟做了有一些什么事情.
[java]?view plain?copy public?static?void?main(String?argv[])?{?? ????????try?{?? ?????????????? ????????????SamplingProfilerIntegration.start();?? ?????????????? ????????????registerZygoteSocket();?? ?????????????? ????????????EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,?? ????????????????SystemClock.uptimeMillis());?? ?????????????? ????????????preload();?? ?????????????? ????????????EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,?? ????????????????SystemClock.uptimeMillis());?? ?? ?????????????? ????????????SamplingProfilerIntegration.writeZygoteSnapshot();?? ?? ?????????????? ????????????gc();?? ???????????? ?????????????? ????????????Trace.setTracingEnabled(false);?? ??????? ?????????????? ????????????if?(argv.length?!=?2)?{?? ????????????????throw?new?RuntimeException(argv[0]?+?USAGE_STRING);?? ????????????}?? ?????????????? ????????????if?(argv[1].equals("start-system-server"))?{?? ?????????????????? ????????????????startSystemServer();?? ?????????????? ????????????}?else?if?(!argv[1].equals(""))?{?? ????????????????throw?new?RuntimeException(argv[0]?+?USAGE_STRING);?? ????????????}?? ?? ????????????Log.i(TAG,?"Accepting?command?socket?connections");?? ?? ?????????????? ????????????runSelectLoop();?? ?? ?????????????? ????????????closeServerSocket();?? ????????}?catch?(MethodAndArgsCaller?caller)?{?? ????????????caller.run();?? ????????}?catch?(RuntimeException?ex)?{?? ????????????Log.e(TAG,?"Zygote?died?with?exception",?ex);?? ????????????closeServerSocket();?? ????????????throw?ex;?? ????????}?? ????}??
1.初始化Zygote
在這里開啟對系統性能的統計
2.注冊ZygoteSocket服務
創建了一個Socket接口,用來和AMS(ActivityManagerService)通信
3.預加載Framework大部分的類和資源
它會開啟3個線程分別預加載3個東西:類、資源和OpenGl
[java]?view plain?copy static?void?preload()?{?? ????????Thread?preloadClasses?=?new?Thread(new?Runnable()?{?? ????????????public?void?run()?{?? ?????????????????? ????????????????preloadClasses();?? ????????????}?? ????????});?? ????????Thread?preloadResources?=?new?Thread(new?Runnable()?{?? ????????????public?void?run()?{?? ?????????????????? ????????????????preloadResources();?? ????????????}?? ????????});?? ????????Thread?preloadOpenGL?=?new?Thread(new?Runnable()?{?? ????????????public?void?run()?{?? ?????????????????? ????????????????preloadOpenGL();?? ????????????}?? ????????});?? ?????????? ????????preloadClasses.start();?? ????????preloadResources.start();?? ????????preloadOpenGL.start();?? ????????try?{?? ????????????preloadClasses.join();?? ????????????preloadResources.join();?? ????????????preloadOpenGL.join();?? ????????}?catch?(InterruptedException?e)?{?? ????????????e.printStackTrace();?? ????????}?? ????}??
4.完成Zygote的初始化
結束統計并生成結果文件
5.在啟動之后做一次垃圾回收
6.fork一個新的進程system_server
fork是linux的的方法,會復制出一個與原來進程一樣的進程,但是如果初始參數或者傳入的變量不同,兩個進程也可以做不同的事.
startSystemServer的代碼如下
[java]?view plain?copy ? ? ??? ????private?static?boolean?startSystemServer()?? ????????????throws?MethodAndArgsCaller,?RuntimeException?{?? ????????long?capabilities?=?posixCapabilitiesAsBits(?? ????????????OsConstants.CAP_KILL,?? ????????????OsConstants.CAP_NET_ADMIN,?? ????????????OsConstants.CAP_NET_BIND_SERVICE,?? ????????????OsConstants.CAP_NET_BROADCAST,?? ????????????OsConstants.CAP_NET_RAW,?? ????????????OsConstants.CAP_SYS_MODULE,?? ????????????OsConstants.CAP_SYS_NICE,?? ????????????OsConstants.CAP_SYS_RESOURCE,?? ????????????OsConstants.CAP_SYS_TIME,?? ????????????OsConstants.CAP_SYS_TTY_CONFIG,?? ????????????OsConstants.CAP_BLOCK_SUSPEND?? ????????);?? ????????????????????? ????????String?args[]?=?{?? ????????????"--setuid=1000",?? ????????????"--setgid=1000",?? ????????????"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1032,3001,3002,3003,3006,3007",?? ????????????"--capabilities="?+?capabilities?+?","?+?capabilities,?? ????????????"--runtime-init",?? ????????????"--nice-name=system_server",?? ????????????"com.android.server.SystemServer",?? ????????};?? ????????ZygoteConnection.Arguments?parsedArgs?=?null;?? ?? ?????????? ????????int?pid;?? ?? ????????try?{?? ????????????parsedArgs?=?new?ZygoteConnection.Arguments(args);?? ????????????ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);?? ????????????ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);?? ?? ?????????????? ????????????pid?=?Zygote.forkSystemServer(?? ????????????????????parsedArgs.uid,?parsedArgs.gid,?? ????????????????????parsedArgs.gids,?? ????????????????????parsedArgs.debugFlags,?? ????????????????????null,?? ????????????????????parsedArgs.permittedCapabilities,?? ????????????????????parsedArgs.effectiveCapabilities);?? ????????}?catch?(IllegalArgumentException?ex)?{?? ????????????throw?new?RuntimeException(ex);?? ????????}?? ?? ?????????? ????????if?(pid?==?0)?{?? ????????????handleSystemServerProcess(parsedArgs);?? ????????}?? ?? ????????return?true;?? ????}?? 代碼里會fork出SystemServer.之后進入到SystemServer.java這個類中.
代碼位于:frameworks/base/services/java/com/android/server/SystemServer.java
SystemServer的main方法會調用
[java]?view plain?copy ServerThread?thr?=?new?ServerThread();?? thr.initAndLoop();??
開啟一個線程ServerThread,在這里面加載各種服務,比如WindowManagerServer(Wms)、ActivityManagerService(Ams)、PackageManagerServer(Pms)等.
7.runSelectLoop
處理客戶端的連接請求,等待其他進程的請求.
8.closeServerSocket()
關閉服務Socket.
至此,整個系統服務已經運行起來了,至于怎么安裝程序、啟動桌面等,以后再寫.
版權聲明:本文為博主原創文章,轉載請注明出處:鄧志勇博客 http://blog.csdn.net/qq_31530015/
總結
以上是生活随笔為你收集整理的Android系统的启动流程简要分析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。