在Android里面每个app都有一个唯一的linux user ID,则这样权限就被设置成该应用程序的文件只对该用户可见,只对该应用程序自身可见;而我们可以使他们对其他的应用程序可见,可以通过SharedUserId,也就是让两个apk使用相同的userID,这样它们就可以看到对方的文件。为了节省资源,具有相同ID的apk也可以在相同的linux进程中进行(注意,并不是一定要在一个进程里面运行),共享一个虚拟机。

一、检验在多种情况下,应用AppA,AppB运行的相关信息: processName,pid,uid,和获取其他资源的情况,可以通过获取应用相关的context,来获取相关资源,这里只是测试下

其他文件的资源string,代码如下:

  1. try
  2. {
  3.  
  4. final String sharedPackageNameString = "com.sihaixuan.datashare.a";
  5. Context context = createPackageContext(sharedPackageNameString, CONTEXT_IGNORE_SECURITY);
  6. Resources resources = context.getResources();
  7. String resName = getString(R.string.app_share_resource_string_name,"name a");
  8. int resiD = resources.getIdentifier(resName, "string",sharedPackageNameString);
  9. Log.d("App toney","shared from "+sharedPackageNameString +" : "+resources.getString(resiD));
  10. }
  11. catch (Exception e)
  12. {
  13. Log.d("App toney", e.getLocalizedMessage());
  14. }

1)缺省情况

android中每个应用都有自己的linux uid,分别运行自己的进程中。

2)配置相同的process <application android:process="com.sihaixuan.processName">

相同的process name,运行在不同进程.

3)相同的shareUserId <manifest android:sharedUserId="com.sihaixuan.shareUserId">元素

应用配置相同shareUserId ,就有相同uid,不在同一进程运行。

4)配置相同 process name 和 相同的shareUserId

和单独设置相同的process name 或者相同的shareUserId一样,都用的相同的uid,运行在不同进程,可以共享资源。

可以看出pid相同,运行在同一进程中,即共享进程和dvm 虚拟机实例。

二、 shareUserId 和 processName的资源共享的简单分析。

1)pms管理着应用的安装和卸载,会把应用程序的相关包管理信息记录在/data/packages.xml中,开机、安装app、卸载app会动态扫描和更新该文件。

例如:ApkA,ApkB共享进程 的包管理信息

  1. <shared-user name="com.sihaixuan.shareUserId" userId="10087">
  2. <sigs count="1">
  3. <cert index="12" />
  4. </sigs>
  5. <perms />
  6. </shared-user>
  7.  
  8. <package name="com.toney.datashare.a" codePath="/data/app/com.toney.datashare.a-1.apk" nativeLibraryPath="/data/data/com.toney.datashare.a/lib"
    flags="1073741824" ft="14cd4bf0230" it="14cd4bf032f" ut="14cd4bf032f" version="1" sharedUserId="10087">
  9. <sigs count="1">
  10. <cert index="12" />
  11. </sigs>
  12. <perms />
  13. </package>
  14.  
  15. <package name="com.sihaixuan.datashare.b" codePath="/data/app/com.sihaixuan.datashare.b-1.apk" nativeLibraryPath="/data/data/com.sihaixuan.datashar e.b/lib" flags="1073741824" ft="14cd4bf40b0" it="14cd4bf4408" ut="14cd4bf4408" version="1" sharedUserId="10087">
  16. <sigs count="1">
  17. <cert index="12" />
  18. </sigs>
  19. <perms />
  20. </package>

1)uid的生成时机和赋值时机

安装入口函数pms.installPackageAsUser

2)

android 用ProcessRecord类表示进程相关信息 ,ams用ProcessMap维护着进程ProcessRecord管理。ProcessMap结构如下:

  1. public class ProcessMap<E> {
    //不同进程的进程名可以相同
  2. final ArrayMap<String, SparseArray<E>> mMap = new ArrayMap<String, SparseArray<E>>();
  3. //通过 processName、 linux uid确定processRecord
  4. public E get(String name, int uid) {
  5. SparseArray<E> uids = mMap.get(name);
  6. if (uids == null) return null;
  7. return uids.get(uid);
  8. }
  9.  
  10. public E put(String name, int uid, E value) {
  11. SparseArray<E> uids = mMap.get(name);
  12. if (uids == null) {
  13. uids = new SparseArray<E>(2);
  14. mMap.put(name, uids);
  15. }
  16. uids.put(uid, value);
  17. return value;
  18. }
  19.  
  20. 。。。。。。
  21. }

可以看出根据 processName 和 uid来确定processRecord.可以通过设置<application>元素的process 和 shareUserId来共享进程和vm.

进程的启动流程:都是从启动activity开始的

context.startActivty()------>ipc调用ams.startActivity()------>.....----->activitystack.resumeTopActivityLocked()----->activityStackSupervisor.startSpecificActivityLocked()从processMap查询processRecord.

