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

1. 什么是进程?

进程是操作系统分配资源(如 CPU、内存等)的基本单位。简单来说,进程是一个正在执行的程序的实例。每个进程都有自己的内存空间、数据栈和其他辅助数据,用于跟踪进程的执行状态。在 Android 中,每个应用程序通常运行在自己的进程中,这种隔离性确保了一个应用的崩溃不会直接影响到其他应用。

2. 开启多进程的方式

在 Android 中,开启多进程的方式主要通过在 AndroidManifest.xml 文件中为四大组件(Activity、Service、BroadcastReceiver、ContentProvider)指定 android:process 属性来实现。这个属性允许开发者指定组件在哪个进程中运行,从而实现多进程的功能。

以下是一个简单的示例,展示了如何在Android中 创建多进程:

复制代码
      <activity
            android:name=".MainActivity"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>
        <activity
            android:name=".ThirdActivity"
            android:exported="false"
            android:process="com.ex.binder1.remote" />
        <activity
            android:name=".SecondActivity"
            android:exported="false"
            android:process=":remote" />

在上面的代码中,我们为 SecondActivityThirdActivity 使用了process属性分别指定了不同的进程。具体来说:

  • SecondActivity 的进程名为 xxx.xxx.xxx:remote,其中 xxx.xxx.xxx 是应用的包名。
  • ThirdActivity 的进程名为 com.ex.binder1.remote,这是另一种完整的说明方式,不会附加包名。

同时MainActivity没有为他指定process属性,那么它运行在默认进程中,默认进程的进程名是包名。

进程命名规则

  • 进程名以":"开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程当中。
  • 不以":"开头的进程属于全局进程,其他应用通过shareUID方式可以和它跑在同一个进程中。

3.查看多进程的方式

1.通过Android Studio的Log控制台查看

2.adb命令查看

adb shell ps | findstr com.ex.binder1(自己的包名)

4.多进程的进程隔离问题

在进程A定义一个变量,然后进行重新赋值,然后我们在进程B拿到这个变量打印出来看一下效果,会发现进程B的变量是没有被修改过的,这就很有意思了,这就是我们说的进程隔离。

产生进程隔离的原因?

我们知道Android为每一个应用分配了一个独立的虚拟机,或者说为每一个进程都分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本。所以修改进程A的变量不会影响到进程B的变量。

一般来说,进程隔离会造成如下几方面的问题:

(1)静态成员和单例模式完全失效。原因:不同进程访问的不是同一个对象了。

(2)线程同步机制完全失效。原因:不同进程锁的不是同一个对象了。

(3)SharePreferences的可靠性下降。原因:SharePreferences底层是通过读/写XML文件来实现的,并发 写或者读/写 显然是可能出现问题的。

(4)Application会多次创建。原因:运行在不同(进程)中的组件是属于不同的(虚拟机和Application以及内存空间)。

相关推荐
AFinalStone10 小时前
Android 7系统休眠唤醒(六)唤醒全链路
android·电源管理·休眠唤醒
雨白11 小时前
深入理解 Kotlin 协程 (九):互通有无,解构 Channel 缓冲策略与底层无锁机制
android·kotlin
灯塔@kuaidao12 小时前
平台交叉编译名词解释与基础流程
android
__Witheart__13 小时前
3568 Android otg模式下adb热拔插不识别
android·adb·rockchip
明天…ling15 小时前
Upload-Labs (Pass1-Pass21) 完整通关思路与源码分析
android·网络安全·渗透测试·burpsuite·upload-labs·文件上传绕过·靶场复现
__Witheart__15 小时前
3568 Android ntp校时使用
android·rockchip
wddptwd2816 小时前
android studio 报错怎么处理 java.lang.NullPointerException
android·java·android studio
美狐美颜SDK开放平台16 小时前
直播APP开发,美颜SDK和相机SDK有什么区别?
android·深度学习·数码相机·ios·直播美颜sdk·视频美颜sdk
唐诺18 小时前
Android Open Accessory (AOA) 协议完全解析
android·usb·aoa
我命由我1234519 小时前
Android 开发 - 广播组件(标准广播、有序广播、静态注册广播、分钟到达广播、网络变更广播...)
android·java·开发语言·网络·java-ee·android studio·android-studio