Android 多進(jìn)程運(yùn)行機(jī)制及IPC
今天總結(jié)下 Android 多進(jìn)程運(yùn)行機(jī)制以及 IPC 介紹,內(nèi)容如下:
Android中的進(jìn)程
Android IPC介紹
開啟多進(jìn)程模式
Android多進(jìn)程運(yùn)行機(jī)制
Android中的進(jìn)程
首先進(jìn)程可以理解為獨(dú)立運(yùn)行的程序,當(dāng)某個(gè)程序啟動(dòng)時(shí),系統(tǒng)將會(huì)為該程序創(chuàng)建一個(gè)進(jìn)程,并為其分配所需的系統(tǒng)資源,同時(shí)將該進(jìn)程添加到進(jìn)程就緒隊(duì)列中,進(jìn)程調(diào)動(dòng)程序負(fù)責(zé)運(yùn)行哪一個(gè)進(jìn)程。Android 中的應(yīng)用程序可以為一個(gè)進(jìn)程,也可以配置成多進(jìn)程,每個(gè)進(jìn)程都在自己獨(dú)立的空間中運(yùn)行,Android 為每個(gè)進(jìn)程分配一個(gè)虛擬機(jī),不同的虛擬機(jī)在內(nèi)存分配上有不同的地址空間,不同的進(jìn)程自然涉及到進(jìn)程間通信。Android 中的進(jìn)程如下:前臺(tái)進(jìn)程:可與用戶直接交互或與前臺(tái)綁定的Service所在的進(jìn)程;
可見進(jìn)程:用戶可見但是不可點(diǎn)擊;
服務(wù)進(jìn)程:后臺(tái)執(zhí)行的 Service 所在的進(jìn)程;
后臺(tái)進(jìn)程:相對(duì)于前臺(tái)進(jìn)程而言的進(jìn)程;
空進(jìn)程:理解為一種緩存意義上的進(jìn)程,系統(tǒng)隨時(shí)可以選擇回收空進(jìn)程。
Android IPC介紹
IPC(Inter-Process Communication) 指的是進(jìn)程間通信或跨進(jìn)程通信,任何一個(gè)操作系統(tǒng)都需要相應(yīng)的 IPC 機(jī)制來(lái)完成進(jìn)程間通信,如 Windows 上可以通過(guò)剪切板、管道等來(lái)完成進(jìn)程間通信,Linux 上可以通過(guò)信道、共享內(nèi)存、信號(hào)量來(lái)進(jìn)行進(jìn)程間通信Android 雖然基于 Linux,但是為了適應(yīng)移動(dòng)端的特點(diǎn),專門提供了一種進(jìn)程間通信方式 Binder,所以說(shuō)到 Android 中的 IPC 機(jī)制,一般指的就是 Android 中的 Binder 機(jī)制。IPC使用場(chǎng)景:某些應(yīng)用自身需要采用多進(jìn)程模式,如在 Android 中對(duì)一個(gè)應(yīng)用獲取的最大內(nèi)存做了限制,為了使自己的應(yīng)用獲取更多內(nèi)存空間而將一些模塊放在獨(dú)立進(jìn)程中,此時(shí)模塊之間的交互就需要進(jìn)程間通信來(lái)完成;
應(yīng)用本身需要跨進(jìn)程與其他應(yīng)用交互,無(wú)論是使用 ContentProvider 還是 AIDL 都屬于 IPC 的范疇,如在 Android 機(jī)頂盒 IPTV 中間件中就有大量使用。
開啟多進(jìn)程模式
Android 中開啟多進(jìn)程是在四大組件中配置android:process 屬性來(lái)開啟多進(jìn)程,配置時(shí)可以配置成私有進(jìn)程和全局進(jìn)程,如下:如果配置成私有進(jìn)程,則其他應(yīng)用的組件不可與其跑在同一個(gè)進(jìn)程中,如果配置全局進(jìn)程,則可以將兩個(gè)應(yīng)用設(shè)置成相同的 ShareUID 將兩個(gè)應(yīng)用的組件運(yùn)行在同一個(gè)進(jìn)程中,除此之外這兩個(gè)應(yīng)用的簽名也得相同,這樣將可將兩個(gè)應(yīng)用的組件運(yùn)行在同一進(jìn)程中,且可以共享私有數(shù)據(jù)如 data 目錄等。那么怎么將兩個(gè)應(yīng)用的組件配置在同一進(jìn)程呢?
<activity?
????android:name="com.manu.process.SampleActivity"
????android:process=":remote"/>
<activity?
????android:name="com.manu.process.SampleActivity"
????android:process="com.manu.remote"/>
兩個(gè)應(yīng)用設(shè)置相同的 ShareUID
兩個(gè)應(yīng)用的兩個(gè)組件的進(jìn)程設(shè)置成進(jìn)程名相同的全局進(jìn)程
兩個(gè)應(yīng)用簽名相同
Android多進(jìn)程運(yùn)行機(jī)制
Android 為每個(gè)進(jìn)程分配一個(gè)獨(dú)立的虛擬機(jī),不同的虛擬機(jī)在內(nèi)存分配上有不同的地址空間,這就導(dǎo)致在不同的虛擬機(jī)中訪問同一個(gè)類的對(duì)象會(huì)產(chǎn)生多份副本,也就是說(shuō)在兩個(gè)進(jìn)程中存在著同一個(gè)類的兩個(gè)副本,這兩個(gè)類互不干擾,修改一個(gè)不會(huì)影響另一個(gè),這就導(dǎo)致了一個(gè)問題,即運(yùn)行在不同進(jìn)程中的四大組件,只要它們之間通過(guò)內(nèi)存來(lái)共享數(shù)據(jù),都會(huì)共享失敗,多進(jìn)程造成的問題如下:靜態(tài)成員和單例模式完全失效
線程同步機(jī)制完全失效
SharePreference的可靠性下降
Application多次創(chuàng)建
