android成員變數
『壹』 Android之Binder通信篇
Binder跨進程通信的本質是依賴內核驅動將屬於不同Binder進程的數據,從原始進程復制到目標進程,這樣就完成了跨進程通信了。
Binder通過獨特的內存映射機制,在跨進程通信時,可以做到一次拷貝,兩個空間同時使用!如下圖:
Binder跨進程通信是要傳遞數據的,既然有數據必然要佔用內存空間,Android系統規定每一個進程都有一塊Binder內存區,也就是圖1中的 共享內存 ,系統最多隻能給該區域分配4M的物理內存,由於申請這塊內存是通過系統的mmap函數完成的,所以整個映射機制又被稱為mmap機制
為了把這部分說明白,就再盜圖一張,命名圖2吧!
對於Binder驅動,通過 binder_procs 鏈表記錄所有創建的 binder_proc 結構體,binder 驅動層的每一個 binder_proc 結構體都與用戶空間的一個用於 binder 通信的進程一一對應,且每個進程有且只有一個 ProcessState 對象,這是通過單例模式來保證的。在每個進程中可以有很多個線程,每個線程對應一個 IPCThreadState 對象,IPCThreadState 對象也是單例模式,即一個線程對應一個 IPCThreadState 對象,在 Binder 驅動層也有與之相對應的結構,那就是 Binder_thread 結構體。在 binder_proc 結構體中通過成員變數 rb_root threads,來記錄當前進程內所有的 binder_thread。
Binder 線程池:每個 Server 進程在啟動時創建一個 binder 線程池,並向其中注冊一個 Binder 線程;之後 Server 進程也可以向 binder 線程池注冊新的線程,或者 Binder 驅動在探測到沒有空閑 binder 線程時主動向 Server 進程注冊新的的 binder 線程。對於一個 Server 進程有一個最大 Binder 線程數限制,默認為16個 binder 線程,例如 Android 的 system_server 進程就存在16個線程。對於所有 Client 端進程的 binder 請求都是交由 Server 端進程的 binder 線程來處理的。
『貳』 09 Android包管理機制-綜述
PackageManagerService(簡稱PKMS),是Android系統中核心服務之一,管理著所有跟package相關的工作,常見的比如安裝、卸載應用。 PKMS服務也是通過binder進行通信,IPackageManager.aidl由工具轉換後自動生成binder的服務端IPackageManager.Stub和客戶端IPackageManager.Stub.Proxy,具體關系如圖:
Android系統啟動過祥液程中,一路啟動到SystemServer後,便可以啟動framework的各大服務,本文將介紹PKMS的啟動過程
PKMS職責
PackageParser定了相當多的內部類,這些內部類的作用就是保存對應的信息。解析AndroidManifest.xml文件得到的信息由Package保存。從該類的成員變數可看出,和Android四大組件相關的信息分別由activites、receivers、providers、services保存。由於一個APK可凱宴則聲明多個組件,因此activites和receivers等均聲明為ArrayList
Android系統有很多目錄可以存放app,如下所示:
AIDL (Android Interface Definition Language), Android介面定義語言,Android提盯棚供的IPC (Inter Process Communication,進程間通信)的一種獨特實現。 這個階段處理.aidl文件,生成對應的java介面文件。
通過Java Compiler編譯R.java、Java介面文件、Java源文件,生成.class文件。
通過dex命令,將.class文件和第三方庫中的.class文件處理生成classes.dex。
將classes.dex、resources.arsc、res文件夾(res/raw資源被原裝不動地打包進APK之外,其它的資源都會被編譯或者處理)、Other Resources(assets文件夾)、AndroidManifest.xml打包成apk文件。 注意: res/raw和assets的相同點:
對apk進行簽名,可以進行Debug和Release 簽名。
release mode 下使用 aipalign進行align,即對簽名後的apk進行對齊處理。 Zipalign是一個android平台上整理APK文件的工具,它對apk中未壓縮的數據進行4位元組對齊,對齊後就可以使用mmap函數讀取文件,可以像讀取內存一樣對普通文件進行操作。如果沒有4位元組對齊,就必須顯式的讀取,這樣比較緩慢並且會耗費額外的內存。 在 Android SDK 中包含一個名為 「zipalign」 的工具,它能夠對打包後的 app 進行優化。 其位於 SDK 的 build-tools 目錄下, 例如: D:DevelopAndroidsdkuild-tools23.0.2zipalign.exe
·