Android : 添加apk私有权限

一、Android的系统权限:

  apk在安装时,Android 为每个软件包提供唯一的 Linux 用户 ID。此 ID 在软件包在该设备上的使用寿命期间保持不变。在不同设备上,相同软件包可能有不同的 UID;重要的是每个软件包在指定设备上的 UID 是唯一的。

  由于在进程级实施安全性,因此任何两个软件包的代码通常都不能在同一进程中运行,因为它们需要作为不同的 Linux 用户运行。您可以在每个软件包的AndroidManifest.xmlmanifest 标记中使用 sharedUserId 属性,为它们分配相同的用户 ID。这样做以后,出于安全目的,两个软件包将被视为同一个应用,具有相同的用户 ID 和文件权限。请注意,为保持安全性,只有两个签署了相同签名(并且请求相同的 sharedUserId)的应用才被分配同一用户 ID。

  在没有获得对应权限的情况下,当对一个app进程进行访问或操作时会报 SecurityException 异常,如下尝试绑定一个后台服务权限异常的log:

01-01 13:57:22.334 W/ActivityManager( 2108): Permission Denial: Accessing service ComponentInfo{com.cmcc.media.hfp.aidl/com.cmcc.media.hfp.aidl.RemoteService} from pid=16297, uid=10038 requires com.cmcc.media.hfp.aidl.NANO_REMOTE_SERVICE
01-01 13:57:22.340 E/AndroidRuntime(16297): FATAL EXCEPTION: main
01-01 13:57:22.340 E/AndroidRuntime(16297): Process: com.example.administrator.nano_server, PID: 16297
01-01 13:57:22.340 E/AndroidRuntime(16297): 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 }
01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2248)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ActivityThread.access$900(ActivityThread.java:136)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1197)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.os.Handler.dispatchMessage(Handler.java:102)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.os.Looper.loop(Looper.java:136)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ActivityThread.main(ActivityThread.java:5046)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at java.lang.reflect.Method.invokeNative(Native Method)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at java.lang.reflect.Method.invoke(Method.java:515)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:861)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:677)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at dalvik.system.NativeStart.main(Native Method)
01-01 13:57:22.340 E/AndroidRuntime(16297): 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 }
01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1727)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ContextImpl.bindService(ContextImpl.java:1691)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.content.ContextWrapper.bindService(ContextWrapper.java:517)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at com.example.administrator.nano_server.MainActivity.m(MainActivity.java:326)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at com.example.administrator.nano_server.MainActivity.onStart(MainActivity.java:303)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.Activity.performStart(Activity.java:5247)
01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2171)
01-01 13:57:22.340 E/AndroidRuntime(16297):     ... 11 more

  

  • 如果设备运行的是 Android 6.0(API 级别 23)或更高版本,并且应用的 targetSdkVersion23 或更高版本,则应用在运行时向用户请求权限。用户可随时调用权限,因此应用在每次运行时均需检查自身是否具备所需的权限
  • 如果设备运行的是 Android 5.1(API 级别 22)或更低版本,并且应用的 targetSdkVersion22 或更低版本,则系统会在用户安装应用时要求用户授予权限。如果将新权限添加到更新的应用版本,系统会在用户更新应用时要求授予该权限。用户一旦安装应用,他们撤销权限的唯一方式是卸载应用

二、自定义&使用权限

  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="500" />

   对于权限组需要注意的一点:如果已经取了权限组中的其中一个权限,那么系统会允许获取该权限组的其它保护等级相同或者更低的权限。比如在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-

    

原文地址:https://www.cnblogs.com/blogs-of-lxl/p/9444539.html

时间: 2024-08-08 12:45:53

Android : 添加apk私有权限的相关文章

Android 自动更新 + IIS7 添加APK mime

如果APK文件放在IIS下面需要添加APK的mime,否则会出现下面错误 可以在IIS上添加mime映射 .apk application/vnd.android   下面内容转自:http://www.cnblogs.com/coolszy/archive/2012/04/27/2474279.html 由于Android项目开源所致,市面上出现了N多安卓软件市场.为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量.因此

添加xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;的意思

