Android 如何從應用深入到Framework(三)

2022-01-02 程式設計師入門進階

讚賞,轉發,都是大愛

Android 如何從應用深入到Framework (二)

Android 如何從應用深入到Framework (一)

先回答留言提出的問題,當前在做應用開發,想做framework,該如何實施。

我們先來講下framework是什麼。這個單詞的意思為框架,什麼框架呢?我們一個APK由哪些組成呢?

xml配置組件,如何解析這個xml,組件的類別具體如何實現,比如activity生命周期,service啟動過程,廣播的處理流程,前臺廣播,後臺廣播,ANR怎麼產生的,系統怎麼處理的。這些都是系統提供的,這種應用開發,無法繞過的,調用系統方法的這些內容,就是框架。

我們開發應用,主要是用系統接口開發。系統framework的任務是完成系統故障處理,同時擴展功能接口,讓應用調用更多的接口,這塊就是framework要做的事情。

主體框架需要掌握的內容:

1 應用啟動流程

2 應用創建過程,知道fork原理,知道socket通信

3 廣播處理流程,超時響應,系統如何跟應用交互,applicationhandle activitytherad 的關鍵代碼

4 anr是什麼,系統代碼在哪

5 Lmk機制是什麼,怎麼計算的adj,怎麼殺掉進程

6 按鍵處理inputreader,觸屏響應在哪,系統phonewindowmanager的邏輯代碼

7 系統服務對應的jni邏輯,因為要進入linux,必然就變成了本地語言,這塊要學習

8 View的繪製流程,事件傳遞過程,掌握viewrootimpl和window的關聯,和phonewindow的關係

暫時就想到這些,art虛擬機學習,掌握理論就行,懂得它的運行機制,內存管理方案

後續還要繼續深造,就去看驅動添加,系統加載驅動的方式。這裡面涉及了hal 添加,以及linux的哲學,一切都是文件

看驅動,就會發現很多中斷,比如按鍵,觸摸,都是以中斷的方式響應,系統收到中斷,跑到註冊的中斷向量表,查出此中斷位對應的方法回調,按鍵響應方法,拿到按鍵信息,封裝好後,通過sendevent發出去,然後我們的inputreader接到,然後InputDispatcher解析,傳給當前的fouse焦點窗口,然後經過viewRootImpl進行交給當前的跟view,向我們的子view傳遞,進行處理,響應。

  android 窗口繪製的一些總結

好了,回到上節問題,繼續來講,程式語言的發展史。

起初,只有打孔紙片,通過它的阻擋光線傳輸,來做到零和一的區分,然後推動硬體執行。如果有個地方錯了,那就重新打孔,很費紙,這點倒是和宅男很像。

打孔是個技術活,要有超強的記憶,00100是加,01100是減,這些口訣都埋藏在心底,傳男不傳女,神秘莫測。於是就很晦澀,像手抄版的書籍,流傳在一小眾手裡,別人如同天書一般,不懂其中真意。

於是,有好事者一看,就拿出來做了個解碼,記錄下來每個序列的真正含義,後來人一看便懂,發現沒有那麼多玄機。

於是

00100 就記作add

01100就記作sub

等等一系列的記錄出來了,而這個記錄最終要回到那些數字,否則機器不懂你這高級語言。

這裡00100就是機器語言,機器執行用的這個,我們寫的時候,add sub替代,這個就是彙編語言了。

彙編語言變成機器語言用了彙編器,將我們描述的可以理解的東西變成機器可以懂的語言。

彙編語言最頭疼的是,我一個函數修改完了,下次修改後,如果寫了好長,我之前寫的跳轉指令,有可能需要從jmp near換成jmp long ,代碼要去修改,寫錯了一出代碼,有可能要全部修正,寫的真累,堆棧都要自己關注。

於是就出現了c語言,解決那些晦澀的前期準備,讓編譯器幫你處理,你只安心的寫自己的代碼,不需關注堆棧平衡,不需關注具體會變成什麼機器語言,這時我們使用arm編譯器就會將此源碼變成arm的彙編語言,然後轉成機器語言,跑在arm板子上。如果我們選擇gcc,編譯linux的elf文件,那麼就在linux可以運行啦。

我們發現這個c可以只寫一份,選擇不同的編譯器,就能編到對應的指令設備中運行。比之前一個個去寫,效率太高了。

c語言太過經典,直接可以嵌入彙編,來完成硬體驅動程序,c裡面存在的都是方法,我們將一個個變量變成結構體來做個整體,但是沒有將方法也歸進來,導致方法和屬性分離,不便於理解。

