JAVA啟動流程調試和程序結構.ppt
《JAVA啟動流程調試和程序結構.ppt》由會員分享,可在線閱讀,更多相關《JAVA啟動流程調試和程序結構.ppt(38頁珍藏版)》請在裝配圖網(wǎng)上搜索。
Android系統(tǒng)移植第九章Java啟動流程和程序結構 一 java部分的啟動流程二 jni的基本概念三 jni的實現(xiàn)四 框架層中使用jni五 APK中使用jni 9 1java部分的啟動流程 Android系統(tǒng)的本地部分啟動完成后 將形成一系列的守護進程 其中的名稱為zygote的守護進程將繼續(xù)完成java部分的初始化 java部分初始化結束后 形成zygote SystemServer以及若干個java應用的進程 系統(tǒng)進入正常運行階段 9 1 1啟動流程概述 Android系統(tǒng)java部分的啟動主要涉及以下幾個實體 作為zygote運行的本地可執(zhí)行程序 java框架庫中的zygoteInit java服務庫當中的SystemServer和個服務 java服務庫對應的JNI本地庫libandroid sercers so 系統(tǒng)服務器的本地庫libandroid sercers so Java的啟動流程可以分成以下的幾個步驟 從本地可執(zhí)行程序運行名為zygote的守護進程Zygote運行ZygoteInit 進入java程序 ZygoteInit運行SystemServer java類 并分裂出一個新的進程 SystemServer首先運行l(wèi)ibandroid sercers so庫當中的初始化 進入本地程序 執(zhí)行l(wèi)ibandroid sercers so當中的系統(tǒng)初始化 SystemServer中的java初始化再次被調用 再入java程序 建立ServerThread線程 9 1 1啟動流程概述 ServerThread線程建立各個服務 然后進出入循環(huán)ActivityManagerServer服務在啟動結束發(fā)送相關消息 各個java應用程序運行 啟動的過程中 經(jīng)歷了復雜的調用過程 有從本地到java的調用 有java之間的調用 有java調用本地 也有本地之間的調用 最終主要工作 在名稱為ServerThread的java線程中完成 Java啟動完成后 android進入正常的運行狀態(tài)中 此時 與java相關進程主要有以下3個部分 Zygote 本質是本地守護進程 最終進入循環(huán)狀態(tài) System server java的第一個守護進程 其中也包括若干個線程 并進入循環(huán) 各個java應用程序 他們并行存在 互相依賴關系 從liunx系統(tǒng)運行的角度上 SystemServe和各個java應用程序內的進程都是zygote進程的子進程 9 1 1啟動流程概述 Androidjava部分的啟動流程如圖途中實線部分表示java系統(tǒng)相關的實體 其中有本地的內容也有java的內容 右側虛線框中的內容分表示運行時的進程情況 在java的啟動過程中 java服務庫的重點 它調用了本地的部分初始化 然后建立了java層的各個服務 在系統(tǒng)正常的運行過程中 這些服務是androidjava系統(tǒng)的公共部分和后臺部分 9 1 2java系統(tǒng)的守護進程 Zygote是通過init進程讀取的init rc啟動的一個守護進程的民稱 在init rc中執(zhí)行性內容的相關部分如下圖所示 名稱Zygote的服務的執(zhí)行者 實際上是 system bin app process的可執(zhí)行程序 后面的內容是app process的執(zhí)行參數(shù) app process的代碼路徑為frameworks base cmds app process 生成名稱為app process的可執(zhí)行程序 會連接libandroid runtime so動態(tài)庫 間接連接Dalvik虛擬機的libdvm so庫調用Dalvik虛擬機 其中app mian cpp文件中的main 函數(shù)為可執(zhí)行程序入口 主要的代碼片段如下 9 1 2java系統(tǒng)的守護進程 其中的appruntime實際上是運行庫androidRuntime的繼承者 可以視為一個封裝類 app process執(zhí)行后 根據(jù)傳入的參數(shù)不同有兩條運行路徑 第一個分支 當命令具有 zygote參數(shù)的時候 將進程的名稱設置為zygote然后調用java內部的類zygoteinit 完成java環(huán)境第一步啟動 9 1 2java系統(tǒng)的守護進程 第二個分支 當命令程序沒有 zygote參數(shù)的時候 將進程的名稱設置為第一個參數(shù) 然后根據(jù)類名啟動程序 App process可執(zhí)行程序作為zygote守護進程運行的時候 顯然調用的是第一個分支 根據(jù)參數(shù)的傳遞情況 其調用的是AppRuntime類的start 函數(shù)傳入的第一個參數(shù)為java的類名第二個參數(shù)為startsystemserver 根據(jù)命令行的參數(shù) 其數(shù)值為true 這個過程是在本地的進程中 利用androidruntime執(zhí)行java的代碼 9 1 3Zygoteinit類的執(zhí)行 守護進程zygote運行后 com android internal os Zygoteinit進入java環(huán)境中運行 Zygoteinit是一個java框架庫 framework jar 中的內部類 ZygoteInit java在farmeworks base core java com android internal os目錄中 其中的main 是一個android系統(tǒng)正常啟動后執(zhí)行的第一段java代碼 初始化過程中 zygote守護進程調用ZygoteInit時 傳入的第一個參數(shù)為true 因此其中的startSystemServer 方法將會被執(zhí)行 9 1 3Zygoteinit類的執(zhí)行 startSystemServer 方法中的核心內容如下所示 startSystemServer執(zhí)行了zygote forkSystemserver 完成了一次進程的分裂 分裂出來的子進程執(zhí)行了路徑為com android SystemServer的java類 這是java代碼中分裂另一個進程的方法 分裂出的進程就是系統(tǒng)服務器 它的名稱為system server 進程分裂后 在父進程中 startsystemsrver 方法將返回 ZygoteInit的main方法中代碼將繼續(xù)向下執(zhí)行 進入有runforkmode或者runselectloopmode 構建的循環(huán) 默認是后者 執(zhí)行到這個地方 zygote守護進程進入了循環(huán) 而分裂出來的第一個java進程 系統(tǒng)服務器 system server 將完成后續(xù)的java層初始化工作 9 1 4Zygoteinit類的執(zhí)行 main方法 System server進程運行的分類是com android SystemServer 這個類的內容在java服務庫 server jar 當中 SystemServer執(zhí)行過程中多次在java和本地直接切換 涉及的內容還包括libandroid server so和libsystem server so兩個本地庫 Java層入口 SystemServer類的main 方法SystemServer類是服務包的主入口 在systmesrver java文件中是實現(xiàn) 代碼的路徑為 frameworks base service java com android server 當這個類被調用后 執(zhí)行其main 代碼 System server運行后加載了本地庫libandroid server so 然后執(zhí)行其中的init1 函數(shù) 調用了本地的初始化內容 作為第一階段的初始化內容 9 1 4Zygoteinit類的執(zhí)行 本地接口init1 Libandroid server so提供的是服務包的jni部分的支持 在java執(zhí)行過程中 又執(zhí)行了本地的調用 這種實現(xiàn)方式也就是在java系統(tǒng)的初始化過程中 插入了一段本地執(zhí)行的內容 表示在特定的時機 完成部分本地初始化 Systemserver中執(zhí)行的init1 本地方方法 在frameworks base service jni目錄中的com android server systemserver cpp文件中 其中主要的內容如下 這里實現(xiàn)了java中所需要的民稱為init1的本地調用 參數(shù)的內容沒有進行處理 而直接調用了本地的一個函數(shù)system init 9 1 4Zygoteinit類的執(zhí)行 system init System init 先完成本地的一些初始化 在調用java程序 最終進入循環(huán) 這個函數(shù)在libsystem server so庫中實現(xiàn) 代碼路徑為 frameworks base cmds system server libary System init 首先執(zhí)完成本地相關的初始化 其中如果設置了 system init startsufaceflinger 屬性為1 則啟動surfacefilnger服務 如果本地的mediapalyerservice等服務沒有初始化 在此處也將啟動 然后得到java的運行環(huán)境androidruntime 并調用com android server systemserver類中的名稱為init2靜態(tài)方法 此時由本地程序調用systemserver類中的java部分 9 1 4Zygoteinit類的執(zhí)行 system init 具體的系統(tǒng)實現(xiàn)中 如果有內容需要在java系統(tǒng)正式執(zhí)行之前完成初始化 同樣可以將初始化的內容放置到libsystme server so的system init 函數(shù)中 除此之外 frameworks base cmds system server目錄中的內容將生成一個名稱為system server的可執(zhí)行程序 它連接了libsystem server so庫并調試了system init 完成等同于正常初始化的流程 System server可執(zhí)行程序只用于測試 正常啟動中不執(zhí)行 9 1 4Zygoteinit類的執(zhí)行 init2 方法 Systemserver類中的靜態(tài)方法init2 被本地調用后 system server進程中的java代碼又再次被執(zhí)行 Init2 方法如下所示 這里調用了一個serverthread 它是一個java線程 thread 類的繼承者 在其中繼續(xù)完成后續(xù)的工作 實際上systemServer類當中的兩個靜態(tài)方法main 和init2 并無直接的調用關系 而是經(jīng)過本地的間接調用 System server進程的執(zhí)行流程為 mian init1 system init int2 兩端為java中的內容 中間為本地的內容 Systemserver類的init2 方法執(zhí)行后會返回 之后system server這個進程的主線程將運行位于libsystem server so中的system init 最后的循環(huán)中 9 1 4Zygoteinit類的執(zhí)行 serverthread Serverthread是systemserver java文件中和systemserver平行的一個類 它是java線程類thread的繼承者 負責建立各個java子服務 Serverthread的核心內容是其中的run 方法 執(zhí)行流程入下所示 serverthread 的初始化工作完成后 自己調用Looper loop 進入循環(huán) 這里啟動的各個服務都是系統(tǒng)核心的重要部分 其中很多服務均會建立線程的后臺運行 例如其中的幾個服務建立過程的片段如下 9 1 4Zygoteinit類的執(zhí)行 serverthread serverthread 的初始化工作完成后 自己調用Looper loop 進入循環(huán) 這里啟動的各個服務都是系統(tǒng)核心的重要部分 其中很多服務均會建立線程的后臺運行 例如其中的幾個服務建立過程的片段ServerThread的初始化流程是 首先建立關鍵 critical 的服務 例如以上的ActivityManagerService等 再建立各個次要服務 例如InputMethodManagerServer networkservice等 然后將調用很多服務中都具有的systemready 方法 等待每一個服務初始化完成 初始化完成后 serverthread才進入looper loop 的循環(huán) SystemServer中的服務 service 有時候這些服務又被稱之為 anderoid服務 區(qū)分于 本地服務 他們的實現(xiàn)其實只是一個名詞 并無實現(xiàn)類型的限制 上面的powermanagerservice 就是一個IXX stub的繼承者 因此通過servermanager將其加成服務 而activitymanagerservice則提供了靜態(tài)的main 方法來初始化 其實也是一個IXXX stub的繼承者 在main 方法中建立自己的實例 并增加到ServerManager Lightsservice則只是一個普通類 使用new建立實例即可 9 1 4Zygoteinit類的執(zhí)行 各個 服務 的執(zhí)行 當系統(tǒng)初始化完成后 在android系統(tǒng)的正常運行狀態(tài)中 SystemServer進程中包含了多個線程 線程大部分是由system server中的服務所建立的 用于執(zhí)行每個服務當中的后臺工作 線程和使用system server增加多少個服務 binder的繼承者 沒有任何關系 只有在代碼中構建了thread 才具有線程 在命令界面中執(zhí)行ps t可以查看system server進程中的線程情況 查看的結果片段如下所示 1 EntropyServicekey entropy 2 PowerManagerServicekey power 3 ActivityManagerServicekey activityam工具命令 4 TelephonyRegistrykey telephony registry 5 PackageManagerServicepm工具命令 6 AccountManagerServicekey account 7 BatteryServicekey battery 8 HardwareServicekey hardware 9 AlarmManagerServicekey alarm 10 SensorServicekey sensor 11 WindowManagerServicekey window 9 1 4Zygoteinit類的執(zhí)行 各個 服務 的執(zhí)行 12 BluetoothServicekey bluetooth 13 BluetoothA2dpServicekey bluetooth a2dp 14 StatusBarServicekey statusbar 15 ClipboardServicekey clipboard 16 InputMethodManagerServicekey input method 17 NetStatServicekey netstat 18 ConnectivtiyServicekey connectivity 19 AccessibilityManagerServicekey accessibility 20 NotificationManagerServicekey notification 21 MountServicekey mount 22 DeviceStorageMonitorServicekey devicestoragemonitor 23 LocationManagerServicekey location 24 SearchManagerServicekey search 25 FallbackCheckinServicekey checkin 26 WallpaperManagerServicekey wallpaper 27 AudioServicekey audio 28 BackupManagerServicekey backup 29 AppWidgetServicekey appwidget 9 1 4Zygoteinit類的執(zhí)行 各個 服務 的執(zhí)行 此處眾多的父進程id PID 為system server的id進程 實際上都是system server中的線程 其中分成了各種不同的類型 HeapWorker GC SignalCatcher JDWP Compile幾個線程都是java環(huán)境所具有的 System Server是java環(huán)境的進程 因此具有以上內容 SurfaceFilnger等是從本地system init 中初始化過程中建立的本地線程 因此出現(xiàn)在交前的位置 Er serverthread是用于啟動各個java服務的線程 也就是serverthread 在serverthread之后就是activitymanager processstats packaemanager和windowmanager等 則是各個java服務的線程 Java全局的系統(tǒng)服務器初始化完畢后 有其中的某些服務發(fā)送服務信號 各個應用程序的進程被啟動 9 1 5java應用程序部分的啟動 Java應用程序部分的啟動原理是其中組件的調用 主要原因是java服務庫運行后發(fā)送的各個intent 消息的發(fā)送各個應用程序的啟動 一般都是由于系統(tǒng)服務器當中的activitymanagerservice在初始化完成后發(fā)送了某種特殊的消息 其中造成應用程序啟動的兩個原因是啟動了桌面 HOME 活動和發(fā)送了啟動結束 ACTION BOOT COMPLETED 廣播 Activitymanagerservice當中的starthomeactivitylocked 方法和桌面啟動有關系 而finishbooting 將在啟動結束的時候被調用 其核心思想是包含一個動作名稱為Intent ACTION BOOT COMPLETED的intent發(fā)送廣播 因此各個應用程序包當中接受這個動作的BroadcastReceiver將有可能被運行 9 1 5java應用程序部分的啟動 各個java應用程序包一般講成為一個獨立的進程運行 這些進程也是zygote的子進程 在這點上他們和system server進程是相同的 因此 雖然應用程序進程和system server在啟動上有因果關系 但是在運行時linux視他們?yōu)橥粋€進程的子進程 如果沒有特殊的情況下 所有的java進程都是zygote的子進程 各個java應用程序的啟動是通過app process的第二個分支完成的 由于其中調用了set process name 因此每個java應用程序的進程名稱通常就是他們的java包 在系統(tǒng)啟動完成后可以查看java命令進程情況 8 1android的java本地調用 Jni 8 1android的java本地調用 Jni 9 1 5java應用程序部分的啟動 System server和各個應用程序進程的父進程均為zygote 他們都是由zygote以類似的方式啟動起來的 系統(tǒng)不會立刻釋放每個應用程序包上下文運行 因此只需要一個應用程包中有組件運行過 他的進程就會立即存在 在系統(tǒng)初始化階段之后 雖然沒有主動運行某些應用 但是此時已經(jīng)存在了一些各個應用進程 他是可能是由不同的方式被啟動的 由于某些包中的broadcastreceiver在接受了廣播后 得以運行 因此它們雖然運行完成但是應用程序進程依然存在 例如 com android lancher則作為桌面程序存在 他建立一些放置在桌面上的appwidet 窗口部件 因此實現(xiàn)這些窗口小部件的應用程序包就已經(jīng)是啟動的進程了 有一些數(shù)據(jù)庫想關的應用程序包 需要在啟動后處理 因此其中的廣播接收器接收動作為ACTION BOOT COMPLETED的廣播 也已經(jīng)被運行過了 9 2java層程序的結構設計 本部分介紹java層的結構化設計思路 指的是主體結構子java層的程序 程序本身依然有本地調用 C C 的部分 主要需要關注的方面是android特有的java框架層和java應用層的各中通信機制 9 2 1目標和設計思路 在android的java層次中進行框架性程序設計的時候 主要需要處理以下幾個方面的問題 1 兩個java進程之間的程序 包括遠程方法調用 2 在后臺長期運行的程序 用來處理全局或者公共的內容 3 程序間特定的通知 以上的三個方面中 第一個方面和第二個方面是后臺程序的基本內容 他們也可以在本底層完成 但是第三個方面由于涉及android的java框架層和java應用層各種特殊的通信機制 因此只能在java層完成 Android的java應用層各種特殊的通信機制包括 使用android content包中的intent類 android app包中的pendingitent類和應用程序層的組件 activity server或者broadcastreceiver 進行交互 通過uri訪問某些內容提供者 使用toast進行提示 使用狀態(tài)欄的通知等 在java層的程序結構化設計的核心是java層的binder機制 他可以完成兩個java進程間相互調用的主要方面 9 2 1目標和設計思路 在java層進行框架層的設計 主要具有兩種典型的結構 一種是在java框架層實現(xiàn)一個服務 作為系統(tǒng)服務的一部分 另一種形式是基于應用層的service組件 兩種方式都可以實現(xiàn)后臺長期運行的公共程序 一般他們實現(xiàn)的核心都基于java層的binder機制 8 1android的java本地調用 Jni 8 1android的java本地調用 Jni 8 1android的java本地調用 Jni 8 1android的java本地調用 Jni 8 1android的java本地調用 Jni 在android中提供的jni的方式 讓java程序可以調用C語言編寫的程序 android中很多java類具有native接口 這些native接口就是由本地實現(xiàn) 然后注冊到系統(tǒng)中的 在Android中主要的jni代碼在一下的路徑中 Frameworks base core jni 這個路徑中的內容將被編譯成庫libandroid runtime so 這就是一個普通的動態(tài)庫 被放置在目標系統(tǒng)的 system lib目錄中 除此之外 android還包含其他的jni庫 錄入媒體部分的jni在目錄frameworks base media jni中 被編譯成libmedia jni so Jni中的各個文件實際上就是C 的普通文件 其命令一般和支持的java類有對應關系 這種關系式習慣上的寫法 而不是強制的 在android中實現(xiàn)的jni庫 需要連接動態(tài)庫libnativehelper so Jni在android層次結構中的作用 8 1 1android的jni實現(xiàn) Jni在android層次結構中的作用如圖所示 Android系統(tǒng)的jni和標準的java基本類似 實現(xiàn)jni主要的流程為在java源代碼中聲明本地方法 并注冊到對應的java類中 在java層的聲明方面 android和標準的java使用了完全相同的方法 在本地層的實現(xiàn)方面 原本jni也沒有絕對完整的規(guī)則 android系統(tǒng)具有一定的特殊性 8 1 1android的jni實現(xiàn) 謝謝- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- JAVA 啟動 流程 調試 程序結構
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://www.hcyjhs8.com/p-6359816.html