[Android]你不知道的Android進程化(2)--建立進程

你們好,我係蒼王。html

如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。java

[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表
[Android]你不知道的Android進程化--進程信息linux

Android如何建立一個進程?
下面是簡述:android


Zygote初始化圖

(1)Android系統啓動的時候會啓動Zygote服務(執行ZygoteInit.java)。
(2)Zygote進程啓動會作三件事。
*建立socket服務端,監聽ActivityManagerService進程的建立請求。
*初始化一些SDK信息
*最後Zygote fork()建立出SystemService 服務,Zygote.forkSystemServer建立。
(3)SystemService 也會執行三件事
*關閉socket非zygote進程容許監聽
*獲取Dalvim虛擬機去執行RunTimeInit
*初始化各個系統服務vim

當應用啓動時
(1)AMS讀取到啓動應用的信息,經過socket請求Zygote孵化應用的進程,Zygote.forkAndSpecialize建立。
(2)Zygote是會將信息傳遞到Native層中,而後Linux使用fork()方法來孵化進程。
(3)fork()會給每一個進程啓動一個pid(process Id),而後咱們經過adb命令就能夠看到一些進程信息了。app

四大組件運行的進程

1.activity、service、receiver 和 provider四大組件均支持 android:process 屬性,該屬性能夠指定在四大組件哪一個進程中運行。
2.application元素支持 android:process 屬性,以設置適用於全部組件的默認值。
3.若是內存不足,而其餘爲用戶提供更緊急服務的進程又須要內存時,Android 可能會決定在某一時刻關閉某一進程。在被終止進程中運行的應用組件也會隨之銷燬。 當這些組件須要再次運行時,系統將爲它們重啓進程。socket

Android啓動進程的方法

1.使用AndroidManifest中的的android:process來達到多進程的目的。若是android:process的value值以冒號開頭的話,那麼該進程就是私有進程,若是是以其餘字符開頭,那麼就是公有進程,這樣擁有相同 ShareUID 的不一樣應用能夠跑在同一進程裏
2.經過JNI利用C/C++,調用fork()方法來生成子進程。ide

Android關閉進程的方法

關閉當前進程
android.os.Process.killProcess(android.os.Process.myPid());
killProcess的方法其實際是發送信號到Native,讓linux經過pid殺死進程。
這裏只介紹關閉自身進程,由於並不涉及到要控制關閉其餘進程的狀況。
若是有興趣想了解能夠查看
Android程序退出完全關閉進程的方法
Android結束進程的方法函數

Android process啓動流程

進程建立流程

關於應用內啓動進程,須要深刻了解AMS的源碼。
1.三個判斷進程信息的入口,經過ActivityRecord(Activity)中的processName來獲取到Process信息。
Activity->ActivityStackSupervisor.java
Service->ActiveService.java
Broadcast->BroadcastQueue
三個文件都對調用AMS的startProcessLock函數。
2.AMS中有四個startProcessLock的函數,以後會調用Process.start的函數。
其須要調用android.app.ActivityThread爲entrypoint入口。
3.Process.start 中會調用startViaZygote函數,而後拼接native命令,調用
zygoteSendArgsAndGetResult函數,編寫字節流發送到ZygoteConnection和接收建立結果
4.Zygote是經過socket的方式接收字節流的方式交互,接收到後會觸發ZygoteConnection.runOnce()的函數,讀取字節流數據,而後經過Zygote.forkAndSpecialize告訴native建立進程,handleChildProc會發送給WrapperInit.execApplication,拼接native命令,轉發到Zygote.execShell來反射entrypoint類即android.app.ActivityThread入口初始化進程。源碼分析

這裏給你們推薦一篇分析,雖然以後的源碼有所改動,可是其啓動邏輯並無改變。
源碼分析Android 應用進程的啓動過程

須要注意的是

1.Service不開啓新進程,默認會和Activity跑在同一個主線程(UI線程)上,因此Service若是有耗時操做請必定要啓動線程處理。
2.ContentProvider若是App沒有啓動時,會被默認啓動爲一個新的進程,若是App存在,沒有特定指定進程,會和現有的App運行在同一個進程。

本節就到這裏。

你只能向前跑,才能待在原地。

Android進程化交流
相關文章
相關標籤/搜索