於是c++出來了類的概念,將屬性和擁有的方法整在一起,作為一個整體出現,對外人來說,一目了然,都有什麼,都可以幹什麼,清清楚楚。

c c++一直一來自己管理內存,於是內存洩露問題太嚴重,嵌入式系統上面,時不時就掛掉了,很是鬱悶,問題出現也不好解決,很難定位,於是就有人琢磨,可不可以自動標記,自動決策釋放內存,讓用戶別在意這個,專心寫代碼。

於是Java就來了。Java搞出來一個標準,在每個平臺都開發出來,讓它寫出來的東西,在每個平臺都能得到解析,正確運行,於是便號稱跨平臺了。實質上是他們在每個平臺做了適配,讓他的東西跑在他們適配好的環境上,即可。

Java語言,是需要編譯成class才能運行。那麼就有人說,我不想編譯,就想寫的直接用,直接改,直接運行多爽。

於是shell perl python就出來了。他們充當了解析器,把語法解析後運行,shell perl以其自由散漫著稱,不是自己寫的,很難讀懂。語法自由,用法多變,格式也比較自由,寫的人暢快淋漓,讀的人淚如雨下。

於是python橫空出世,加入了強制對齊,類的概念進來,讓無組織紀律的腳本語言,能夠走的更加規整一些。

-未完,待續-

