Android架構師之路-進程和IPC架構(1)

1.IPC通訊html

2.android進程概念android

3.設置IPC通訊安全

4.IPC接口-定義和實現數據結構

5.IBinder接口的使用app

6.IPC通訊三步驟框架

7.短程通訊和遠程通訊函數


1.先來看第一個大問題,什麼是ipc通訊?oop

         IPC(Inter-Process Communication)通訊是跨越兩個不一樣進程(process)的通訊。線程

         通常而言,一個android應用程序裏面的各組件(activity,service)都在一個進程裏面執行,這種通訊叫作短程通訊,這就意味着兩個activity在同一個進程裏面執行。code

         相對來說的是遠程通訊:兩個組件(activity和service)分別在不一樣的進程裏面執行,二者想要通訊,必須經過IPC通訊,這就是所謂的遠程通訊。

   IPC通訊效率:

         啓動app,android系統裏的Zygote服務孵化一個新的進程給app,而後將app加載到新誕生的進程中。

         基於Linux的安全限制,以及進程的基本特性,不一樣的進程的地址空間是獨立的,若是兩個類在同一個進程執行,二者的溝通方便也快速

        不一樣進程內執行時,須要藉助IPC跨進程通訊了。

2.android的進程概念

     一個進程是一個獨立的執行空間,不會被正在其它進程裏的程序所侵犯。這種保護方法是Android的重要安全機制。因而,得先認識進程的內涵,才能進一步瞭解跨進程IPC機制。
      •在Android的進程裏,有一個虛擬機(Virtual Machine,簡稱VM)的對象,可執行Java代碼,也引導JNI本地程序的執行,實現Java與C/C++之間的溝通


每個進程在誕生時,都會誕生一個主線程(Main Thread),以及誕生一個Looper類的對象和一個MQ(Message Queue)數據結構。每當主線程做完事情,就會去執行Looper類。

主線程最主要的工做就是處理UI畫面的事件(Event),每當UI事件發生時,Android框架會丟信息(Message)到MQ裏。主線程看到MQ有新的信息時,就取出信息,而後依據信息內容而去執行特定的函數。執行完畢,就再繼續執行Looper類,不斷地觀察MQ的動態。

剛纔說明了,當兩個類都在同一個進程裏執行時,二者之間的溝通,只要採起通常的函數調用(Function Call)就好了,既快速又方便。一旦兩個類分別在不一樣的進程裏執行時,二者之間的溝通,就不能採起通常的函數調用途徑了,只好採起IPC溝通途徑。


3.設置IPC通訊

在Android框架裏,一個應用(程序)套件(Application Package)一般

</pre>含有多個Java類(Class),這些類能夠在同一個進程(Process)裏執行;也能夠在不一樣的進程裏執行 。•一般,一個進程只會擺一支App。可是一支App可佔用多個進程。<p></p><p></p><pre code_snippet_id="636160" snippet_file_name="blog_20150404_2_1842967" name="code" class="html"><activity android:name=".FirstActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name
="android.intent.category.LAUNCHER" />
</intent-filter> </activity>
<activity android:name=".LoadActivity">
</activity>
<service android:name=".LoadService" android:process=":remote" >
<intent-filter>
<action android:name
="com.misoo.pkm.REMOTE_SERVICE" />
</intent-filter></service>
</manifest>

  android:process=":remote",經過設置這個屬性,將該service設置爲單獨一個進程中,與其餘的activity或者service隔離開來,這樣之,一個app中就會有兩個進程了

其中,FirstActivity和LoadActivity兩個類別會加載預設的進程裏。而LoadService則會加載於名爲「remote」的獨立進程裏。


這樣,藍色豎線兩邊分別是兩個獨立的進程,各自運行這本身的程序,爲了數據的安全起見,每一個進程都須要獨立建立一個vm對象,獨享本身的數據,防止進程間數據共享,致使數據惡意篡改,不利於程序安全。

在Android的各進程裏,都有一個VM對象,執行Java代碼,也引導JNI本地程序的執行,實現Java與C/C++程序之間的溝通

相關文章
相關標籤/搜索