Android应用程序的sharedUserId,process与签名总结

来源:互联网 发布:百度算法之轮流展现法 编辑:程序博客网 时间:2024/06/07 06:39

通常情况下,一个Android应用程序(APK)通常运行在一个进程中(所有的组件都运行在这个进程中),独占一个虚拟机实例。

当然,我们也可以通过在Manifest文件中进行配置,改变这个规则。

在每种组件(activity、service、receiver、provider)的manifest条目中,都支持一个 “android:process”的属性,通过这个属性,我们可以指定某个组件运行的进程。我们可以通过设置这个属性,让每个组件运行在它自己的进程中,也可以只让某些组件共享一个进程。我们要可以通过设置“android:process”属性,让不同应用程序中的组件运行在相同的进程中,这些应用程序共享相同的Linux用户ID,拥有相同的证书。

android:process属性

这个属性用于设置Activity应该运行的那个进程的名字。通常,应用程序的所有组件都运行在为这个程序所创建的一个默认的进程中。它跟应用程序的包有相同的名字。<application>元素的process属性能够给所有的组件设置一个不同的默认值。但是每个组件都能够覆盖这个默认设置,允许把应用程序分离到多个进程中。
如果这个属性名的值是用“:”开始,那么在需要的时候,就会创建一个应用程序私有的新的进程,这个Activity就会运行在这个进程中。如果进程名使用小写字母开头,那么在权限许可的情况下,该Activity会运行在用它命名的全局进程中。

测试了一下:感觉<application>元素的process属性没有什么作用?对于没有指定process属性的组件默认运行在应用程序的进程中,进程名为包名,指定了组件的process属性,那么就会创建一个进程,进程名与组件中设定的process属性的名字相同。

android:sharedUserId属性

安装在设备中的每一个apk文件,Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户都会被分配到一个属于自己的统一的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它)。用户ID 在应用程序安装到设备中时被分配,并且在这个设备中保持它的永久性。

通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样.

Android签名(证书)

Android系统要求每一个安装进系统的应用程序都是经过数字证书签名的,数字证书的私钥则保存在程序开发者的手中。Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。这个数字证书并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。

Android系统通过包名来标识应用程序的,如果系统中已经存在一个某个包名的应用程序,如果签名不同但是包名相同的程序想安装的话,就会安装失败。

总结

如果想让两个APK中的组件运行在同一个进程中的话,需要满足如下条件。

(1)APK的包名不能相同。

如果包名相同,那么系统会认为是同一个应用,安装时就会覆盖之前安装的APK。如果签名相同,那么后面的可能会覆盖前面的(与APK版本有关);如果签名不同,则第二个APK会安装失败。

 (2) 两个APK的签名需要相同

如果签名不同,安装第二个apk时会提示INSTALL_FAILED_UPDATE_INCOMPATIBLE错误,安装失败。

 (3) ShareUserId需要相同,并且process属性内容一致或者被调用的组件的属性为android:multiprocess="true" 

如果ShareUserId不同,process属性名字相同,那么,只是进程的名字相同,userid和pid都是不同的。

如果ShareUserId相同,process属性名字不同,那么,只是userid相同,pid和process名字都是不同的。

0 0
原创粉丝点击