• Android ShareUserId 使用总结


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

      下面我们看看ShareUserId的作用,数据共享、调用其他程序资源。

    (PS:新建的QQ群,有兴趣可以加入一起讨论:Android群:322599434)

    1、获取相同ShareUserId程序的Context

    
    
    //Edited by mythou
    //http://www.cnblogs.com/mythou/
    //第一个应用程序为的menifest文件代码如下:
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mythou.serviceID"
    android:versionCode="1"
    android:versionName="1.0"
    android:sharedUserId="com.mythou.share"
    
    >
    //.......
    //第二个应用程序的menifest文件代码如下:
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mythou.clientID"
    android:versionCode="1"
    android:versionName="1.0"
    android:sharedUserId="com.mythou.share"
    >

      上面给出了两个程序的menifest定义,两者共用一个ShareUserId,下面我们看看从一个程序里面如何获取另外一个程序的Context。假设我们从package=“com.mythouclientID”的程序获取package="com.mythou.serviceID"的程序的context:

    //Edited by mythou
    //http://www.cnblogs.com/mythou/
    Context ct=this.createPackageContext("com.mythou.serviceID", Context.CONTEXT_IGNORE_SECURITY);

    2、利用StartActivity启动其他应用的

      当我们在不同的application中,如application A中的Activity去start一个application B中的Activity,也许你什么Exception都不会得到,也可能会直接Force Close掉。因为再Start Activity时,代码是有去检验permission的。 Uid是用户ID,Android中每个程序都有一个Uid,默认情况下,Android会给每个程序分配一个普通级别互不相同的 Uid,如果用互相调用,只能是Uid相同才行,这就使得共享数据具有了一定安全性,每个软件之间是不能随意获得数据的。而同一个application 只有一个Uid,所以application下的Activity之间不存在访问权限的问题。 但是不同的Application下的应用,访问Activity的时候就存在权限问题。如果设置同一个ShareUserId可以避免这种情况。

      下面补充一点,如何共享一个程序的数据,如果你需要做一个application,将某些服务service,provider或者activity等的数据,有三个办法可以方便共享数据。 


    1、完全暴露,这就是android:exported=”true”的作用,而一旦设置了intentFilter之后,exported就默认被设置为true了,除非再强制设为false。当然,对那些没有intentFilter的程序体,它的exported属性默认仍然是false,也就不能共享出去。 

    2、权限提示暴露,这就是为什么经常要设置usePermission的原因,如果人家设置了 android:permission=”xxx.xxx.xx”那么,你就必须在你的application的Manufest中 usepermission xxx.xxx.xx才能访问人家的东西。 

    3、私有暴露,假如说一个公司做了两个产品,只想这两个产品之间可互相调用,那么这个时候就必须使用shareUserID将两个软件的Uid强制设置为一样的。这种情况下必须使用具有该公司签名的签名文档才能,如果使用一个系统自带软件的ShareUID,例如Contact,那么无须第三方签名。 

    3、利用ShareUserID共享数据

      两个应用的ShareUserId相同,则共享对方的data目录下的文件,包括SharePreference, file, lib等文件,而不是资源文件。 要共享资源文件(图片,layout, string等),并不需要ShareUserId相同,普通方法就能拿到,但前提是你自己的应用里已经有了名字相同的资源文件,这样R文件才能找到那个id,否则编译器报错。 当然你也可以使用上面的获取context,然后读取资源。下面给出普通情况下读取其他程序资源办法:

        
    //Edited by mythou
    //http://www.cnblogs.com/mythou/
        try {
                Context ct=this.createPackageContext ("com.mythou.serviceID", Context.CONTEXT_IGNORE_SECURITY);
                String str = ct.getString(R.string.appname);
                Log.d("mythou", str);
            } catch (NameNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 

      下面我们看看拥有相同的UID的时候,如何访问data下数据

        
    //Edited by mythou
    //http://www.cnblogs.com/mythou/
        try {
                Context ct=this.createPackageContext ("com.mythou.serviceID", Context.CONTEXT_IGNORE_SECURITY);
                SharedPreferences sp = ct.getSharedPreferences("appInfo", MODE_PRIVATE);
                String str2 = sp.getString("appname", "service");
                Log.d("mythou", "share preference-->" + str2);
            } catch (NameNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 

    两个应用ShareUserId相同,包名相同或不同,打包时签名文件必须相同否则,在如下情况下,第二个安装包在安装时会失败,错误为[INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]:
    1.包名相同,签名相同,ShareUserId不同
    2.包名相同或不同,ShareUserId相同,签名不同

    2013-8-15

    Edited by 泡泡糖

    Edited by mythou

    原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3258715.html 

  • 相关阅读:
    2020_java面试
    Centos7.2 安装docker、mysql和redis
    【源码讲解】Spring事务是如何应用到你的业务场景中的?
    奇葩说今晚聊前任|扒一扒你的前任企业邮箱
    一封一封邮件发送太累?个人邮箱快速群发解决烦恼
    企业邮箱客户端收发服务器如何设置?
    163VIP邮箱怎么设置邮件签名?如何群发邮件?
    企业版邮箱哪个适合学校邮箱?企业邮箱托管服务
    企业版邮箱购买哪个?公司邮箱如何申请?
    公司邮箱登录入口是?公司邮箱申请入口在?
  • 原文地址:https://www.cnblogs.com/mythou/p/3258715.html
Copyright © 2020-2023  润新知