《Android進階解密》讀後筆記

於2019年夏季閱讀,主要基於系統源碼,講解Android一些常用的技術原理,對Android體系整體瞭解以及四大組件啓動原理,虛擬機原理,熱修復,插件化,內存優化等知識有了新的的認識。

第一章 Android系統架構

  • 應用層,應用框架層(提供開發所需的API),系統運行庫及C++庫(運行庫包括ART虛擬機,java核心庫),硬件抽象層(隱藏了特定平臺的硬件接口細節,爲操作系統提供虛擬硬件平臺,使其具有硬件無關性),Linux內核層
  • 源碼下載地址:http://pan.baidu.com/s/lngsZs
  • 源碼整體架構:packages 存放應用程序包

第二章 系統啓動

  • init進程啓動:當按下電源鍵時,固化代碼加載Bootloader,Bootloader又啓動Linux內核,內核加載完第一件事就是啓動init進程
  • init進程主要:1.創建和掛載啓動所需的文件 2.初始化和啓動屬性服務 3.啓動init.rc配置文件並啓動Zygote進程
  • 關於zygote進程:在Android系統中,ART,應用程序進程,以及運行系統的關鍵服務SystemServer進程都由zygote進程來創建的(通過fork的形式進行創建),將他稱爲孵化器進程。由於zygote進程啓動時會創建DVM或者ART,因此通過fork而創建的進程可以在內部獲取一個ART實例副本;同時zygote進程創建服務端socket,等待AMS(ActivityManagerService)的請求來創建新的應用程序進程;以及zygote進程創建Java虛擬機併爲java虛擬機註冊JNI方法,通過JNI調用zygoteInit的Main方法進入zygote的java框架層
  • SystemServer進程被創建後:1.啓動Binder線程池,這樣就可以和其他進程進行通信 2.啓動SystemServiceManager,其用於對系統的服務進行啓動和生命週期管理 3.啓動各種系統服務
  • 最後,launcher(桌面)被AMS啓動後會將已安裝應用的快捷圖標顯示到桌面上

第三章 應用程序進程的啓動過程

  • AMS發送啓動應用程序的請求,zygote接收到請求並創建應用程序進程,其中通過反射獲得ActivityThread類並調用Main方法,這樣應用程序創建完了並且運行了主線程的管理類
  • 應用程序啓動的過程中會啓動Binder線程池,ActivityThread Main方法被調用後創建主線程消息循環looper,這樣可以使用消息處理機制

第四章 四大組件的啓動過程

  • Activity的啓動過程:launcher進程向AMS請求創建根Activity,AMS判斷應用程序進程是否存在,存在則通過ApplicationThread創建根Activity,不存在則通過zygote先創建應用程序進程
  • 其他組件啓動類似

第五章 上下文Context

  • context是應用程序環境信息的接口,使用場景分別是:1.使用context調用方法,如:啓動Activity,訪問資源等 2.調用方法時注入context
  • Activity,Service,Application都間接地繼承自context,context是一個抽象類,它的內部定義了很多方法,以及靜態變量,它的具體實現類:ContextImpl

第七章 理解ActivityManagerService

  • WindowManager管理window(view),通過調用WMS中的方法進行處理,這種關係類似於AMS,ActivityManager與Activity

第九章 JNI原理

  • JNI是Java本地接口,是Java與其他語言通信的橋樑,Native方法註冊有:靜態註冊(即Java的Native方法通過指針來與JNI進行關聯)和動態註冊
  • JNIEnv是Native世界中Java環境的代表,通過JNIEnv指針就可以在Native世界中訪問Java世界中的代碼進行操作,它只在創建它的線程中有效
  • JNI引用類型 1.本地引用:JNIEnv提供的函數所返回的引用基本上都是本地引用,當Native函數返回時本地引用自動釋放 2.全局引用:在Native函數返回時不會自動釋放,因此需要手動釋放,不受JVM管理 3.弱全局引用可以被gc回收

第十章 Java虛擬機

  • Java虛擬機上能運行的程序與語言無關,無論任何語言只要能編譯成class文件就可以被Java虛擬機識別並運行
  • Java虛擬機的啓動就是通過引導類加載器創建一個初始類來完成,類加載器是使用平臺相關的底層C/C++語言實現
  • Java的內存區域分別爲:程序計數器,Java虛擬機棧,本地方法棧,Java堆和方法區;如果線程請求分配的棧容量超過Java虛擬機所允許的最大容量,Java虛擬機會拋出StackOverflowError;如果java虛擬機可以動態擴容,但是擴展時無法申請到足夠的內存則會拋出OutOfMemoryError異常
  • gc主要兩個工作:1.內存的劃分和分配 2.對垃圾進行回收;gc主要採用分代回收算法回收垃圾,Java堆作爲gc主要管理的區域,被細分爲新生代和老年代
  • Java對象在虛擬機中的生命週期:1.創建階段 2.應用階段 3.不可見階段 4.不可達階段 5.收集階段 6.終結階段 7.對象空間重新分配階段
  • 垃圾收集算法:1.標記——清楚算法 2.複製算法(把內存空間劃分爲兩個相等的區域,每次只使用一個區域,在收集時遍歷使用區域,把存活複製到另一個區域,最後將當前使用的區域可回收的對象進行回收)

