• 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 安全机制

    APK安装过程及原理详解

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

  • 相关阅读:
    基于密度的dbScan轨迹聚类
    更新yum 源
    搭建git linux 服务器
    富文本编辑器
    轨迹聚类分析问题
    hdu3078(lca / RMQ在线)
    zoj3195(lca / RMQ在线)
    hdu2874(lca / tarjan离线 + RMQ在线)
    hdu2586(lca模板 / tarjan离线 + RMQ在线)
    高斯消元求解方程组(模板)
  • 原文地址:https://www.cnblogs.com/sihaixuan/p/4438198.html
Copyright © 2020-2023  润新知