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