Permission3自定义应用权限

该文档描述了应用程序开发人员如何使用Android提供的安全特性来定义自己的权限。通过定义自定义权限,应用程序可以与其他应用程序共享资源和功能

背景


Android是一个特权分离的操作系统,在这个系统中,每个应用程序都运行一个不同的系统标识(Linux用户标识和组标识)。系统的部分也被分离成不同的身份。因此,Linux将应用程序与系统隔离开来。
应用程序可以通过定义其他应用程序可以请求的权限向其他应用程序公开它们的功能。它们还可以定义与相同证书签署的任何其他应用程序自动可用的权限。

应用程序签名(就是是否接受使用同签名)


所有apk都必须使用由其开发人员持有的私钥的证书进行签名。此证书标识应用程序的作者。证书不需要由证书颁发机构签署;这是完全允许的,而且是典型的,Android应用程序使用自签名证书。Android中证书的目的是区分应用程序作者。这允许系统授予或拒绝应用程序对签名级别权限的访问,以及授予或拒绝应用程序与其他应用程序相同的Linux标识。
用户ID和文件访问


在安装时,Android会给每个包一个不同的Linux用户ID,在这个设备上,这个ID在包的整个生命周期中都是不变的。在不同的设备上,相同的包可能有不同的UID;重要的是每个包在给定的设备上都有一个不同的UID。
由于安全性强制发生在进程级别(process level),因此任何两个包的代码通常不能在同一个进程中运行,因为它们需要作为不同的Linux用户运行。您可以在AndroidManifest中使用sharedUserId属性。xml的每个包的manifest标记为它们分配相同的用户ID,通过这样做,为了安全起见,这两个包将被视为具有相同用户ID和文件权限的相同应用程序。注意,为了保持安全性,只有两个签名相同的应用程序(以及请求相同的sharedUserId)将获得相同的用户ID。

自定义用户权限


要执行自己的权限,必须首先在AndroidManifest中声明它们。使用一个或多个<permission>元素的xml。
例如,一个想要控制谁可以开始其活动的应用程序可以声明此操作的权限如下:

<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.myapp" >
    
    <permission
      android:name="com.example.myapp.permission.DEADLY_ACTIVITY"
      android:label="@string/permlab_deadlyActivity"
      android:description="@string/permdesc_deadlyActivity"
      android:permissionGroup="android.permission-group.COST_MONEY"
      android:protectionLevel="dangerous" />
    ...
</manifest>

注意:系统不允许多个包声明具有相同名称的自定义权限,除非所有包都用相同的证书签名。如果包声明一个权限,系统不允许用户安装具有相同权限名的其他包,除非这些包与第一个包签署了相同的证书。为了避免命名冲突,我们建议使用反向域样式的命名来命名自定义权限,例如com.example.myapp.ENGAGE_HYPERSPACE。
android:protectionLevel 为权限的安全级别,这里按从低到高的顺序有以下四种:

  1. normal:默认值。一种风险较低的权限,不需要用户显示同意。
  2. dangerous:高风险权限,需要显示请求用户同意。
  3. signature:只有该权限的申请者和请求者有相同的签名时才被允许。(签名限制)
  4. signatureOrSystem:旧版“signature|privileged”的同义词。在API级别23中被弃用。
    系统只授予位于Android系统映像的专用文件夹中的应用程序或与声明权限的应用程序签署相同证书的应用程序的权限。避免使用此选项,因为签名保护级别应该足以满足大多数需求,并且不管应用程序安装在什么地方都可以工作。“signatureOrSystem”权限用于某些特殊情况,在这些特殊情况下,多个供应商将应用程序构建到系统映像中,并且需要显式地共享特定的特性,因为它们是构建在一起的。(就是比signature多了一个可允许的条件:系统应用)

permissionGroup属性是可选的,只用于帮助系统向用户显示权限。在大多数情况下,您应该将其设置为一个标准的系统组(在android.Manifest.permission_group中列出),尽管您可以自己定义一个组。最好使用一个现有的组,因为这样可以简化显示给用户的权限UI。

您需要为权限提供一个标签(label)和描述(description)。当用户查看权限列表(android:label)或单个权限细节(android:description)时,可以看到这些字符串资源。标签应简短;描述权限所保护的关键功能的几个词。描述应该是几个句子描述权限允许持有者做什么。我们的约定是两句话的描述:第一句描述权限,第二句警告用户,如果应用程序被授予权限,可能会出错。
下面是CALL_PHONE权限的标签和描述示例:(这个好像不简短啊..)

<string name="permlab_callPhone">directly call phone numbers</string>
<string name="permdesc_callPhone">Allows the app to call
    phone numbers without your intervention. Malicious apps may
    cause unexpected calls on your phone bill. Note that this does not
    allow the app to call emergency numbers.</string>

创建一个权限组
如前一节所示,可以使用android:permissionGroup属性帮助系统向用户描述权限。在大多数情况下,您希望将其设置为一个标准的系统组(在android.Manifest.permission_group中列出),但是您也可以使用<permission-group>定义您自己的组。
<permission-group>元素为一组permission定义了一个标签——包括在manifest中声明为<permission>的元素和在别处声明的元素。这只影响在呈现给用户时如何将权限分组。<permission-group>元素没有指定属于组的权限,但它给组一个名称。
通过将组名分配给<permission>元素的permissionGroup属性,可以在组中放置权限。
<permission-tree>元素为代码中定义的一组权限声明一个名称空间。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,479评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 系统权限 Android 是一个权限分隔的操作系统,其中每个应用都有其独特的系统标识(Linux 用户 ID 和组...
    进攻的蚂蚁阅读 2,190评论 0 0
  • 20170721如意分享: 1,妞儿今天靠自己找到了乘公交车的站点,顺利到达目的地; 2,妞儿在马老师那里表现非常...
    随如阅读 336评论 0 0
  • 很久之前我就想要一个自己的家,不是说爱情,婚姻,陪伴! 我就是想设计一个属于自己的小窝,我妈喜欢整洁,那种连贴壁纸...
    不爱疯婆子阅读 209评论 0 0