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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值