Android : 添加apk私有权限
一、Android的系统权限:
apk在安装时,Android 为每个软件包提供唯一的 Linux 用户 ID。此 ID 在软件包在该设备上的使用寿命期间保持不变。在不同设备上,相同软件包可能有不同的 UID;重要的是每个软件包在指定设备上的 UID 是唯一的。
由于在进程级实施安全性,因此任何两个软件包的代码通常都不能在同一进程中运行,因为它们需要作为不同的 Linux 用户运行。您可以在每个软件包的AndroidManifest.xml 的 manifest 标记中使用 sharedUserId 属性,为它们分配相同的用户 ID。这样做以后,出于安全目的,两个软件包将被视为同一个应用,具有相同的用户 ID 和文件权限。请注意,为保持安全性,只有两个签署了相同签名(并且请求相同的 sharedUserId)的应用才被分配同一用户 ID。
在没有获得对应权限的情况下,当对一个app进程进行访问或操作时会报 SecurityException 异常,如下尝试绑定一个后台服务权限异常的log:
- ::22.334 W/ActivityManager( ): Permission Denial: Accessing service ComponentInfo{com.cmcc.media.hfp.aidl/com.cmcc.media.hfp.aidl.RemoteService} from pid=, uid= requires com.cmcc.media.hfp.aidl.NANO_REMOTE_SERVICE
- ::22.340 E/AndroidRuntime(): FATAL EXCEPTION: main
- ::22.340 E/AndroidRuntime(): Process: com.example.administrator.nano_server, PID:
- ::22.340 E/AndroidRuntime(): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.administrator.nano_server/com.example.administrator.nano_server.MainActivity}: java.lang.SecurityException: Not allowed to bind to service Intent { act=com.cmcc.media.hfp.client.service pkg=com.cmcc.media.hfp.aidl }
- ::22.340 E/AndroidRuntime(): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:)
- ::22.340 E/AndroidRuntime(): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:)
- ::22.340 E/AndroidRuntime(): at android.app.ActivityThread.access$(ActivityThread.java:)
- ::22.340 E/AndroidRuntime(): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:)
- ::22.340 E/AndroidRuntime(): at android.os.Handler.dispatchMessage(Handler.java:)
- ::22.340 E/AndroidRuntime(): at android.os.Looper.loop(Looper.java:)
- ::22.340 E/AndroidRuntime(): at android.app.ActivityThread.main(ActivityThread.java:)
- ::22.340 E/AndroidRuntime(): at java.lang.reflect.Method.invokeNative(Native Method)
- ::22.340 E/AndroidRuntime(): at java.lang.reflect.Method.invoke(Method.java:)
- ::22.340 E/AndroidRuntime(): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:)
- ::22.340 E/AndroidRuntime(): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:)
- ::22.340 E/AndroidRuntime(): at dalvik.system.NativeStart.main(Native Method)
- ::22.340 E/AndroidRuntime(): Caused by: java.lang.SecurityException: Not allowed to bind to service Intent { act=com.cmcc.media.hfp.client.service pkg=com.cmcc.media.hfp.aidl }
- ::22.340 E/AndroidRuntime(): at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:)
- ::22.340 E/AndroidRuntime(): at android.app.ContextImpl.bindService(ContextImpl.java:)
- ::22.340 E/AndroidRuntime(): at android.content.ContextWrapper.bindService(ContextWrapper.java:)
- ::22.340 E/AndroidRuntime(): at com.example.administrator.nano_server.MainActivity.m(MainActivity.java:)
- ::22.340 E/AndroidRuntime(): at com.example.administrator.nano_server.MainActivity.onStart(MainActivity.java:)
- ::22.340 E/AndroidRuntime(): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:)
- ::22.340 E/AndroidRuntime(): at android.app.Activity.performStart(Activity.java:)
- ::22.340 E/AndroidRuntime(): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:)
- ::22.340 E/AndroidRuntime(): ... more
- 如果设备运行的是 Android 6.0(API 级别 23)或更高版本,并且应用的 targetSdkVersion 是 23 或更高版本,则应用在运行时向用户请求权限。用户可随时调用权限,因此应用在每次运行时均需检查自身是否具备所需的权限
- 如果设备运行的是 Android 5.1(API 级别 22)或更低版本,并且应用的 targetSdkVersion 是 22 或更低版本,则系统会在用户安装应用时要求用户授予权限。如果将新权限添加到更新的应用版本,系统会在用户更新应用时要求授予该权限。用户一旦安装应用,他们撤销权限的唯一方式是卸载应用
二、自定义&使用权限
1.为何要定义私有权限?假设开发一个后台服务跟特定的client app做交互,但是有人反编译了服务端应用的代码,取得了 AIDL 接口定义和应用的包名以及特定action后,就可以直接绑定service,然后通过 AIDL 调用服务端的远程方法进行随意操作,因此服务端就需要对请求连接的客户端进行权限验证。
2.要定义私有权限,必须先使用一个或多个< permission >元素在 AndroidManifest.xml (系统源码在\frameworks\base\core\res\)中声明它们,例如读取电话号码权限:
<!-- Allows read access to the device's phone number(s). This is a subset of the capabilities
granted by {@link #READ_PHONE_STATE} but is exposed to ephemeral applications.
<p>Protection level: dangerous-->
<permission android:name="android.permission.READ_PHONE_NUMBERS"
android:permissionGroup="android.permission-group.PHONE"
android:label="@string/permlab_readPhoneNumbers"
android:description="@string/permdesc_readPhoneNumbers"
android:protectionLevel="dangerous|ephemeral" />
权限包含一系列属性,包括:权限的名称、权限所属的权限组,权限的标记,标题、描述和权限的等级:
android:permissionGroup
该属性用于指定权限所属的权限组,在上例中的android.permission-group.PHONE权限组的定义如下:
<!-- Used for permissions that are associated telephony features. -->
<permission-group android:name="android.permission-group.PHONE"
android:icon="@drawable/perm_group_phone_calls"
android:label="@string/permgrouplab_phone"
android:description="@string/permgroupdesc_phone"
android:priority="" />
对于权限组需要注意的一点:如果已经取了权限组中的其中一个权限,那么系统会允许获取该权限组的其它保护等级相同或者更低的权限。比如在6.0以上系统通过运行时权限获取到了android.permission.CALL_PHONE这个权限,那么同属于同一组的权限android.permission.READ_PHONE_STATE 就不需要再通过运行时权限机制获取了。
permissionFlags:
给该权限设置对应的标志,比如:costsMoney,代表获取该权限有可能会造成费用。
label:
给该权限设置标题。
description:
给该权限设置描述。
priority:
指定了该权限的优先等级。
icon:
给该权限设置图标。
protectionLevel:
指定了该权限的保护等级。保护等级主要有:normal、dangerous、signature、signatureOrSystem四种:
①normal:默认值。较低风险的权限,对其他应用、系统和用户来说风险最小。系统在安装应用时会自动批准授予应用该类型的权限,不要求用户明确批准(但可以选择查看这些权限)。
②dangerous:较高风险的权限,请求该类型权限的应用程序会访问用户私有数据或对设备进行控制,从而可能对用户造成负面影响。因为这种类型的许可引入了潜在风险,所以系统可能不会自动将其授予请求的应用。例如,系统可以向用户显示由应用请求的任何危险许可,并且在继续之前需要确认,或者可以采取一些其他方法来避免用户自动允许。
③signature:只有在请求该权限的应用与声明权限的应用使用相同的证书签名时,系统才会授予权限。如果证书匹配,系统会自动授予权限而不通知用户或要求用户的明确批准。
④signatureOrSystem:仅授予Android系统映像中与声明权限的应用使用相同的证书签名的应用(system app)。请避免使用此选项,“signature”级别足以满足大多数需求,“signatureOrSystem”权限用于某些特殊情况。
3.要使用受保护的系统功能,必须在应用清单中包含一个或多个 < uses-permission > 标记:
如下给自己的service申明一个权限:
<permission
android:name="com.cmcc.media.hfp.aidl.NANO_REMOTE_SERVICE"
android:protectionLevel="signature" />
设定权限:android:permission="com.cmcc.media.hfp.aidl.NANO_REMOTE_SERVICE"
<application
<service
android:name="com.cmcc.media.hfp.aidl.RemoteService"
android:permission="com.cmcc.media.hfp.aidl.NANO_REMOTE_SERVICE"
android:exported="true"’> <intent-filter>
<!-- client端唤醒 -->
<action android:name="com.cmcc.media.hfp.client.service" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
</application>
client端app获取service的权限:
<!-- 获取访问 service 的权限" -->
<uses-permission android:name="com.cmcc.media.hfp.aidl.NANO_REMOTE_SERVICE" />
-end-
Android : 添加apk私有权限的更多相关文章
- Android添加代码检查权限
1,首先创建一个项目,然后创建一个类,hello.java public class hello { public static final String PERMISSION_SAY_HELLO = ...
- Android 自动更新 + IIS7 添加APK mime
如果APK文件放在IIS下面需要添加APK的mime,否则会出现下面错误 可以在IIS上添加mime映射 .apk application/vnd.android 下面内容转自:http://ww ...
- Android动态添加Device Admin权限
/********************************************************************** * Android动态添加Device Admin权限 ...
- Android 添加网络权限
[Android 添加网络权限] <uses-permission Android:name="android.permission.INTERNET"></us ...
- Android O 获取APK文件权限 Demo案例
1. 通过 aapt 工具查看 APK权限 C:\Users\zh>adb pull /system/priv-app/Settings . /system/priv-app/Settings/ ...
- 添加xmlns:android="http://schemas.android.com/apk/res/android"的意思
http://www.cnblogs.com/lovely/archive/2013/01/17/2865192.html xmlns:android="http://schemas.and ...
- Android开发之深入理解Android 7.0系统权限更改相关文档
http://www.cnblogs.com/dazhao/p/6547811.html 摘要: Android 6.0之后的版本增加了运行时权限,应用程序在执行每个需要系统权限的功能时,需要添加权限 ...
- 将HTML5封装成android应用APK文件的几种方法
越来越多的开发者热衷于使用html5+JavaScript开发移动Web App.不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数.一方面,用户在使用习惯上,不喜 ...
- 将HTML5封装成android应用APK文件的几种方法(转载)
越来越多的开发者热衷于使用html5+JavaScript开发移动Web App.不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数.一方面,用户在使用习惯上,不喜 ...
随机推荐
- sql 聚合函数和group by 联合使用
原文 很多时候单独使用聚合函数的时候觉得很容易,求个平均值,求和,求个数等,但是和分组一起用就有点混淆了,好记性不如烂笔头,所以就记下来以后看看. 常用聚合函数罗列 1 AVG() - 返回平均值 C ...
- word中的交叉引用
分别使用“交叉引用”依次插入所需应用文献编号范围的第一个和最后一个. 所需引用处出现“[1][3]” 在引用处对两个编号操作:点击鼠标右键-选择“切换域代码”. [1]变为” {REF _Ref4 ...
- OnSen UI结合AngularJs打造”美团"APP首页 --Hybrid Ap
1.页面效果图: 演示链接地址:http://www.nxl123.cn/bokeyuan/meiTuanDemo_home/ 2.核心代码 home.html: <ons-page id=&q ...
- Python基础之文件的基本操作
概述:文件的基本操作1.open 打开文件 f = open("xxx",mode="r",encoding="utf-8") #常用形式 ...
- 【微信公众号开发】【13】批量导出公众号所有用户信息到Excel
前言: 1,一次拉取调用最多拉取10000个关注者的OpenID,当公众号关注者数量超过10000时,可通过填写next_openid的值,从而多次拉取列表的方式来满足需求 2,获取OpenID列表后 ...
- Hybrid APP架构设计思路
通讯 作为一种跨语言开发模式,通讯层是Hybrid架构首先应该考虑和设计的,往后所有的逻辑都是基于通讯层展开. Native(以Android为例)和H5通讯,基本原理: Android调用H5:通过 ...
- MySQL 分页查询和存储过程
一.分页查询 使用limit函数,limit关键字的用法: LIMIT [offset,] rows: offset指定要返回的第一行的偏移量,rows第二个指定返回行的最大数目.初始行的偏移量是0( ...
- python 小练习3
求大蜜题:给你两个正整数a(0 < a < 100000)和n(0 <= n <=100000000000),计算(a^n) % 20132013并输出结果 ret = 1 d ...
- Homebrew 安装mysql
在mac上安装软件,无疑安装一个brew是个很好的选择,关于brew是什么,怎么安装建议去brew官网查看, 附上地址:brew官网 还有一篇博文 http://www.cnblogs.com/xd ...
- 485. Max Consecutive Ones最大连续1的个数
网址:https://leetcode.com/problems/max-consecutive-ones/ 很简单的一题 class Solution { public: int findMaxCo ...