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

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

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

try{final String sharedPackageNameString = "com.sihaixuan.datashare.a";Context context = createPackageContext(sharedPackageNameString, CONTEXT_IGNORE_SECURITY);Resources resources = context.getResources();String resName = getString(R.string.app_share_resource_string_name,"name a");int resiD = resources.getIdentifier(resName, "string",sharedPackageNameString);Log.d("App toney","shared from "+sharedPackageNameString +" : "+resources.getString(resiD));}catch (Exception e){Log.d("App toney", e.getLocalizedMessage());}

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共享进程 的包管理信息

<shared-user name="com.sihaixuan.shareUserId" userId="10087">
    <sigs count="1">
        <cert index="12" />
    </sigs>
    <perms />
</shared-user><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">
    <sigs count="1">
    <cert index="12" />
    </sigs>
    <perms />
</package><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">
    <sigs count="1">
    <cert index="12" />
    </sigs>
    <perms />
</package>

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

安装入口函数pms.installPackageAsUser

2)

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

public class ProcessMap<E> {    //不同进程的进程名可以相同final ArrayMap<String, SparseArray<E>> mMap   = new ArrayMap<String, SparseArray<E>>();//通过 processName、 linux uid确定processRecordpublic E get(String name, int uid) {SparseArray<E> uids = mMap.get(name);if (uids == null) return null;return uids.get(uid);}public E put(String name, int uid, E value) {SparseArray<E> uids = mMap.get(name);if (uids == null) {uids = new SparseArray<E>(2);mMap.put(name, uids);}uids.put(uid, value);return value;}。。。。。。
}

可以看出根据 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进程共享

转载于:https://www.cnblogs.com/sihaixuan/p/4438198.html

android 应用间共享数据,调用其他app数据资源相关推荐

  1. android 共享数据,android进程间共享简单数据

    我们知道,在android中,保存简单的数据最方便的就是使用SharedPreferences,然而,SharedPreferences虽然说也可以设置成进程间共享数据,但是并不可靠(更致命的是,不同 ...

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

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

  3. php获取小米手环数据,小米运动App数据提取

    陆陆续续手头已经有好多小米的设备了.我用的是红米5,还买了小米手环3,还有一个小米体重秤.小米的产品做的挺不错的.手机上安装"小米运动"APP,蓝牙实时开启,就能够记录各种运动数据 ...

  4. 磐河数据php代码,国内机票_API数据接口_免费数据调用 - 磐河数据用户中心

    { "data": { "voyage": { "fromCityCode": "KRL", "toCityC ...

  5. Android产品研发(八)--App数据统计

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们介绍了Android社区中比较火的热修复功能,并介绍了目前的几个比较流行的热修复框架,以及各自的优缺点,同时也介绍了一下自身项目中对热修复功能的实践.目 ...

  6. Android实例-调用系统APP(XE10+小米2)

    相关资料: 1.群号383675978 2.http://blog.sina.com.cn/s/blog_44fa172f0101rmjt.html 3.PS:ListView1.ItemAppear ...

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

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

  8. 自动抓取app数据的攻与防

    当我们发布了一款app后,一般我们并不想让别人获取我们的app数据,更不希望别人调用我们的app后端服务api.一些抢购场景尤其重要,比如:在线预约医院专家号(知名专家的号往往一票难求),在线抢购商品 ...

  9. PMCAFF微课堂 | 腾讯搜索专家教你如何用数据玩转APP运营

    报名方式:回复"报名"至PMCAFF公众账号(pmcaffcom),即可进入报名环节 ▎上课地点 PMCAFF微课堂将在网站上开放在线教室供大家学习,开放500人微信群供课后交流. ...

最新文章

  1. TortoiseGit清除账号密码
  2. 开发自己的 chart - 每天5分钟玩转 Docker 容器技术(167)
  3. java接口构建英雄属性_Java开发学习心得(三):项目结构
  4. Oracle数据处理
  5. 秀!微软《550页图解.Net+WPF完整版》.pdf 附下载!
  6. fluent瞬态_瞬态环境
  7. NanoPC-T4 RK3399和PC有线本地网络传输摄像头视频python
  8. 卸载Microsoft Edge浏览器
  9. Charles接口模拟404/502
  10. python中将字符变为大写_python3.4.3将汉字转换为大写拼音首字母
  11. rust大量科技零件_20世纪的黑科技有上万个零件,复杂程度10个人9个看不懂!
  12. 记录,Cents 7 更改home和root的中文路径
  13. split,splice,slice 三者的用法
  14. elementUI中级联选择器的使用
  15. 计算机键盘灯光怎么关闭,笔记本怎么关键盘的灯_笔记本电脑关闭键盘背光的步骤-win7之家...
  16. PDF怎么编辑?如何设置页面?
  17. win7手动恢复注册表
  18. Java久居第一是因为这些
  19. (附源码)spring boot网上商品定制系统 毕业设计180915
  20. Archive of Our Own_为什么说for...of循环是JS中的宝石?

热门文章

  1. 派生类到基类的转换 和基类到派生类的转换
  2. golang中的strings.Repeat
  3. golang切片传参
  4. shell实例第5讲:检查软件包是否安装
  5. UART0串口编程(五):串口编程(UART0)之UC/OS(一)UC/OS下的串口发送任务编程
  6. IntelliJ IDEA创建maven web项目
  7. Spring Boot中使用JSP
  8. spring10: 引用类型的自动注入
  9. MongoDB数据节点基础操作
  10. 宜信开源|详解PaaS平台LAIN的功能和架构