Android之多进程

1. android:process属性

正常情况下,一个apk启动后只会运行在一个进程中,其进程名为apk的包名(可用adb shell ps查看),所有的组件都会在这个进程中运行。

若要将某些组件(如Service,Activity等)运行在单独的进程中,或一些组件运行在某个进程中,就要在清单文件中对该组件设置android:process属性。还可以设置该属性,使不同应用的组件,在相同的进程中运行,但前提是这些应用有共同的ShareUID和相同的签名。这样,同一个应用的多进程,就可以理解为两个不同的应用采用ShareUID模式。

若把sharedUserID设置成“android.uid.system”,就可以运行在系统进程中,则可修改系统数据,但前提是要有系统签名,即Android.mk里面的LOCAL_CERTIFICATE值为platform。

若要修改应用程序的默认进程名,则可给清单文件的application元素设置android:process属性。

2. 公有进程和私有进程

1).  如果android:process的值以冒号开头,那么该进程就是私有进程

<service android:name=".LocalService" android:process=":remote"/>

若包名为“com.lyl.multiprocess”,则实际的进程为“com.lyl.multiprocess:remote”。
这种设置形式表示该进程为当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中。

2).  以小写字母开头(如com.secondProcess),那么就是公有进程或全局进程

 <service android:name=".LocalService" android:process="com.secondProcess"/>

不能以数字开头,并且要符合命名规范,必须要有'.', 如com.secondProcess,否则将会出现这种错误: Invalid process name simon in package com.wind.check: must have at least one ‘.’。
其他应用通过设置相同的ShareUID可以和它跑在同一个进程,前提是两个应用有相同的签名。

3. 一个应用内的多进程会造成以下问题:

1). Application会创建多次
多进程模式中,同一进程的组件拥有同一个虚拟机、Application,不同进程的组件拥有相互独立的虚拟机、内存空间、Application。

2). 单例模式、静态变量完全失效
每个进程都会分配一个独立的虚拟机,不同的虚拟机在内存上分配不同的地址空间,即不同进程的内存空间相互独立,故两个不同的进程中,会有两个不同的实例,在一个进程中修改静态变量,在另外
一个进程中失效。

3). 线程同步机制完全失效
因为空间独立,不管是锁对象还是锁全局类都无法保证线程同步,因为进程不同,锁住的对象不是同一个。

4). SharePreference的可靠性下降
SharePreference底层是对XML文件操作,不支持两个进程同时去执行写操作,因为它没有实现并发修改的机制,不能保证数据的安全性、准确性。

4. 参考

《Android开发艺术探索》

猜你喜欢

转载自blog.csdn.net/lyl0530/article/details/81877598
今日推荐