详解 Android IPC 机制(二)Android 中的多进程模式

Author Avatar
wshunli 6月 05, 2018
  • 在其它设备中阅读本文章

在 Android 中多进程指单个应用存在多个进程的情况。

开启多进程模式

在 Android 中开启多线程只有一种方法,即在 AndroidManifest.xml 中指定 android:process 属性。

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity
    android:name=".SecondActivity"
    android:process=":remote" />
<activity
    android:name=".ThirdActivity"
    android:process="com.wshunli.ipc.demo.remote" />

MainActivity 没有指定 process 属性,则运行在默认进程中,进程名为包名。

当启动 SecondActivity 或者 ThirdActivity 时,系统会为他们单独创建进程,
进程名分别为 com.wshunli.ipc.demo:remotecom.wshunli.ipc.demo.remote .

开启多进程模式

对于二者的区别,
前者 com.wshunli.ipc.demo:remote 代表应用私有进程,其他应用的组件不可与其在同一进程中。
后者 com.wshunli.ipc.demo.remote 代表全局进程,其他应用可通过 ShareUID 方式与其在统一进程中。

Android 系统会为每个应用分配一个唯一的 UID ,具有相同的 UID 应用才能共享数据。

两个应用通过 ShareUID 跑在同一进程中也是有要求的,需要两个应用有相同的 ShareUID 并且签名相同。
在这种情况下,可以互相访问对方的私有数据,看起来像一个应用的两部分。

多进程模式的运行机制

Android 系统为每个应用(或者说每个进程)分配一个独立虚拟机,在内存分配上也有不同的地址空间。

我们新建一个 UserManager 类,然后写一个静态变量。

public class UserManager {
    public static int wshunli = 1;
}

在 MainActivity 中将静态变量赋值为 2 ,然后在 SecondActivity 和 ThirdActivity 中打印出来,发现其值仍然是 1 。

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

一般来说,使用多进程会造成如下几方面的问题:

(1) 静态成员和单例模式完全失效(不同的虚拟机)。
(2) 线程同步机制完全失效(不是同一块内存空间)。
(3) SharePreferences 的可靠性下降(底层通过 XML 执行操作,并发读/写都有可能出问题)。
(4) Application 会多次创建(启动新进程其实就是启动一个应用的过程,自然会创建新的 Application )。

public class MApplication extends Application {
    private static final String TAG = "MApplication";

    @Override
    public void onCreate() {
        super.onCreate();
        int pid = Process.myPid();
        Log.d(TAG, "pid: " + pid);
    }
}

同一个应用的多线程相当于不同应用采用 ShareUID 模式。

参考资料
1、《Android开发艺术探索》 — 2.2 Android 中的多进程模式
2、Android 接口定义语言 (AIDL) | Android Developers
https://developer.android.com/guide/components/aidl
3、Android IPC机制(一)开启多进程 | 刘望舒的博客
http://liuwangshu.cn/application/ipc/1-process-start.html

如果本文对您有所帮助,且您手头还很宽裕,欢迎打赏赞助我,以支付网站服务器和域名费用。 https://paypal.me/wshunli 您的鼓励与支持是我更新的最大动力,我会铭记于心,倾于博客。
本文链接:https://www.wshunli.com/posts/4662fa2f.html