Android-IPC机制(一)多进程模式

Android-IPC机制(一)多进程模式

[TOC]

1. 简介

IPC是 Inter-Process Communication 的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。

1.1 进程与线程

按照操作系统中的描述,线程是CPU调度的最小单元,同时线程是一种有限的系统资源。而进程一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用。一个进程可以包含多个线程,因此进程和线程是包含与被包含的关系。

1.2 Android 中的进程与线程

最简单的情况,一个进程中可以只有一个线程,即主线程,在Android里面主线程也叫UI线程,在UI线程里才能操作界面元素。很多时候,一个进程中需要执行大量耗时任务,如果恰好是在主线程中执行的就会造成界面无法响应(ANR——Application Not Responding),即应用无响应。此时就需要把这些耗时操作放在其他线程中。

2. Android 中的多进程模式

2.1 开启多进程模式

Android中使用多进程只有一种方法,那就是给四大组件(Activity,Service,Receiver,ContentProvider)在AndroidMenifest中指定android:process属性,除此之外没有其他办法,我们无法指定一个线程运行时所在的进程。

  • 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<activity
android:name=".multiProcess.FirstActivity"
android:configChanges="screenLayout"
android:label="@string/app_name" />
<!--未指定process属性,运行时默认进程com.duyangs.ipc-->

<activity
android:name=".multiProcess.SecondActivity"
android:configChanges="screenLayout"
android:label="@string/app_name"
android:process=":ximimax" />
<!--指定process属性,运行时创建独立进程com.duyangs.ipc:ximimax-->

<activity
android:name=".multiProcess.ThirdActivity"
android:configChanges="screenLayout"
android:label="@string/app_name"
android:process="com.duyangs.ipc.ximimax" />
<!--指定process属性,运行时创建独立进程com.duyangs.ipc.ximimax-->

运行程序,执行 adb shell ps查看进程信息:

进程信息

可以看到,和我们设想的一样,我们依次启动的三个Activity分属于不同的进程。同时,SecondActivity声明时process= ":ximimax",所属进程为com.duyangs.ipc:ximimax;ThirdActivity声明时为com.duyangs.ipc.ximimax查询出的结果也是com.duyangs.ipc.ximimax。但是,他们两者之间也有细微的区别——:.。简单分析:

:的含义是在当前的进程名前附加上当前的包名com.duyangs.ipc,":ximimax"是一种简写的方式,完整写法为"com.duyangs.ipc:ximimax",它属于当前应用的私有进程,其他应用的组件不可以同它跑在同一个进程中;

com.duyangs.ipc.ximimax是完整的命名方式,不会附加包名信息,属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中。

  • 延伸

    Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据。两个应用拥有相同的ShareUID并且签名相同才可以通过ShareUID跑在同一个进程中。如果说两个应用ShareUID签名相同,则:

处于不同进程 处于同一进程
可以互相访问对方的私有数据(data目录,组件信息…) 可以互相访问对方的私有数据(data目录,组件信息…),同时,还可以共享内存数据

2.2 多进程模式的运行机制

多进程会导致各种奇怪问题的出现。

`Android`为每一个应用(进程)分配了一个独立的虚拟机(内存空间),这就导致在不同的虚拟机访问同一个类的对象会产生多个副本。

所有运行在不同进程中的四大组件,只要它们之间需要通过内存来共享数据,都会共享失败,这也是多进程带来的主要影响。

通常,使用多进程会出现的问题:

  • 静态成员和单例模式完全失效

    不同进程分属不同内存空间,所谓的成员变量,单例模式,也仅作用于当前进程。

  • 线程同步机制完全失效

    本质和上一个问题类似,分属不同内存,不同进程锁的不是同一个对象。

  • SharedPreferences的可靠性下降

    SharedPreferebces不支持两个进程同时执行写操作,否则会导致一定几率的数据丢失,并发读/写都有可能出现问题。

  • Application会多次创建

    运行在同一进程的组件是属于同一个虚拟机和同一个Application的,反之,运行在不同进程的组件是属于不同的虚拟机和Application 的;当一个组件跑在一个新的进程中的时候,由于系统要创建新的进程同时分配独立的虚拟机。

一个应用的多进程——相当于两个不同的应用采用了ShareUID的模式。

您的支持将鼓励我继续创作!