android 应用间共享数据,调用其他app数据资源
在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确定processRecord
public 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通过共享用户ID来实现多Activity进程共享
android 应用间共享数据,调用其他app数据资源的更多相关文章
- android组件间共享数据的常用方法
使用Intent在激活组件的时候携带数据,以进行数据的传递 使用广播进行组件间数据的伟递 使用外部存储(sharedPreference,文件,数据库,网络)进行组件间数据共享 使用Static静态成 ...
- 两个android程序间的相互调用(apk互调)
通常我们用到的只是activity之间的互相跳转和调用,很少会用到apk级别的互相调用. 往往在一些应用上会用到,比如一个支付系统,可能会有很多的一系列的程序调用到:彩票系统.订票系统.团购网……全部 ...
- Android应用中使用AsyncHttpClient来异步网络数据(转载)
摘要: 首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测 ...
- Android应用中使用AsyncHttpClient来异步网络数据
首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测试的Ac ...
- 【转】Android应用中使用AsyncHttpClient来异步网络数据
摘要: 首先下载AsyncHttpClient的库文件,可以自行搜索,可以到下面地址下载 http://download.csdn.net/detail/xujinyang1234/5767419 测 ...
- APP数据埋点分类方式
1.数据埋点的重要性 在现实工作中,数据的整体流程为:数据生产-数据采集-数据处理-数据分析和挖掘-数据可视化,其中,数据采集是很重要的一个环节,数据采集得全不全.对不对,直接决定数据广度和质 ...
- App数据指标
App数据指标 1 App数据指标 2 参考资料 超详细的APP数据指标体系分析
- 在 App 扩展和主 App 间共享数据
tags: iOS 8,Swift,App Groups 随着 iOS 8 的发布,苹果为广大开发者很多新的 API,其中最突出显著的就非 App Extension 莫属了.这为开发者们又带来了很多 ...
- 应用间共享数据方法(一)---sharepreferce
SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数. SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/ ...
随机推荐
- [独孤九剑]Oracle知识点梳理(十)%type与%rowtype及常用函数
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- 深入理解http/https之缓存 2
1:web缓存的实现 web缓存: WEB缓存(cache)位于Web服务器和客户端之间. 缓存会根据请求保存输出内容的副本,例如html页面,图片,文件,当下一个请求来到的时候:如果是相同的URL, ...
- Operating System-进程/线程内部通信-信号量和PV操作
本文介绍操作系统进程管理的两个核心概念: 信号量 PV操作 一.信号量介绍 1.1 信号量引入 信号量(Semaphore)1965年由Dijkstra引入的.信号量一般由一个值是一个变量,其值有可能 ...
- js中call apply方法的使用介绍
js call call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, ...
- Ubuntu14.04LTS上安装Pip
pip是一个安装和管理Python包的工具.在Pip的帮助下,你可以安装独特版本的包. 最重要的是,Pip可以通过一个“requirements”的工具来管理一个由包组成的列表和版本号. Pip很像e ...
- 函数指针的应用学习Demo
学习函数指针的应用 ,简单demo #include "stdafx.h" #include "SubClass.h"; //函数指针 typedef int ...
- 01-19asp.net网站--关于“应用程序中的服务器错误(需添加"Jquery"ScriptRescourseMapping)”
一般打开网页进行加载时(有缓存),会弹出以下对话框. 但是如果网页加载后出现以下错误,就是应用程序的问题了.如果出现这种问题,就需要在安装Csharp的根目录下,找到一个名为.dll结尾的Jquery ...
- clang: error: linker command failed with exit code 1 (use -v to see invocation) 无法定位的问题
编译出现错误:linker command failed with exit code 1 找到Build settings->Linking->Other Linker Flags,将此 ...
- DAY18-Django之分页和中间件
分页 Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views h ...
- 免安装Oracle客户端使用PL/SQL连接Oracle
只需要在Oracle下载一个叫Instant Client Package的软件就可以了,这个软件不需要安装,只要解压就可以用了,很方便,就算重装了系统还是可以用的. 下载地址:http://www. ...