安卓逆向_5 --- Android 学习
?
Android 之 四大組件、六大布局、五大存儲:https://blog.csdn.net/freeking101/article/details/105377197
?
安卓(Android)動態創建多個按鈕并添加監聽事件:https://www.jb51.net/article/88036.htm
安卓按鈕添加監聽的三種方法:https://www.cnblogs.com/linfenghp/p/5373754.html
?
?
Android系統框架簡介
?
嗶哩嗶哩:https://www.bilibili.com/video/BV1UE411A7rW?p=21
?
?
Android開發入門教程:7天玩轉安卓APP開發
?
http://c.biancheng.net/android/
?
?
Android 教程
?
https://www.runoob.com/android/android-tutorial.html
?
https://www.runoob.com/w3cnote/android-tutorial-intro.html
?
?
黑馬程序員
?
http://yun.itheima.com/course/c57.html
?
?
慕課
?
https://www.imooc.com/search/?type=course&words=Android
?
?
1.Dex加載流程:(安卓源代碼)
Davlivk虛擬機加載dex文件
Java層 Dex 加載流程:BootClassLoader ---> PathClassLoader ----> DexClassLoader
Native層 Dex 加載流程:libdvm.so (重編譯 system.img)---> OpenDexFileNative
?
?
Android Application 啟動流程分析(?點擊圖標,APP加載流程 )
?
From:https://www.jianshu.com/p/a5532ecc8377
譯者注:
原文分成兩個部分, 鏈接如下:
http://multi-core-dump.blogspot.com/2010/04/android-application-launch.html
http://multi-core-dump.blogspot.com/2010/04/android-application-launch-part-2.html
本文合二為一, 章節標題由譯者加注.
?
?
1、App 基礎理論
?
要想優化 App 啟動時間,第一步就是了解 App 啟動進程的工作原理。?有幾個基礎理論:
Android Application 與其他移動平臺有兩個重大不同點:
Android Application組件包括:
- Activities: 前臺界面, 直接面向User, 提供UI和操作.
- Services: 后臺任務.
- Broadcast Receivers: 廣播接收者.
- Contexnt Providers: 數據提供者.
Android進程與Linux進程一樣。默認情況下,每個 apk 運行在自己的 Linux 進程中。?另外,默認一個進程里面只有一個線程---主線程。這個主線程中有一個 Looper 實例,通過調用 Looper.loop() 從 Message隊列里面取出 Message 來做相應的處理。
那么,這個進程何時啟動的呢?
簡單的說,進程在其需要的時候被啟動。任意時候,當用戶或者其他組件調取你的 apk 中的任意組件時,如果你的 apk 沒有運行,系統會為其創建一個新的進程并啟動。通常,這個進程會持續運行直到被系統殺死。關鍵是:進程是在被需要的時候才創建的。
舉個例子,如果你點擊 email 中的超鏈接,會在瀏覽器里面打開一個網頁。Email App 和 瀏覽器App 是兩個不同的App,運行在不同的進程中。這次點擊事件促使 Android 系統去創建了一個新的進程來實例化瀏覽器的組件。
首先, 讓我們快速看下Android啟動流程. 與眾多基于Linux內核的系統類似, 啟動系統時, bootloader啟動內核和init進程. init進程分裂出更多名為"daemons(守護進程)"的底層的Linux進程, 諸如android debug deamon, USB deamon等. 這些守護進程處理底層硬件相關的接口.
隨后, init進程會啟動一個非常有意思的進程---"Zygote". 顧名思義, 這是一個Android平臺的非常基礎的進程. 這個進程初始化了第一個VM, 并且預加載了framework和眾多App所需要的通用資源. 然后它開啟一個Socket接口來監聽請求, 根據請求孵化出新的VM來管理新的App進程. 一旦收到新的請求, Zygote會基于自身預先加載的VM來孵化出一個新的VM創建一個新的進程.
啟動Zygote之后, init進程會啟動runtime進程. Zygote會孵化出一個超級管理進程---System Server. SystemServer會啟動所有系統核心服務, 例如Activity Manager Service, 硬件相關的Service等. 到此, 系統準備好啟動它的第一個App進程---Home進程了.
?
2、啟動App流程
?
一個 APK 只有一個 Application。每個 Apk 運行時都需要有一個 Application對象,Application對象執行 onCreate方法時APP就開始運行
用戶點擊 Home 上的一個 App 圖標,啟動一個應用時:
Click事件會調用startActivity(Intent), 會通過Binder IPC機制, 最終調用到ActivityManagerService. 該Service會執行如下操作:
- 第一步通過PackageManager的resolveIntent()收集這個intent對象的指向信息.
- 指向信息被存儲在一個intent對象中.
- 下面重要的一步是通過grantUriPermissionLocked()方法來驗證用戶是否有足夠的權限去調用該intent對象指向的Activity.
- 如果有權限, ActivityManagerService會檢查并在新的task中啟動目標activity.
- 現在, 是時候檢查這個進程的ProcessRecord是否存在了.
如果ProcessRecord是null, ActivityManagerService會創建新的進程來實例化目標activity.
?
2.1 創建進程
ActivityManagerService調用startProcessLocked()方法來創建新的進程, 該方法會通過前面講到的socket通道傳遞參數給Zygote進程. Zygote孵化自身, 并調用ZygoteInit.main()方法來實例化ActivityThread對象并最終返回新進程的pid.
ActivityThread隨后依次調用Looper.prepareLoop()和Looper.loop()來開啟消息循環.
流程圖如下:
?
2.2 綁定Application
接下來要做的就是將進程和指定的Application綁定起來. 這個是通過上節的ActivityThread對象中調用bindApplication()方法完成的. 該方法發送一個BIND_APPLICATION的消息到消息隊列中, 最終通過handleBindApplication()方法處理該消息. 然后調用makeApplication()方法來加載App的classes到內存中.
流程如下:
?
2.3 啟動Activity
經過前兩個步驟之后, 系統已經擁有了該application的進程. 后面的調用順序就是普通的從一個已經存在的進程中啟動一個新進程的activity了.
實際調用方法是realStartActivity(), 它會調用application線程對象中的sheduleLaunchActivity()發送一個LAUNCH_ACTIVITY消息到消息隊列中, 通過 handleLaunchActivity()來處理該消息.
假設點擊的是一個視頻瀏覽的App, 其流程如下:
?
?
?
?
?
總結
以上是生活随笔為你收集整理的安卓逆向_5 --- Android 学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM 寄存器 详解
- 下一篇: Java8 Stream详解~ 提取/组