該文章是一個系列文章,是本人在 Android 開發(fā)的漫漫長途上的一點(diǎn)感想和記錄,,我會盡量按照先易后難的順序進(jìn)行編寫該系列,。該系列引用了《Android開發(fā)藝術(shù)探索》以及《深入理解Android 卷Ⅰ,Ⅱ》中的相關(guān)知識,,另外也借鑒了其他的優(yōu)質(zhì)博客,,在此向各位大神表示感謝,膜拜?。,。×硗?,本系列文章知識可能需要有一定 Android 開發(fā)基礎(chǔ)和項(xiàng)目經(jīng)驗(yàn)的同學(xué)才能更好理解,,也就是說該系列文章面向的是 Android中高級開發(fā)工程師。 先來個最簡單的 HelloWord 代碼,,用 Android Studio 3.0 新建項(xiàng)目(一直使用默認(rèn))后會自動生成一個 HelloWorld 的項(xiàng)目,,如下: activity_main.xml <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas./apk/res/android" xmlns:tools="http://schemas./tools" xmlns:app="http://schemas./apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.helloword.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </android.support.constraint.ConstraintLayout>
MainActivity.java package com.helloword; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
我們啟動應(yīng)用程序,安裝到手機(jī)或者模擬器上,,界面顯示了一行字“Hello World!”,。我們的激動無以言表。下面來看看 MainActivity 的生命周期——由生到死 典型狀態(tài)下的生命周期分析(注:圖片來自《Android開發(fā)藝術(shù)探索》,,關(guān)于各個狀態(tài)的說明以及如何測試請參看該書籍,,這不是本系列的重點(diǎn))
異常狀況下的生命周期分析(注:圖片來自《Android開發(fā)藝術(shù)探索》,關(guān)于各個狀態(tài)的說明以及如何測試請參看該書籍,,這不是本系列的重點(diǎn)) Android系統(tǒng)的創(chuàng)世之初(本章重點(diǎn)) 相信前面的知識只要有一些開發(fā)經(jīng)驗(yàn)的就了解,。這不是本章的重點(diǎn),倘若有不太了解的同學(xué)可自行查看,。那么本章重點(diǎn)來了,在 Activity 的生命周期開始之前是怎么樣的呢,,Activity 的 onCreate 這個 Activity 的入口(開始)函數(shù)又是在哪里調(diào)用的呢,。下面我們來看一下整個 Android 應(yīng)用程序的生母吧。 ① Android 下的進(jìn)程(看清楚不是線程哦) 我們在開發(fā) Android 應(yīng)用程序的時(shí)候經(jīng)常使用到線程,,那么有沒有想過進(jìn)程呢,。要知道進(jìn)程才是分配資源的最小單位。我們知道 Andriod 是基于 Linux 系統(tǒng)的,。所以 Linux 系統(tǒng)的啟動過程或許能給我們一些啟發(fā),。 Linux下有3個特殊的進(jìn)程,,idle進(jìn)程(PID = 0), init進(jìn)程(PID = 1)和kthreadd(PID = 2),我們只介紹0,1> **idle進(jìn)程由系統(tǒng)自動創(chuàng)建, 運(yùn)行在內(nèi)核態(tài)**
> idle進(jìn)程其pid=0,其前身是系統(tǒng)創(chuàng)建的第一個進(jìn)程,,也是唯一一個沒有通過fork或者kernel_thread產(chǎn)生的進(jìn)程,。完成加載系統(tǒng)后,演變?yōu)檫M(jìn)程調(diào)度,、交換
>**init進(jìn)程由idle通過kernel_thread創(chuàng)建,,在內(nèi)核空間完成初始化后, 加載init程序, 并最終用戶空間**
>由0進(jìn)程創(chuàng)建,完成系統(tǒng)的初始化. 是系統(tǒng)中所有其它用戶進(jìn)程的祖先進(jìn)程
>Linux中的所有進(jìn)程都是有init進(jìn)程創(chuàng)建并運(yùn)行的,。首先Linux內(nèi)核啟動,,然后在用戶空間中啟動init進(jìn)程,再啟動>其他系統(tǒng)進(jìn)程,。在系統(tǒng)啟動完成完成后,,init將變?yōu)槭刈o(hù)進(jìn)程監(jiān)視系統(tǒng)其他進(jìn)程。
由上可知**init**進(jìn)程是Linux系統(tǒng)中所有其他用戶進(jìn)程的祖先進(jìn)程,。其實(shí)它也是Android系統(tǒng)的第一個進(jìn)程,。init進(jìn)程負(fù)責(zé)創(chuàng)建系統(tǒng)中的幾個關(guān)鍵進(jìn)程,其中之一的**zygote**,,是Java世界的開創(chuàng)者,。**zygote**進(jìn)程如何創(chuàng)建以及之后的流程我們不具體分析源碼,因?yàn)槟巧婕暗?span style="font-size: 15px;line-height: 1.5;color: rgb(163, 21, 21);">Native層,,我們用一張圖來表示,。
② Activity的啟動過程 前文已經(jīng)講到,zygote 分裂出嫡長子 system_server后,,就通過runSelectLoopMode 等待并處理來自客戶的消息了,,那么,誰會向zygote 發(fā)送消息呢,?這里以一個 Activity 的啟動為例,,具體分析zygote 是如何分裂和繁殖的。 ActivityManagerService 也是由 SystemServer 創(chuàng)建的,。 假設(shè)通過 startActivity 來啟動一個新的 Activity,,而這個 Activity 附屬于一個還未啟動的進(jìn)程,那么這個進(jìn)程該如何啟動呢,?繼續(xù)上圖,,結(jié)合上一張圖
Activity 的創(chuàng)建在上述的 main 函數(shù)中,,具體我們就不分析了,。 本篇文檔主要講了 Activity 的生命周期以及 Android 創(chuàng)世之初所走的道路,,總結(jié)起來就是 init 進(jìn)程創(chuàng)建了 zygote 進(jìn)程,,zygote進(jìn)程 進(jìn)行了一些初始化之后便創(chuàng)建了 SystemServer 進(jìn)程,,之后便 zygote進(jìn)程調(diào)用了 runSelectLoopMode() 函數(shù)等待請求,SystemServer 進(jìn)程創(chuàng)建了 Android 系統(tǒng)的服務(wù),,其中ActivityManagerService(簡稱AMS)是 Android 中最核心的服務(wù),,主要負(fù)責(zé)系統(tǒng)中四大組件的啟動、 切換,、 調(diào)度及應(yīng)用進(jìn)程的管理和調(diào)度等工作,,其職責(zé)與操作系統(tǒng)中的進(jìn)程管理和調(diào)度模塊類似。Activity 的啟動便是由 AMS 向 zygote進(jìn)程發(fā)起消息(這個說法并不精確由于 AMS 運(yùn)行在 SystemServer 進(jìn)程中,,所以其本質(zhì)還是由SystemServer 進(jìn)程向 zygote 進(jìn)程發(fā)起消息),。如上圖
|