Android中ShareUserId注意问题

转载 2015年07月09日 17:35:18

首先粘一段官方文档对ShareUserId的说明:

[plain] view plaincopy
  1. android:sharedUserId  
  2. The name of a Linux user ID that will be shared with other applications. By default, Android assigns each application its own unique user ID. However, if this attribute is set to the same value for two or more applications, they will all share the same ID — provided that they are also signed by the same certificate. Application with the same user ID can access each other's data and, if desired, run in the same process.  
网上对ShareUserId的说明已经很多,大部分都重复了,我在此只是补充说明一下:

如果两个应用的ShareUserId相同,则共享对方的data目录下的文件,包括SharePreference, file, lib等文件,而不是很多人所想的资源文件。

注意: 要共享资源文件(图片,layout, string等),并不需要ShareUserId相同,普通方法就能拿到,但前提是你自己的应用里已经有了名字相同的资源文件,这样R文件才能找到那个id,否则编译器报错。 方法如下:

[java] view plaincopy
  1. try {  
  2.         Context ct=this.createPackageContext ("com.example.shareb", Context.CONTEXT_IGNORE_SECURITY);  
  3.         String str = ct.getString(R.string.share);  
  4.         Log.d("Test", str);  
  5.     } catch (NameNotFoundException e) {  
  6.         // TODO Auto-generated catch block  
  7.         e.printStackTrace();  
  8.     }   

也就是说,当前项目里也必须有个string的名字叫share,这样编译器不会报错。当程序真正运行时,会自动寻找com.example.shareb 这个程序下的名字为share的string。

当然,如果ShareUserId相同,则可以通过如下方法访问对方SharePrefrence中的内容:

[java] view plaincopy
  1. try {  
  2.             Context ct=this.createPackageContext ("com.example.shareb", Context.CONTEXT_IGNORE_SECURITY);  
  3.             SharedPreferences sp = ct.getSharedPreferences("shareb", MODE_PRIVATE);  
  4.             String str2 = sp.getString("haha""");  
  5.             Log.d("Test""share preference-->" + str2);  
  6.         } catch (NameNotFoundException e) {  
  7.             // TODO Auto-generated catch block  
  8.             e.printStackTrace();  
  9.         }   
此时访问的是com.example.shareb这个应用下名字为shareb的xml文件中的key为haha的值(有点晕吧?)
于是有人可能会想: 会不会有安全问题啊? 比如我把我的ShareUserId搞得和你的一样,不就能任意访问你的文件了吗? 答案是否定的。 只有在如下条件下,才可以利用ShareUserId共享文件。
***两个应用ShareUserId相同,包名相同或不同,打包时签名文件必须相同***
否则,在如下情况下,第二个安装包在安装时会失败,错误为[INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]:
1.包名相同,签名相同,ShareUserId不同
2.包名相同或不同,ShareUserId相同,签名不同
所以建议大家在以后开发全新应用的时候,最好将ShareUserId加上,方便以后扩展。 否则,以后想加都没法加了,因为线上版本没有ShareUserId,而升级版有,那么这两个包根本就不兼容,所以肯定更新失败!

原文地址:http://blog.csdn.net/yinkai1205/article/details/8651329

相关文章推荐

Android逆向之旅---Android中的sharedUserId属性详解

一、前言今天我们来看一下Android中一个众人熟悉的一个属性:shareUserId,关于这个属性可能大家都很熟悉了,最近在开发项目,用到了这个属性,虽然知道一点知识,但是感觉还是有些迷糊,所以就写...

Android sharedUserId研究记录

转载于:http://www.cnblogs.com/wotakuc/archive/2013/03/27/2984423.html 签名简介: 在Android 系统中,所有安装到系统的应用程序...

Android ShareUserId 使用总结

今天讲一下Android里面经常看到却不太留意的知识点——ShareUserId,在Android里面每个app都有一个唯一的linux user ID,则这样权限就被设置成该应用程序的文件只对该用户...

Android中UID机制和共享进程

我们经常在一个activity中去start另一个activity,或者与另一个acitivity的结果进行交互(startActivityForResult)。但有没有想过可能会出现的permiss...

android:sharedUserId问题

android:sharedUserId问题 Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户 Shared ...
  • cigogo
  • cigogo
  • 2012年04月21日 10:20
  • 19291

INSTALL_FAILED_UPDATE_INCOMPATIBLE和INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

INSTALL_FAILED_UPDATE_INCOMPATIBLE INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]

在android studio中想要运行程序,点击运行后程序安装失败,报出如下异常: 原因:在manifest中设置了 .android:sharedUserId="android....

android 应用程序数据共享shareuserid篇+ContentResolver+ContentProvider

  android 应用程序数据共享shareuserid篇+ContentResolver+ContentProvider 收藏android 应用程序数据共享-sh...
  • debug2
  • debug2
  • 2011年02月18日 16:19
  • 4595

Android用shareUserID实现多个Activity显示在同一界面

近来整理文档,发现两年前研究Android多个Activity叠加显示的方案。时光荏苒,一去不回。虽然后来没有用上,但还是整理如下,Android版本还是2.2的: ActivityGroup描画方...

使用ShareUserId

一、Android系统回为每个应用分配一个唯一的UID,具有相同的UID的应用才能共享数据。两个应用通过ShareUID共享数据,需要相同的ShareUID之外还需要相同的签名才可以。在这种情况下他们...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中ShareUserId注意问题
举报原因:
原因补充:

(最多只允许输入30个字)