http://www.cnblogs.com/lovely/archive/2013/01/17/2865192.html xmlns:android="http://schemas.android.com/apk/res/android 声明xml命名空间.xmlns意思为“xml namespace”.冒号后面是给这个引用起的别名.schemas是xml文档的两种约束文件其中的一种,规定了xml中有哪些元素(标签).元素有哪些属性及各元素的关系,当然从面向对象的角度理解schemas文件可以

Android开发之深入理解Android 7.0系统权限更改相关文档

摘要: Android 6.0之后的版本增加了运行时权限,应用程序在执行每个需要系统权限的功能时,需要添加权限请求代码(默认权限禁止),否则应用程序无法响应:Android 7.0在Android 6.0的基础上,对系统权限进一步更改,这次的权限更改包括三个方面: APP应用程序的私有文件不再向使用者放宽 Intent组件传递file://URI的方式可能给接收器留下无法访问的路径,触发FileUriExposedException异常,推荐使用FileProvider DownloadMana

Android 7.0动态权限大总结

应公司项目需求,做了下Android 7.0适配.对于我们程序员,适配7.0主要就是对手机本地文件的Uri做转换处理.注意红色字体,意思也就是说对于http开头的等等,非手机存储中的文件就不用管了.Uri.parse("package") 这样的也不用管!!!!! 7.0的适配,就是对手机存储中的私有文件路径的保护,当系统发现你通过intent带走了一个uri,地址是本地的文件,就会限制的.其他的原理普及请搜索其他文章吧,此处略. 下面贴一下使用步骤和我的工具类. 一.需要修改当前mo

android 添加桌面快捷方式

.在桌面创建快捷方式方法: 方法一:通过长按某一个应用程序的图标在桌面上创建启动该应用程序的快捷方式. 这个方法安装完程序都用户都能实现. 方法二:在应用程序中构建一个Intent,然后以Broadcast的形式通知Launcher创建快捷方式. 先看Launcher的AndroidMainfest.xml文件中InstallShortcutReceiver的注册信息: Xml代码   <!--设置wallpapaer的activity --> <!-- Intent received 

[android] 手机卫士设备管理权限锁屏

设备管理员 Device Admin 获取DevicePolicyManager对象,通过getSystemService(DEVICE_POLICY_MANAGER),设备策略管理器 调用DevicePolicyManager对象的lockNow()方法,锁定,此时会报 安全异常 新建一个类MyAdmin继承系统的DeviceAdminReceiver,这个是广播接收者 清单文件进行注册 添加<receiver>节点,设置名称 设置权限 android:permission=”android

Android 下载APK 安装APK 打开APK

今天有了一个这样的需求 :下载一个apk文件,然后当你下载完成后,按钮的文字发生改变,变成点击安装,然后安装完成之后,变成打开. 这是下载apk的方法: /** * 后台在下面一个Apk 下载完成后返回下载好的文件 * * @param httpUrl * @return */ private File downFile(final String httpUrl) { new Thread(new Runnable() { @Override public void run() { try {

将HTML5封装成android应用APK文件的几种方法(转载)

越来越多的开发者热衷于使用html5+JavaScript开发移动Web App.不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数.一方面,用户在使用习惯上,不喜欢在浏览器上输入复杂的网址:另一方面,Html5 Web App 存放在服务器端,在每次使用时需要进行数据传递,会造成流量浪费.有些开发者不想接触复杂的JAVA代码,那么,有什么办法,既可以使用HTMl5开发应 用,又可以将其简单封装成APK文件呢? 一.Android SDK中的WebView1.

【转】Android M(6.0) 权限爬坑之旅

原文网址:https://yanlu.me/android-m6-0-permission-chasm/ 有一篇全面介绍Android M 运行时权限文章写的非常全面:Android M 新的运行时权限开发者需要知道的一切,但是实施过程中还是遇到一些坑. 坑一:用Android5.0编译的apk,在Android6.0上运行完全没有问题. 在Android6.0以上才需要在运行时请求权限,在旧Android版本上保留原有逻辑,安装时授予权限. 用旧版本sdk编译的apk,都使用旧版本权限方式,安