Android权限之sharedUserId和签名

摘要:
也就是说,只有具有相同签名和相同sharedUserID标记的两个应用程序签名将被分配相同的用户ID。例如,如果与媒体/下载相关的所有APK都使用android.media作为sharedUserID,则它们必须具有相同的签名媒体。您可以看到,在Launcher和其他系统中,所有使用android.media作为共享UID的APK都会在manifest节点中添加android:sharedUserId=“android.mmedia”,然后在android.mk中添加LOCAL _ CERTIFICATE:=media

转载地址:http://blog.csdn.net/hmg25/article/details/6447067

 最近在做个东西,巧合碰到了sharedUserId的问题,所以收集了一些资料,存存档备份。

    安装在设备中的每一个apk文件,Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户都会被分配到一个属于自己的统一的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它)。用户ID 在应用程序安装到设备中时被分配,并且在这个设备中保持它的永久性。

通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样.

对于一个APK来说,如果要使用某个共享UID的话,必须做三步:

1、在Manifest节点中增加android:sharedUserId属性。

2、在Android.mk中增加LOCAL_CERTIFICATE的定义。

如果增加了上面的属性但没有定义与之对应的LOCAL_CERTIFICATE的话,APK是安装不上去的。提示错误是:Package com.test.MyTest has no signatures that match those in shared user android.uid.system; ignoring!也就是说,仅有相同签名和相同sharedUserID标签的两个应用程序签名都会被分配相同的用户ID。例如所有和media/download相关的APK都使用android.media作为sharedUserId的话,那么它们必须有相同的签名media。

3、把APK的源码放到packages/apps/目录下,用mm进行编译。

举例说明一下。

系统中所有使用android.uid.system作为共享UID的APK,都会首先在manifest节点中增加android:sharedUserId="android.uid.system",然后在Android.mk中增加LOCAL_CERTIFICATE := platform。可以参见Settings等

系统中所有使用android.uid.shared作为共享UID的APK,都会在manifest节点中增加android:sharedUserId="android.uid.shared",然后在Android.mk中增加LOCAL_CERTIFICATE := shared。可以参见Launcher等

系统中所有使用android.media作为共享UID的APK,都会在manifest节点中增加android:sharedUserId="android.media",然后在Android.mk中增加LOCAL_CERTIFICATE := media。可以参见Gallery等。

另外,应用创建的任何文件都会被赋予应用的用户标识,并且正常情况下不能被其他包访问。当通过getSharedPreferences(String,int)、openFileOutput(String、int)或者openOrCreate Database(String、int、SQLiteDatabase.CursorFactory)创建一个新文件时,开发者可以同时或分别使用MODE_WORLD_READABLE和MODE_WORLD_RITEABLE标志允许其他包读/写此文件。当设置了这些标志后,这个文件仍然属于自己的应用程序,但是它的全局读/写和读/写权限已经设置,所以其他任何应用程序可以看到它。

关于签名:

build/target/product/security目录中有四组默认签名供Android.mk在编译APK使用:

1、testkey:普通APK,默认情况下使用。

2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。

3、shared:该APK需要和home/contacts进程共享数据。

4、media:该APK是media/download系统中的一环。

应用程序的Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定用哪个key签名,未指定的默认用testkey.

对于使用eclipse编译的apk,可以使用signapk.jar来手动进行签名,其源码在build/tools/signapk下,编译后在out/host/linux-x86/framework/signapk.jar,也可以从网上下载。使用方法,以platform为例:java -jar ./signapk platform.x509.pem platform.pk8 input.apk output.apk  (platform.x509.pem platform.pk8在build/target/product/security获取)

免责声明:文章转载自《Android权限之sharedUserId和签名》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS-App的启动页设置XDS100V3开发工具制作成功与经验分享下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android的一些常用命令提示符(cmd)指令[转]

1、在命令行管理模拟器设备(AVD) list:列出机器上所有已经安装的Android版本和AVD设备 list avd:列出机器上所有已经安装的AVD设备; list target:列出机器上所有已经安装的Android版本 create avd:创建一个AVD设备 delete avd:删除一个AVD设备 update avd:升级一个AVD设备使其...

APP版本更新通知流程图

一、APP版本更新通知流程图如下: 二、测试注意点:   1、Android更新直接下载APK,IOS引导至APP Store更新页面;   强制更新------只有“立即更新”   1、一般“强制更新”的机制不常用,除非涉及到APP的紧急且致命缺陷的修复,或者是与用户monkey密切相关的问题,或许才会使用“强制更新”机制;   2、不点击“立即更新”...

android 系统重启与关机:java 代码实现

在应用层如何通过代码实现 android 系统的重启,分享给大家。 这篇博客是在 android 系统开发的基础之上进行实践的,所以如果你是纯粹的 app 开发,可能要让你失望了。 该代码在真机上测试成功,在模拟器上面测试失败。 在 linux 下面,重启 pc,非 root 用户需要执行 sudo reboot,所以在 android 下重启机器也需...

零开始Android逆向教程(一)——初探Android逆向

 这段时间因为某些业务驱动,开始研究一些逆向相关的东西,浏览了下其所包含的大致内容,发现真是一个新大陆,跟之前耳听目染过的一些门面介绍完全不是一个层级的,真正的印证了下手难这一说法。   谨此以本文开始记录我的Android逆向之旅吧。总述   习惯于应用层开发的我们都知道,在应用上架的时候都需要程序经过编译、签名 、生成一个后缀为apk的文件才能发布到应...

Android APK反编译详解(附图) (转至 http://blog.csdn.net/ithomer/article/details/6727581)

本文Android反编译教程,测试环境: Win7 Ultimate x64 Ubuntu 12.04 x86_x64 反编译工具包下载(2012-10-10更新) 一、Apk反编译得到Java源代码 下载上述反编译工具包,打开apk2java目录下的dex2jar-0.0.9.9文件夹,内含apk反编译成java源码工具,以及源码查看工具。 a...

Android APK加壳技术方案代码实现

本文章由Jack_Jia编写,转载请注明出处。   文章链接:http://blog.csdn.net/jiazhijun/article/details/8746917 作者:Jack_Jia    邮箱: 309zhijun@163.com  一、序言         在上篇“Android APK加壳技术方案”(http://blog.csdn....