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开发艺术探索》