相關焦點

  • 如何調試 Android Framework?
    但其實,要深入理解某個軟體、框架或者系統的工作原理,僅僅「看」代碼是遠遠不夠的。就拿Android Framework來說,整個代碼量非常大不說,那些個動輒幾萬行的類如何去理解?所以我今天要說的就是:Debug the fucking source code!!之前分享過一個答案:大家遇到過什麼 Android 兼容性問題?
  • Android從入門到進階之:調試方法
    從圖中你可以看到主要有以下幾部分組成:我們在各個應用市場看到的,大多是第三方應用,也就是安裝在data區域的應用,它們可以卸載,並且權限也受到一些限制,比如不能直接設置時間日期,需要調用到系統應用設置裡面再進行操作。
  • Android進程管理:Framework層概念
    它們拉起進程的方式都是一致的,基本流程:Zygote進程啟動,初始化虛擬機及基本環境,同時進入一個無限循環,提供創建 java 進程服務AMS 通過調用 Process.start() 方法,發送 socket 信息到 Zygote 進程Zygote 進程處理消息,並通過fork創建應用進程應用進程反射調用 ActivityThread.main 方法,進入自身邏輯 (初始化
  • 如何反編譯Android 5.0 framework
    層對應的原生模塊代碼來達到他們自己的目的,這就給應用層的開發人員帶來了讓他們很頭疼的適配問題,嚴重會導致Crash等問題。為了更好的適配,我們不得不對framework層進行反編譯,在Android更新到5.0後,開發人員對framework的反編譯也出現了新的變化。
  • Android Binder—APP->framework(mRemote的前世今生)
    方案設計:Binder通信涉及APP層,framework層,Kernel層,雖然涉及的東西比較雜,但是都是代碼實現的,既然如此,我們都可以通過增加調試Log信息來跟蹤這個流程,本文的思路就是如此;為了更好的理解 Binder 通信過程,你最好有一套完整的 Android 源碼,再配上一個代碼搜索神器 OpenGrok,如果你沒有 android源碼,不想自己搭建 OpenGrok
  • Android三方應用實現靜默安裝
    App的靜默安裝和卸載 Android系統本身提供了安裝卸載功能,但是api接口是@hide的,不是公開的接口,所以在應用級別是無法實現靜默安裝和卸載的,要實現靜默安裝和卸載需要是系統應用,要有系統籤名和相應的權限。
  • 如何方便的查看 Android Native 源碼
    我們在編譯階段來一起看下,怎麼處理。make -j8Android平臺提供了三個命令用於編譯,它們分別是make、mmm和mmmake 用於編譯整個系統,時間比較長,make xxx:用於編譯某個模塊,比如編譯framework。
  • 【Framework】速通 Android AOSP基礎
    環境搭建流程基本是一致的,遇到問題善用搜尋引擎~Android Open Source Package,安卓系統開源源碼包,Android移動終端平臺 (高通、MTK等) 先基於原生的Android代碼進行更改,形成自己的平臺代碼,其他手機廠商再根據平臺代碼提供自己的移動端解決方案 (系統定製)。
  • Android深入四大組件(一)應用程式啟動過程
    分析應用程式的啟動過程其實就是分析根Activity的啟動過程。1.Launcher請求ActivityManageService在 Android系統啟動流程(四)Launcher啟動過程與系統啟動流程這篇文章我講過Launcher啟動後會將已安裝應用程式的快捷圖標顯示到界面上,當我們點擊應用程式的快捷圖標時就會調用Launcher的startActivitySafely方法,如下所示。
  • 深入理解 flutter 的編譯原理與優化
    它是用什麼語言編寫的,包含哪幾部分,是如何被編譯,運行到設備上的呢?Flutter 如何做到 Debug 模式 Hot Reload 快速生效變更,Release 模式原生體驗的呢?Flutter 工程和我們的 Android/iOS 工程有何差別,關係如何,又是如何嵌入 Android/iOS 的呢?Flutter 的渲染和事件傳遞機制如何工作?Flutter 支持熱更新嗎?
  • 吹爆系列:深入實戰Android卡頓優化
    吹爆系列:深入探索Android卡頓優化主要介紹:本篇,為深入探索Android卡頓優化的下篇。ANR執行流程首先,我們的應用發生了ANR。然後,我們的進程就會接收到異常終止信息,並開始寫入進程ANR信息,也就是當時應用的場景信息,它包含了應用所有的堆棧信息、CPU、IO等使用的情況。
  • 了解一下,Android 10中的ART虛擬機(2)
    在我寫《深入了理解Android Java虛擬機ART》一書的時候,我最早也是先研究的dex2oat,稿子都寫了100多頁了,但數月過後就是無法拿下,所以只能放下它,轉而去研究ART Runtime。這是我寫深入理解Android 4本書來第一次碰到這種挫折。所以,書中dex2oat的字節碼到機器碼的編譯部分在第六章,但dex2oat的源碼分析卻在第九章。
  • 音視頻開發之旅(57) -如何方便的查看AndroidNative源碼
    make -j8Android平臺提供了三個命令用於編譯,它們分別是make、mmm和mmmake 用於編譯整個系統,時間比較長,make xxx:用於編譯某個模塊,比如編譯framework。make framework即可mmm xxx:用於編譯指定目錄下的模塊,不會編譯它依賴的模塊mm xxx: 該命令和mmm差不多,區別在於它會先cd到xxx目錄然後在編譯。在具體的編譯中遇到了很多問題,匯總如下。
  • 深入探索 Android 電量優化
    在 Android 應用開發中,我們需要考慮的是如何優化電量使用,讓我們的 App 不會因為電量消耗過高被用戶排斥,或者被其他安全應用報告,以此確保用戶黏性。2、電量重視度不夠開發中一直連接手機,不知道電量消耗有多快。
  • Android 安裝包 APK 是如何生成的
    aidl -Iaidl -pAndroid/Sdk/platforms/android-29/framework.aidl -obuild aidl/com/android/vending/billing/IInAppBillingService.aidl-I 指定 import 語句的搜索路徑,注意 -I 與目錄之間一定不要有空格-p 指定系統類的
  • 使用 Go 進行 iOS 和 Android 編程
    Android構建一個 Android 的 APK 包gomobile build -target=android golang.org/x/mobile/example/basic部署到設備上gomobile install golang.org/x
  • Android 項目部署之Nexus私服搭建和應用
    2.同時有多個項目在開發的時候,一些共用基礎模塊可以單獨抽取到nexus上,需要用的項目直接從nexus上拉取就行(基礎模塊的實現,維護和部署可以交給專門的人員,其他項目不用關心代碼實現,這樣也可以達到保證核心代碼不洩露).
  • 深入理解Android音頻框架AudioTrack到AudioFlinger及Mix過程
    Audio主要包括如下部分:Audio Application Framework:音頻應用框架AudioTrack:負責回放數據的輸出,屬 Android 應用框架 API 類AudioRecord:負責錄音數據的採集,屬 Android 應用框架 API 類AudioSystem: 負責音頻事務的綜合管理,屬 Android 應用框架 API
  • android Apk打包過程概述_android是如何打包apk的
    【輸入】源碼文件、aidl文件、framework.aidl文件【工具】aidl工具【輸出】對應的.java文件對於沒有使用到aidl的android工程,這一步可以跳過。aidl工具解析接口定義文件並生成相應的java代碼供程序調用。第三步:編譯工程原始碼,生成下相應的class文件。
  • 測試Android應用程式的逆向方法和尋找攻擊面的技巧
    Android 架構在Android架構中有5個層:應用程式,應用程式框架,庫,運行時環境和Linux內核層。應用程式層包含由用戶安裝的本機應用和第三方應用。應用程式框架層提供管理和控制應用程式層的服務,包括4個組件:活動,內容,服務,通知和廣播。庫層控制和訪問應用程式數據。