哈嘍大家好,我是Zzz. 給大家分享一篇Framework入門的基礎(chǔ)知識文章,內(nèi)容純純原創(chuàng)。
一、Application,Activity和進程的關(guān)系?
? ? Application、Activity只是進程虛擬機運行的一個類對象,只是屬于系統(tǒng)的一個組件和進程沒有直接聯(lián)系。Android支持為每個組件可以單獨進程方式運行。
? ? ? ?一個Application就是單獨的一個進程這個說法是不對的,Application、Activity只是運行程序中的一個普通的類并不代表一個單獨的進程,進程是運行起來的一個程序。
二、Android系統(tǒng)進程間的相互關(guān)系
?一個Application或者展示Activity的進程運行在Android系統(tǒng)中需要那些東西進行服務(wù)?
Zygote進程:負責(zé)孵化之后服務(wù)和應(yīng)用的進程(孵化進程)是所有系統(tǒng)進程的父進程由Zygote來孵化各種進程;
System_server進程:是系統(tǒng)核心服務(wù)的一個進程,這個進程包含了系統(tǒng)中核心Service的運行,給系統(tǒng)提供如:Window的管理、Activity的管理,系統(tǒng)的核心功能都在System_server中;
SurfaceFlinger進程:主要跟驅(qū)動層、硬件層進行交互,使屏幕進行繪制,如App進程產(chǎn)生的界面由SurfaceFlinger進行的繪制;
ServiceManager進程:App開發(fā)中用的getService()就是在和ServiceManager進行交互,這個進程就是保存了一個類似于HashMap,保存了System_server中一些核心服務(wù)把服務(wù)中的引用交給ServiceManager使得我們的App進程向ServiceManager要需要的服務(wù);
每一個進程直接各自都是相互獨立的他們之間的通信或控制只能通過跨進程通信的方式進行交互;除了Linux中Socket、共享內(nèi)存、管道等一些方式Android特別的通信方式為Binder通信,底層實現(xiàn)是通過系統(tǒng)調(diào)用和底層驅(qū)動層進行實現(xiàn)。
SurfaceFlinger中包括匿名共享內(nèi)存,因為binder通信是由內(nèi)存大小限制的由于SurfaceFlinger要顯示一個界面是一個巨大的圖片占用的內(nèi)存比較多這個時候就需要用到匿名共享內(nèi)存;
三、哪些代碼是運行在App進程的、哪些又是運行在System_server進程的?
1、除了自己寫的業(yè)務(wù)代碼,一般Android SDK里面的代碼都是運行在App進程的,sdk里面是android.jar(在sdk下的platfroms/android-*/)也就是編譯出的framework.jar,因為app需要依賴sdk才可以編譯通過,說明各個app肯定會使用sdk中的代碼,這個代碼屬于所有app共用的,故修改一個類就會影響所有的應(yīng)用進程;
2、一般com.system.server.*相關(guān)的類都是運行在system_server,這一部分平時是接觸不到的,由于普通應(yīng)用根本無法引入相關(guān)的server代碼,因此這次代碼屬于system_server特殊應(yīng)用自己的代碼,普通應(yīng)用只能通過跨進程通信的方式與其通信獲取相關(guān)數(shù)據(jù)及接收控制,一般java代碼對應(yīng)的是services.jar;
四、主要jar包介紹
Android源碼編譯之后會有很多文件,在源碼路徑out/target/product/generic_x86_64/system/framework/文件下
1、framework-res.apk----》android系統(tǒng)資源庫(如圖片、布局、dialog、主題、控件都在這里)
2、framework.jar-----》Android的sdk中核心代碼
3、services.jar-----》框架層服務(wù)端的編譯后jar包
五、面對實際項目需求到底該修改那一塊的代碼呢?修改原則是什么?
需要具體分析需求,按以下幾步的優(yōu)先級進行:
1、明確業(yè)務(wù)需求,分析業(yè)務(wù)是否可以應(yīng)用層面(即App的業(yè)務(wù)代碼)通過標準接口實現(xiàn),如果是真實的項目又同時要考慮到是否這個App可能被其他的第三方應(yīng)用替代,或者卸載等;
2、如果業(yè)務(wù)代碼無法通過標準接口實現(xiàn),則在考慮應(yīng)用程序的框架修改是否可以實現(xiàn),也就是android sdk部分,即framework.jar,要考慮該部分代碼是運行于所有的app,要考慮功耗影響及穩(wěn)定性,盡量把修改面變小,不可修改sdk的標準接口,只能考慮新加,但是接口的具體實現(xiàn)可以根據(jù)情況改變,修改錯誤可可能黑屏;
3、framework.jar部分的框架也無法滿足時候,就需要考慮System_server中去修改相關(guān)的Service等是否可以滿足,這一部分更需要謹慎修改,一不小心很可能導(dǎo)致系統(tǒng)無法啟動黑屏;文章來源:http://www.zghlxwxcb.cn/news/detail-843043.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-843043.html
到了這里,關(guān)于Android Framework基礎(chǔ)知識的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!