processRecord找不到或者无效----->ams.startProcessLocked();新建processRecord并put进processMap中去,新建进程后,设置processRecord的pid---->Process.start()---->Process.startViaZygote()---->Process.zygoteSendArgsAndGetResult()(本地套接字通信)。----->activityThread.main()实例化--->ams.attachApplication();--->ActivityStackSupervisorattachApplicationLocked()---->applicationThread.attachApplicaton(),activitystack.resumeTopActivityLocked()---->activityStackSupervisor.realStartActivityLocked()---->applicatonThread异步消息通知 activityThread-启动activity-

processRecord存在且有效,activityStackSupervisor.realStartActivityLocked()---->applicatonTreahd异步消息通知 activityThread-启动activity.

1、通过获取相同shareUserId的context

1)相同shareUserId,不同进程,shareUserId 和 lunix进程的uid不是同一概念。

2)相同shareUserId,相同进程

资源共享原理分析。

2、contentprovider 共享数据

参看网址:

Android PackageManagerService分析一:PMS的启动

android 安全机制

APK安装过程及原理详解

Android通过共享用户ID来实现多Activity进程共享

android 应用间共享数据,调用其他app数据资源的更多相关文章

  1. android组件间共享数据的常用方法

    使用Intent在激活组件的时候携带数据,以进行数据的传递 使用广播进行组件间数据的伟递 使用外部存储(sharedPreference,文件,数据库,网络)进行组件间数据共享 使用Static静态成 ...

  2. 两个android程序间的相互调用(apk互调)

    通常我们用到的只是activity之间的互相跳转和调用,很少会用到apk级别的互相调用. 往往在一些应用上会用到,比如一个支付系统,可能会有很多的一系列的程序调用到:彩票系统.订票系统.团购网……全部 ...

  3. Android应用中使用AsyncHttpClient来异步网络数据(转载)

    摘要: 首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测 ...

  4. Android应用中使用AsyncHttpClient来异步网络数据

    首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测试的Ac ...

  5. 【转】Android应用中使用AsyncHttpClient来异步网络数据

    摘要: 首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测 ...

  6. APP数据埋点分类方式

    1.数据埋点的重要性     在现实工作中,数据的整体流程为:数据生产-数据采集-数据处理-数据分析和挖掘-数据可视化,其中,数据采集是很重要的一个环节,数据采集得全不全.对不对,直接决定数据广度和质 ...

  7. App数据指标

    App数据指标 1 App数据指标 2 参考资料 超详细的APP数据指标体系分析

  8. 在 App 扩展和主 App 间共享数据

    tags: iOS 8,Swift,App Groups 随着 iOS 8 的发布,苹果为广大开发者很多新的 API,其中最突出显著的就非 App Extension 莫属了.这为开发者们又带来了很多 ...

  9. 应用间共享数据方法(一)---sharepreferce

    SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数. SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/ ...

随机推荐

  1. Python之高级库socketserver

    socket并不能多并发,只能支持一个用户,socketserver 简化了编写网络服务程序的任务,socketserver是socket的在封装.socketserver在python2中为Sock ...

  2. Java String Split Method

    Java String.split() method 有如下几种特殊情况: 1. 分隔符出现在首尾 public static void main(String args[]) { String St ...

  3. js 自定义方法 设置可选参数的方法

    原链接 http://www.cnblogs.com/RightDear/p/3156652.html PHP有个很方便的用法是在定义函数时可以直接给参数设默认值,如: function simue ...

  4. C#:使用UPnP来穿透NAT使内网接口对外网可见

    在写完Object 672后,软件的一个致命问题暴露出来,如果服务器和客户端都在内网环境下,即双方都通过NAT来接触外网,那么此时客户端是无法直接和服务器交流的. 解决方案可以是: 1:把服务器部署在 ...

  5. 手机访问PC网站自动跳转到手机网站代码(转)

    4G时代,手机网站已经非常普遍了,一般手机网站都有一个二级域名来访问,比如 m.16css.com 如果手机直接访问www.16css.com 就是PC网站,在手机上浏览电脑版网站体验非常不好. 如果 ...

  6. Common 通用类库

    /// <summary> /// 传入虚拟路径 返回全路径的html字符串 /// </summary> /// <param name="context&q ...

  7. POJ2536(二分图最大匹配)

    Gopher II Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8504   Accepted: 3515 Descrip ...

  8. 关于移动端的一些tip

    移动端的一些tip 开发相关 关于viewport <meta name="viewport" content="name=value,name=value&quo ...

  9. mysql函数之三:find_in_set() 函数 返回str在字符串集strlist中的序号

    如果字符串str是在的strlist组成的N子串的字符串列表,返回值的范围为1到N. FIND_IN_SET(str,strlist) 如果字符串str是在的strlist组成的N子串的字符串列表,返 ...

  10. eclipse项目中将普通文件夹转化成资源文件夹

    1.点选该文件夹 2.右键属性Properties 3.选择属性:Build Path 4.点选属性:Use as  Source Folder ......等待变成资源文件夹 参考更详细的: ecl ...