第十二章 ClassLoader類加載器

  • 類加載器查找class文件採用的是雙親委託模式(首先判斷該class是否已經加載,如果沒有則不是自身去查找而是委託給父加載器進行查找,這樣依次遞歸,直到委託到頂層的Bootstrap ClassLoader,如果Bootstrap class找到了就返回,沒有找到,則繼續依次向下查找,如果還沒有找到則會交由自身去查找)
  • Android中的ClassLoader也是採用雙親委託模式查找class,不同的是它們加載的不再是class或jar文件,而是dex文件

第十三章 熱修復原理

  • 熱修復主要有:代碼修復,資源修復,so修復;多種熱修復框架參考了InstantRun的資源修復原理,InstantRun並不是Android源碼,需要反編譯獲取
  • InstantRun 資源熱修復主要有連個步驟:1.創建新的AssetManager,通過反射調用addAsserPath方法加載外部資源,這樣新建的AssetManager就含有了外部資源 2.將AssetManager類型的mAssets字段的引用全部替換爲新創建的AssetManager
  • 代碼修復主要有類加載方案,底層替換方案,InstantRun方案。1.類加載方案基於dex分包方案,類加載方案需要重新啓動APP後讓ClassLoader重新加載新的類,重啓的原因是類是無法被卸載的,通過修改Element數組使加載新的dex;2.底層替換方案:替換ArtMethod結構體中的字段或者整個ArtMethod結構體,直接替換方法,可以做到立即生效不需要重啓;3.可以借鑑InstantantRun的ASM,ASM是一個Java字節碼操作框架,能夠動態生成類或者增強現有類的功能,ASM可以直接產生class文件,也可以在類加載到虛擬機之前動態改變類的行爲
  • So修復方案:1.將so補丁插入到NativelibraryElement數組的前部,讓So補丁的路徑先被返回和加載 2.調用System的load方法來接管So的加載入口

第十四章 Hook技術

  • Hook可以是一個方法或者一個對象,它像一個鉤子一樣掛在對象A和對象B之間,當對象A調用對象B之前做一些處理(比如修改方法的參數和返回值)起到欺上瞞下的作用,與其說Hook是鉤子,不如說劫持更貼切些
  • Hook技術的分類:1.Hook Java 主要通過反射和代理來實現,應用於SDK開發環境中修改Java代碼 2.Hook Native應用於NDK開發環境中修改Native代碼 3.通過反射和代理實現,只能Hook當前的應用程序進程,通過Hook框架來實現,比如Xposed,可以實現全局Hook,但是需要root
  • 代理模式也叫委託模式,爲其他對象提供一種代理可以控制對這個對象的訪問,動態代理則是在代碼運行時通過反射動態生成代理類的對象,並確定到底代理誰。

第十五章 插件化原理

  • 熱修復技術,插件化技術都屬於動態加載技術(動態加載一些程序中原本不存在的可執行文件並運行這些文件裏的代碼邏輯,其中熱修復技術主要用來修復Bug,插件化技術用於解決應用越來越龐大以及功能模塊的解耦)
  • 插件化的客戶端由宿主和插件兩個部分組成,宿主指安裝到手機中的apk,插件一般是指經過處理過的apk,so,dex文件等,插件可被宿主加載;插件化的定義:將一個應用按照插件進行改造的過程就叫插件化
  • 四大組件是插件化技術的核心知識點,主流的插件化多采用Hook技術實現
  • 啓動插件Activity的原理:主要的方案是先在AndroidMainfest.xml文件中註冊的Activity佔坑,用來通過AMS校驗,接着用插件化Activity替換佔坑的Activity
  • Service的插件化的要點是保證它的優先級,當啓動插件Service時就會先啓動代理Service,當這個代理Service運行起來之後,在它的OnStartCommand等方法中進行分發,執行插件TargetService的OnCreate等方法

第十六章 繪製優化

  • 繪製原理:View的繪製流程有3個步驟,分別是:measure,layout,draw,它們主要運行在系統的應用框架層,而真正將數據渲染到屏幕上的是系統Nativie層的SurfaceFlings服務來完成的;Android系統每隔16ms發出VSYNS信號,觸發對UI進行渲染,如果每次都成功,就能夠達到流程的畫面所需要的60fps,VSYNC是一種定時中斷,一旦受到VSYNC信號,CPU就開始處理各種幀數據,如果某個操作超過16ms則無法正常渲染,會發生丟幀
  • Profile GPU Rendering 在開發者中打開,顯示應用渲染的情況,Systrace是性能數據採樣和分析工具;TraceView是Android SDK中自帶的數據採集分析工具
  • 佈局優化工具:Hierarchy viewer用來檢查佈局嵌套和繪製的時間,Android Lint進行靜態檢查
  • 佈局優化方法:1.合理運用佈局 2.Include 3.Merger去除多餘的曾經 4.使用ViewStub提高加載速度 5.避免CPU過度繪製

第十七章 內存優化

  • 內存監視工具:1.Mermory Monitor 2.Allocation Tracker(顯示對象類型,大小,時間)3.Heep Dump 查看不同數據類型在內存中的使用情況 4.內存泄漏分析:Mat,LeakCanary
  • 頻繁多次打開關閉界面觀察內存變化
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章