<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Android 多進(jìn)程運(yùn)行機(jī)制及IPC

          共 2367字,需瀏覽 5分鐘

           ·

          2020-07-27 09:17

          8efab81631b4560700eef13eec532e9c.webp今天總結(jié)下 Android 多進(jìn)程運(yùn)行機(jī)制以及 IPC 介紹,內(nèi)容如下:

          1. Android中的進(jìn)程

          2. Android IPC介紹

          3. 開啟多進(jìn)程模式

          4. 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)程。

          其優(yōu)先級(jí)為前臺(tái)進(jìn)程 > 可見進(jìn)程 > 服務(wù)進(jìn)程 > 后臺(tái)進(jìn)程 > 空進(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)景:
          1. 某些應(yīng)用自身需要采用多進(jìn)程模式,如在 Android 中對(duì)一個(gè)應(yīng)用獲取的最大內(nèi)存做了限制,為了使自己的應(yīng)用獲取更多內(nèi)存空間而將一些模塊放在獨(dú)立進(jìn)程中,此時(shí)模塊之間的交互就需要進(jìn)程間通信來(lái)完成;

          2. 應(yīng)用本身需要跨進(jìn)程與其他應(yīng)用交互,無(wú)論是使用 ContentProvider 還是 AIDL 都屬于 IPC 的范疇,如在 Android 機(jī)頂盒 IPTV 中間件中就有大量使用。

          注意:Android 對(duì)應(yīng)用內(nèi)存的限制不同廠商不同,默認(rèn)分配的初始內(nèi)存是 16M,具體配置在 system/build.prop 文件中。

          開啟多進(jìn)程模式

          Android 中開啟多進(jìn)程是在四大組件中配置 android:process 屬性來(lái)開啟多進(jìn)程,配置時(shí)可以配置成私有進(jìn)程和全局進(jìn)程,如下:


          <activity?
          ????android:name="com.manu.process.SampleActivity"
          ????android:process=":remote"/>



          <activity?
          ????android:name="com.manu.process.SampleActivity"
          ????android:process="com.manu.remote"/>

          如果配置成私有進(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)程呢?
          1. 兩個(gè)應(yīng)用設(shè)置相同的 ShareUID

          2. 兩個(gè)應(yīng)用的兩個(gè)組件的進(jìn)程設(shè)置成進(jìn)程名相同的全局進(jìn)程

          3. 兩個(gè)應(yīng)用簽名相同

          測(cè)試過(guò)程中發(fā)現(xiàn),如果一個(gè)進(jìn)程已經(jīng)啟動(dòng)了,在啟動(dòng)一個(gè)配置同一進(jìn)程的組件時(shí),第二個(gè)應(yīng)用程序會(huì)異常退出,這一點(diǎn)還需閱讀源碼進(jìn)一步了解原因.

          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)程造成的問題如下:
          1. 靜態(tài)成員和單例模式完全失效

          多進(jìn)程中存在著一個(gè)類的多個(gè)副本,修改互不影響,自然無(wú)法生效;
          1. 線程同步機(jī)制完全失效

          線程同步機(jī)制鎖住的不是一個(gè)對(duì)象,自然無(wú)法生效;
          1. SharePreference的可靠性下降

          SharePreference 雖然可以設(shè)置 MODE_MULTI_PROCESS 支持多進(jìn)程,但是并不推薦使用,因?yàn)樵谀承┌姹旧喜簧В?API 23 之后已被廢棄,所以使用 MODE_MULTI_PROCESS 支持 SharePreference 多進(jìn)程是不靠譜的,解決方案是使用 ContentProvider 作為中間層來(lái)使的 SharePreferences 支持多進(jìn)程。具體就是其他進(jìn)程通過(guò) ContentProvider 來(lái)訪問另一個(gè)進(jìn)程,而數(shù)據(jù)是存儲(chǔ)在 SharePreference 中的,可通過(guò) Contentprovider 實(shí)現(xiàn)增刪查改來(lái)對(duì)數(shù)據(jù)進(jìn)行操作。
          1. Application多次創(chuàng)建

          當(dāng)一個(gè)組件運(yùn)行到一個(gè)新的進(jìn)程時(shí),創(chuàng)建進(jìn)程的過(guò)程實(shí)際上就是一個(gè)應(yīng)用啟動(dòng)的過(guò)程,自然會(huì)使得 Application 多次創(chuàng)建,可以這樣理解為運(yùn)行在同一進(jìn)程中的組件是屬于同一個(gè)虛擬機(jī)和同一個(gè) Application 的,不同進(jìn)程中的組件屬于多個(gè)虛擬機(jī)和 Application。Application 的 onCreate 方法一般用來(lái)初始化操作,如果多次調(diào)用 Application 的 onCreate 方法,為避免出錯(cuò),可根據(jù)進(jìn)程名判斷再進(jìn)行相關(guān)初始化。上文是對(duì) Android 多進(jìn)程運(yùn)行機(jī)制及 IPC 的介紹,Android 中 IPC 方式實(shí)現(xiàn)方式有 Bundle、文件傳輸、AIDL、Messenger、ContentProvider 等方式,這部分內(nèi)容將在后續(xù)進(jìn)行整理和分享,回復(fù)【加群】邀你進(jìn) Android、Flutter技術(shù)交流群。推薦閱讀:
          瀏覽 27
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  麻豆射区 | 黄色的网站在线 | 亚洲成人第一网站 | 麻豆视频观看免费 | 大香蕉560|