一种是需要在Android系统源码的环境下用make来编译:
         1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。        2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
        3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。
LZ不会.mk编译这种方法,所以就只好参考第二种了:
        1. 加入android:sharedUserId="android.uid.system"这个属性。        2. 使用eclipse编译出未加签名的apk文件,但是这个apk文件是不能用的。
        3. 使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在我的Android源码目录中的位置是"build/target/product/security",下面的platform.pk8和platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在"build/tools/signapk"下,用法为"signapk platform.x509.pem platform.pk8 input.apk output.apk",文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。(上边的文件在上一个帖子中都发布过)
        这样最后得到的apk和第一个方法是一样的。

最后解释一下原理,首先加入android:sharedUserId="android.uid.system"这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就有权限来修改系统时间了。
       只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。
       这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key来签名,程序在模拟器上运行OK,不过放到G3上安装直接提示"Package ... has no signatures that match those in shared user android.uid.system",这样也是保护了系统的安全。
       最后还说下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的。

转自: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获取)

转载于:https://www.cnblogs.com/bigben0123/p/4308372.html

Android权限之sharedUserId和签名相关推荐

  1. android卸载应用权限管理,android 权限管理和签名 实现静默卸载

    为了实现静默卸载, 学了下android的安全体系,记录如下 最近在做个东西,巧合碰到了sharedUserId的问题,所以收集了一些资料,存存档备份. 安装在设备中的每一个apk文件,Android ...

  2. Android 权限(一):权限大全

    1. 前言 Android 中应用权限有助于保护对以下数据和操作的访问/执行权限,从而为保护用户隐私提供支持: 1. 受限数据,例如系统状态和用户的联系信息 2. 受限操作,例如连接到已配对的设备并录 ...

  3. 【转】Android权限获取机制与常见权限不足问题分析

    转自:http://blog.csdn.net/linweig/article/details/6127488# Android系统是运行在Linux内核上的,Android与Linux分别有自己的一 ...

  4. Android应用apk的程序签名详解

    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1009/423.html 编辑推荐:稀土掘金,这是一个高质量的技术干货分享社区, ...

  5. Android权限申请的学习实践

    1.引子 在换到Android手机之前,对Android系统的印象是这系统app的跑马场,app可以任意索取各种权限,随意窃取各种隐私,换手机后才知道Android系统对权限的管理已有很大的改观,索取 ...

  6. android 一个字符串分两行显示_重新梳理Android权限管理

    Android Developer指南中,对Android安全体系结构的核心有这么一个说法:默认情况下,任何应用程序都无权执行任何会对其他应用程序.操作系统或者用户产生负面影响的操作.这句话其实就很好 ...

  7. Android权限详解

    权限的介绍 权限是一种安全机制,在默认情况下任何应用都没有权限执行对其他应用.操作系统或用户有不利影响的任何操作.包括读取或写入用户的私有数据(例如联系人或电子邮件).读取或写入其他应用程序的文件.执 ...

  8. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  9. (转)Android权限列表permission说明 (一)

    网络上不乏android权限列表,但是很少有将列表和使用方法放在一起的,所以特此总结一下 需要在AndroidManifest.xml中定义相应的权限(以获取internet访问权限为例),如下: X ...

  10. Android权限说明大全

    对应表 权限 CONTACTS API级别:23 叙述:联系人和配置文件相关的运行时权限. 名称 保护等级 API级别 叙述 READ_CONTACTS 危险 1 允许应用读取用户联系人数据. WRI ...

最新文章

  1. java并发订单号生成
  2. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
  3. hive sql操作
  4. 开发流媒体服务器_Github选出10大开源免费的RTSP流媒体项目
  5. OpenGL clipdistance剪辑距离实例
  6. 菜鸟学ASP.NET MVC4入门笔记
  7. Springboot的异步、定时、邮件任务
  8. [bzoj1191][HNOI2006]超级英雄Hero
  9. yum install -y iptraf 显示找不到命令
  10. LeetCode每日一题:2.两数相加
  11. 宁波python学习_python学习第二十天
  12. cisco ***笔记
  13. Spring Cloud Config分布式配置中心(学习总结)
  14. Kali安装Googel拼音输入法
  15. 2014最好的IT简历提示
  16. 5款cpu温度检测工具,让你时刻关注mac的工作情况!
  17. 骑着单车追随你——西西里的美丽传说
  18. 优秀平面设计师如何培养自己的创意思维
  19. macbook air 重置mysql密码
  20. linux 内存告警门限,H3C LA系列无线网关 配置指导(V7)-R0304-6W100_基础配置指导_设备管理配置-新华三集团-H3C...

热门文章

  1. Jenkins 官网文档翻译汇总
  2. HBase学习之路 (十一)HBase的协过滤器
  3. FPGA实现任意分频 为所欲为——教你什么才是真正的任意分频
  4. php教程笔记复习1-ajax
  5. C# mvc4.0 MD5测试
  6. 马云:大部分失败企业都是因为不够专注
  7. 人性的弱点---第三篇---得人同意于你的十二种方法3
  8. 使用reportlab生成条码
  9. 映射文件实现进程通信
  10. 组件Button的简单用法