Android APP权限之sharedUserId和签名

Android会根据manifest中声明 userid给每个APK进程分配一个单独 户空间,所以不同APK( 户)间互相访问数据默认是禁止
但是它也提供了2种APK间共享数据 形式:

1. Share Preference. / Content Provider
APK可以 指定接口和数据给任何其他APK读取. 需要自己实现接口和Share 数据.
本文对于这个不做详细解释

2. Shared User id
通过Shared User id,拥有同一个User id 多个APK可以配置成运行在同一个进程中.所以默认就是
可以互相访问任意数据. 也可以配置成运行成不同 进程, 同时可以访问其他APK 数据目录下
数据库和文件.就像访问本程序 数据一样.
比如某个公司开发了多个Android 程序, 那么可以把数据,图片等资源集中放到APK  A中去. 然后
这个公司 所有APK都使 同一个User ID, 那么所有 资源都可以从APK A中读取.
举个例子:
APK A 和APK B 都是C公司 产品,那么如果 户从APK A中登陆成功.那么打开APK B 时候就不
再次登陆. 具体实现就是 A和B设置成同一个User ID:
    * 在2个APK AndroidManifest.xml 配置User ID:
   
    package="com.android.demo.a1"
    android:sharedUserId="com.c">
   这个"com.c" 就是user id, 然后packagename APK A就是上面 内容,  APK B可能
   是"com.android.demo.b1" 这个没有限制

这个设定好之后, APK B就可以像打开本地数据库那样 打开APK A中 数据库了.
APK A把登陆信息存放在A 数据目录下面. APK B每次启动 时候读取APK A下面 数据库
判断是否已经登陆:
APK B中 代码:
            friendContext = this.createPackageContext(
                    "com.android.demo.a1",
                    Context.CONTEXT_IGNORE_SECURITY);
通过A package name 就可以得到A  packagecontext,通过这个context就可以直接打开数据库

对于一个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.

你可能感兴趣的:(Android编译与反)