




已閱讀5頁,還剩33頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Android系統移植第九章Java啟動流程和程序結構,一、java部分的啟動流程二、jni的基本概念三、jni的實現四、框架層中使用jni五、APK中使用jni,9.1java部分的啟動流程,Android系統的本地部分啟動完成后,將形成一系列的守護進程,其中的名稱為zygote的守護進程將繼續完成java部分的初始化,java部分初始化結束后,形成zygote、SystemServer以及若干個java應用的進程,系統進入正常運行階段。,9.1.1啟動流程概述,Android系統java部分的啟動主要涉及以下幾個實體:作為zygote運行的本地可執行程序,java框架庫中的zygoteInit,java服務庫當中的SystemServer和個服務,java服務庫對應的JNI本地庫libandroid_sercers.so,系統服務器的本地庫libandroid_sercers.so。Java的啟動流程可以分成以下的幾個步驟。從本地可執行程序運行名為zygote的守護進程Zygote運行ZygoteInit(進入java程序)ZygoteInit運行SystemServer(java類),并分裂出一個新的進程,SystemServer首先運行libandroid_sercers.so庫當中的初始化(進入本地程序)。執行libandroid_sercers.so當中的系統初始化。SystemServer中的java初始化再次被調用(再入java程序)。建立ServerThread線程。,9.1.1啟動流程概述,ServerThread線程建立各個服務,然后進出入循環ActivityManagerServer服務在啟動結束發送相關消息。各個java應用程序運行。啟動的過程中,經歷了復雜的調用過程,有從本地到java的調用,有java之間的調用,有java調用本地,也有本地之間的調用,最終主要工作,在名稱為ServerThread的java線程中完成。Java啟動完成后,android進入正常的運行狀態中,此時,與java相關進程主要有以下3個部分。Zygote:本質是本地守護進程,最終進入循環狀態。System_server:java的第一個守護進程,其中也包括若干個線程,并進入循環。各個java應用程序:他們并行存在,互相依賴關系。從liunx系統運行的角度上,SystemServe和各個java應用程序內的進程都是zygote進程的子進程。,9.1.1啟動流程概述,Androidjava部分的啟動流程如圖途中實線部分表示java系統相關的實體,其中有本地的內容也有java的內容,右側虛線框中的內容分表示運行時的進程情況。在java的啟動過程中,java服務庫的重點,它調用了本地的部分初始化,然后建立了java層的各個服務,在系統正常的運行過程中,這些服務是androidjava系統的公共部分和后臺部分。,9.1.2java系統的守護進程,Zygote是通過init進程讀取的init.rc啟動的一個守護進程的民稱,在init.rc中執行性內容的相關部分如下圖所示。,名稱Zygote的服務的執行者,實際上是/system/bin/app_process的可執行程序,后面的內容是app_process的執行參數。app_process的代碼路徑為frameworks/base/cmds/app_process,生成名稱為app_process的可執行程序,會連接libandroid_runtime.so動態庫,間接連接Dalvik虛擬機的libdvm.so庫調用Dalvik虛擬機。其中app_mian.cpp文件中的main()函數為可執行程序入口,主要的代碼片段如下:,9.1.2java系統的守護進程,其中的appruntime實際上是運行庫androidRuntime的繼承者,可以視為一個封裝類,app_process執行后,根據傳入的參數不同有兩條運行路徑。第一個分支:當命令具有zygote參數的時候,將進程的名稱設置為zygote然后調用java內部的類zygoteinit,完成java環境第一步啟動。,9.1.2java系統的守護進程,第二個分支,當命令程序沒有zygote參數的時候,將進程的名稱設置為第一個參數,然后根據類名啟動程序。App_process可執行程序作為zygote守護進程運行的時候,顯然調用的是第一個分支,根據參數的傳遞情況,其調用的是AppRuntime類的start()函數傳入的第一個參數為java的類名第二個參數為startsystemserver,根據命令行的參數,其數值為true,這個過程是在本地的進程中,利用androidruntime執行java的代碼。,9.1.3Zygoteinit類的執行,守護進程zygote運行后,ernal.os.Zygoteinit進入java環境中運行,Zygoteinit是一個java框架庫(framework.jar)中的內部類。ZygoteInit.java在farmeworks/base/core/java/com/android/internal/os目錄中,其中的main()是一個android系統正常啟動后執行的第一段java代碼。,初始化過程中,zygote守護進程調用ZygoteInit時,傳入的第一個參數為true,因此其中的startSystemServer()方法將會被執行。,9.1.3Zygoteinit類的執行,startSystemServer()方法中的核心內容如下所示:startSystemServer執行了zygote.forkSystemserver(),完成了一次進程的分裂,分裂出來的子進程執行了路徑為com.android.SystemServer的java類,這是java代碼中分裂另一個進程的方法,分裂出的進程就是系統服務器。它的名稱為system_server。進程分裂后,在父進程中,startsystemsrver()方法將返回,ZygoteInit的main方法中代碼將繼續向下執行,進入有runforkmode或者runselectloopmode()構建的循環(默認是后者)。執行到這個地方,zygote守護進程進入了循環,而分裂出來的第一個java進程-系統服務器(system_server)將完成后續的java層初始化工作。,9.1.4Zygoteinit類的執行-main方法,System_server進程運行的分類是com.android.SystemServer。這個類的內容在java服務庫(server.jar)當中,SystemServer執行過程中多次在java和本地直接切換,涉及的內容還包括libandroid_server.so和libsystem_server.so兩個本地庫。Java層入口:SystemServer類的main()方法SystemServer類是服務包的主入口,在systmesrver.java文件中是實現,代碼的路徑為:frameworks/base/service/java/com/android/server/,當這個類被調用后,執行其main()代碼。,System_server運行后加載了本地庫libandroid_server.so,然后執行其中的init1()函數,調用了本地的初始化內容,作為第一階段的初始化內容。,9.1.4Zygoteinit類的執行-本地接口init1(),Libandroid_server.so提供的是服務包的jni部分的支持,在java執行過程中,又執行了本地的調用,這種實現方式也就是在java系統的初始化過程中,插入了一段本地執行的內容,表示在特定的時機,完成部分本地初始化。Systemserver中執行的init1()本地方方法,在frameworks/base/service/jni目錄中的com_android_server_systemserver.cpp文件中,其中主要的內容如下:,這里實現了java中所需要的民稱為init1的本地調用,參數的內容沒有進行處理,而直接調用了本地的一個函數system_init()。,9.1.4Zygoteinit類的執行-system_init(),System_init()先完成本地的一些初始化,在調用java程序,最終進入循環,這個函數在libsystem_server.so庫中實現,代碼路徑為:frameworks/base/cmds/system_server/libary。System_init()首先執完成本地相關的初始化,其中如果設置了”system_init.startsufaceflinger”屬性為1,則啟動surfacefilnger服務,如果本地的mediapalyerservice等服務沒有初始化,在此處也將啟動。然后得到java的運行環境androidruntime,并調用com/android/server/systemserver類中的名稱為init2靜態方法。此時由本地程序調用systemserver類中的java部分,9.1.4Zygoteinit類的執行-system_init(),具體的系統實現中,如果有內容需要在java系統正式執行之前完成初始化,同樣可以將初始化的內容放置到libsystme_server.so的system_init()函數中。除此之外,frameworks/base/cmds/system_server目錄中的內容將生成一個名稱為system_server的可執行程序,它連接了libsystem_server.so庫并調試了system_init(),完成等同于正常初始化的流程。System_server可執行程序只用于測試,正常啟動中不執行。,9.1.4Zygoteinit類的執行-init2()方法,Systemserver類中的靜態方法init2()被本地調用后,system_server進程中的java代碼又再次被執行。Init2()方法如下所示:,這里調用了一個serverthread,它是一個java線程(thread)類的繼承者,在其中繼續完成后續的工作,實際上systemServer類當中的兩個靜態方法main()和init2()并無直接的調用關系,而是經過本地的間接調用。System_server進程的執行流程為:mian()=init1()=system_init()=int2()。兩端為java中的內容,中間為本地的內容。Systemserver類的init2()方法執行后會返回,之后system_server這個進程的主線程將運行位于libsystem_server.so中的system_init()最后的循環中。,9.1.4Zygoteinit類的執行-serverthread,Serverthread是systemserver.java文件中和systemserver平行的一個類。它是java線程類thread的繼承者,負責建立各個java子服務。Serverthread的核心內容是其中的run()方法,執行流程入下所示:,serverthread,的初始化工作完成后,自己調用Looper.loop()進入循環,這里啟動的各個服務都是系統核心的重要部分,其中很多服務均會建立線程的后臺運行。例如其中的幾個服務建立過程的片段如下,9.1.4Zygoteinit類的執行-serverthread,serverthread,的初始化工作完成后,自己調用Looper.loop()進入循環,這里啟動的各個服務都是系統核心的重要部分,其中很多服務均會建立線程的后臺運行。例如其中的幾個服務建立過程的片段ServerThread的初始化流程是:首先建立關鍵(critical)的服務,例如以上的ActivityManagerService等;再建立各個次要服務,例如InputMethodManagerServer、networkservice等,然后將調用很多服務中都具有的systemready()方法,等待每一個服務初始化完成。初始化完成后,serverthread才進入looper.loop()的循環。SystemServer中的服務(service)。有時候這些服務又被稱之為”anderoid服務”,區分于”本地服務”。他們的實現其實只是一個名詞,并無實現類型的限制。上面的powermanagerservice,就是一個IXX.stub的繼承者,因此通過servermanager將其加成服務;而activitymanagerservice則提供了靜態的main()方法來初始化,其實也是一個IXXX.stub的繼承者,在main()方法中建立自己的實例,并增加到ServerManager;Lightsservice則只是一個普通類,使用new建立實例即可。,9.1.4Zygoteinit類的執行-各個”服務”的執行,當系統初始化完成后,在android系統的正常運行狀態中,SystemServer進程中包含了多個線程,線程大部分是由system_server中的服務所建立的,用于執行每個服務當中的后臺工作。線程和使用system_server增加多少個服務(binder的繼承者)沒有任何關系,只有在代碼中構建了thread,才具有線程。在命令界面中執行pst可以查看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類的執行-各個”服務”的執行,(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類的執行-各個”服務”的執行,此處眾多的父進程id(PID)為system_server的id進程,實際上都是system_server中的線程,其中分成了各種不同的類型。HeapWorker、GC、SignalCatcher、JDWP、Compile幾個線程都是java環境所具有的,System_Server是java環境的進程,因此具有以上內容。SurfaceFilnger等是從本地system_init()中初始化過程中建立的本地線程,因此出現在交前的位置。Er.serverthread是用于啟動各個java服務的線程,也就是serverthread。在serverthread之后就是activitymanager、processstats、packaemanager和windowmanager等,則是各個java服務的線程。Java全局的系統服務器初始化完畢后,有其中的某些服務發送服務信號,各個應用程序的進程被啟動。,9.1.5java應用程序部分的啟動,Java應用程序部分的啟動原理是其中組件的調用,主要原因是java服務庫運行后發送的各個intent。消息的發送各個應用程序的啟動,一般都是由于系統服務器當中的activitymanagerservice在初始化完成后發送了某種特殊的消息,其中造成應用程序啟動的兩個原因是啟動了桌面(HOME)活動和發送了啟動結束(ACTION_BOOT_COMPLETED)廣播。Activitymanagerservice當中的starthomeactivitylocked()方法和桌面啟動有關系。而finishbooting()將在啟動結束的時候被調用,其核心思想是包含一個動作名稱為Intent.ACTION_BOOT_COMPLETED的intent發送廣播,因此各個應用程序包當中接受這個動作的BroadcastReceiver將有可能被運行。,9.1.5java應用程序部分的啟動,各個java應用程序包一般講成為一個獨立的進程運行,這些進程也是zygote的子進程,在這點上他們和system_server進程是相同的,因此,雖然應用程序進程和system_server在啟動上有因果關系,但是在運行時linux視他們為同一個進程的子進程,如果沒有特殊的情況下,所有的java進程都是zygote的子進程。各個java應用程序的啟動是通過app_process的第二個分支完成的,由于其中調用了set_process_name(),因此每個java應用程序的進程名稱通常就是他們的java包,在系統啟動完成后可以查看java命令進程情況,,8.1android的java本地調用,Jni,8.1android的java本地調用,Jni,9.1.5java應用程序部分的啟動,System_server和各個應用程序進程的父進程均為zygote,他們都是由zygote以類似的方式啟動起來的,系統不會立刻釋放每個應用程序包上下文運行,因此只需要一個應用程包中有組件運行過,他的進程就會立即存在。在系統初始化階段之后,雖然沒有主動運行某些應用,但是此時已經存在了一些各個應用進程,他是可能是由不同的方式被啟動的,由于某些包中的broadcastreceiver在接受了廣播后,得以運行,因此它們雖然運行完成但是應用程序進程依然存在,例如:com.android.lancher則作為桌面程序存在,他建立一些放置在桌面上的appwidet(窗口部件),因此實現這些窗口小部件的應用程序包就已經是啟動的進程了,有一些數據庫想關的應用程序包,需要在啟動后處理,因此其中的廣播接收器接收動作為ACTION_BOOT_COMPLETED的廣播,也已經被運行過了。,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訪問某些內容提供者;使用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版音樂五年級下冊第一單元 北國之聲(欣賞)《鴻雁》課件
- 兒科常見感染性疾病及護理
- 2025年電子商務師職業考試試卷及答案
- 2025年VR與AR技術應用工程師資格考試試卷及答案
- 2025年城市設計與景觀規劃能力測評試卷及答案
- 宴會廳燈光設備維護細則
- 2025年南通教練員從業資格證模擬考試題
- 中班健康:我的情緒小繪本
- 2025年廣東客運證模擬考試題庫及答案
- 法律行業合同法知識練習題集
- 2025杭州市臨安區事業單位招聘80人考前自測高頻考點模擬試題附答案詳解(鞏固)
- 護理服務質量提升路徑與實踐
- 江蘇省2025年中職職教高考文化統考數學試題答案
- 國有資產管理清查報告編寫指南
- 糞肥還田協議書范本
- 商務數據分析-形考作業4(第5章)-國開(ZJ)-參考資料
- 工勤技師考試試題及答案
- 2025年全國制冷與空調設備安裝修理作業證考試題庫(800題)含答案
- 2025四川雅安市名山區茗投產業集團有限公司招聘合同制員工38人筆試參考題庫附帶答案詳解
- Unit 1 Animal Friends Reading Plus教學設計-2024-2025學年人教版英語七年級下冊
- 腹膜透析患者隨訪的管理
評論
0/150
提交評論