`

Android中startActivity中的permission检测与UID机制

 
阅读更多
感谢:http://yelinsen.iteye.com/blog/977683

我们经常在一个activity中去start另一个activity,或者与另一个acitivity的结果进行交互(startActivityForResult)。但有没有想过可能会出现的permission问题呢?如果你遇到了permission denial的Exception,那么你需要读读这篇文章啦。

我们在同一个application内部,可以随意的startActivity from Activity A to Activity B,而官方的文档中说startActivity可能会报NotFoundException,表示被start的Activity不存在。因此,我们很容易忽略另一个可能的Exception,Permission Denial。

当我们在不同的application中,如application A中的Activity去start一个application B中的Activity,也许你什么Exception都不会得到,也可能会直接Force Close掉。因为再Start Activity时,代码是有去检验permission的。

如下情况,可以成功startActivity而不会得到permission denial

1、同一个application下

2、Uid相同

3、permission匹配

4、目标Activity的属性Android:exported=”true”

5、目标Activity具有相应的IntentFilter,存在Action动作或其他过滤器并且没有设置exported=false

6、启动者的Pid是一个System Server的Pid

7、启动者的Uid是一个System Uid(Android规定android.system.uid=1000,具有该Uid的application,我们称之为获得Root权限)

如果上述调节,满足一条,一般即可(与其他几条不发生强制设置冲突),否则,将会得到Permission Denial的Exception而导致Force Close。

现在,我来解释一下Uid机制

众所周知,Pid是进程ID,Uid是用户ID,只是Android和计算机不一样,计算机每个用户都具有一个Uid,哪个用户start的程序,这个程序的Uid就是那个那个用户,而Android中每个程序都有一个Uid,默认情况下,Android会给每个程序分配一个普通级别互不相同的Uid,如果用互相调用,只能是Uid相同才行,这就使得共享数据具有了一定安全性,每个软件之间是不能随意获得数据的。而同一个application只有一个Uid,所以application下的Activity之间不存在访问权限的问题。

如果你需要做一个application,将某些服务service,provider或者activity等的数据,共享出来怎么办,三个办法。

1、完全暴露,这就是android:exported=”true”的作用,而一旦设置了intentFilter之后,exported就默认被设置为true了,除非再强制设为false。当然,对那些没有intentFilter的程序体,它的exported属性默认仍然是false,也就不能共享出去。

2、权限提示暴露,这就是为什么经常要设置usePermission的原因,如果人家设置了android:permission=”xxx.xxx.xx”那么,你就必须在你的application的Manufest中usepermission xxx.xxx.xx才能访问人家的东西。

3、私有暴露,假如说一个公司做了两个产品,只想这两个产品之间可互相调用,那么这个时候就必须使用shareUserID将两个软件的Uid强制设置为一样的。这种情况下必须使用具有该公司签名的签名文档才能,如果使用一个系统自带软件的ShareUID,例如Contact,那么无须第三方签名。

这种方式保护了第三方软件公司的利益于数据安全。

当然如果一个activity是又system process跑出来的,那么它就可以横行霸道,任意权限,只是你无法开发一个第三方application具有系统的Pid(系统Pid不固定),但是你完全可以开发一个具有系统Uid的程序,对系统中的所有程序任意访问,只需再Manufest中声明shareUserId为android.system.uid即可,生成的文件也必须经过高权限签名才行,一般不具备这种审核条件的application,google不会提供给你这样的签名文件。当然你是在编译自己的系统的话,想把它作成系统软件程序,只需在Android.mk中声明Certificate:platform则可以了,既采用系统签名。这个系统Uid的获得过程,我们把它叫做获得Root权限的过程。所以很多第三方系统管理软件就是有Root权限的软件,因为他需要对系统有任意访问的权限。那么它的Root签名则需要和编译的系统一致,例如官方的系统得用官方的签名文件,CM的系统就得用CM的签名文件。
分享到:
评论

相关推荐

    Android权限管理之Permission权限机制及使用详解

    本文将详细介绍Permission权限机制及其在Android系统中的使用。 首先,Permission权限机制是Android系统为了防止恶意软件或者未经授权的操作而设计的一种安全措施。权限分为普通权限和危险权限两大类。普通权限通常...

    Android权限列表permission说明.txt

    - **权限名称**:"android.permission.SET_ACTIVITY_WATCHER" - **应用场景**:通常用于性能分析工具或自动化测试框架。 #### 14. SIGNAL_PERSISTENT_PROCESSES - **定义**:允许应用程序向持久进程发送信号。 - **...

    Android权限列表permission说明.

    - **声明**:需要在`androidmanifest.xml`文件中添加`<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />`。 2. **ACCESS_FINE_LOCATION** - **定义**:用于获取精确位置信息,如GPS...

    android 自定义Permission

    在Android系统中,权限管理是保障应用安全性和用户隐私的重要机制。默认情况下,Android提供了许多预定义的权限,如访问互联网、读写联系人等。然而,在某些特殊场景下,开发者可能需要创建自定义权限(Custom ...

    Android Permission 辅助检测和申请工具库.zip

    总的来说,"Android Permission 辅助检测和申请工具库"是Android开发者处理权限问题的强大助手,它简化了权限检测和申请的过程,提高了开发效率,同时也提升了用户体验。通过研究和使用PermissionUtils-master的源码...

    android.permission大全

    ### Android.Permission大全知识点详解 #### 一、概述 在Android应用开发过程中,权限管理是非常重要的一环。合理的权限设置不仅可以保障用户的隐私安全,还可以确保应用的正常运行。本篇文章将详细介绍部分...

    Pro Android学习:permission例子

    在Android开发中,权限管理是应用安全性和隐私保护的关键组成部分。`Pro Android`学习系列深入探讨了Android平台的各种方面,其中“permission”部分专门讲解如何处理应用权限。在这个例子中,我们将详细了解Android...

    Android利用Intent启动和关闭Activity

    在Android应用程序开发中,Intent是连接各个组件(如Activity、Service等)的关键桥梁,主要用于启动和关闭Activity。Intent不仅能够启动一个新的Activity,还能在Activity之间传递数据,实现应用内部或应用间的交互...

    Android的socket长连接(心跳检测)

    - Android中使用Socket需要注意权限问题,需要在Manifest.xml中添加Internet权限:`<uses-permission android:name="android.permission.INTERNET" />` - 注意异常处理,如SocketTimeoutException、IOException等...

    Android权限列表permission说明

    Android权限列表permission说明,希望可以帮助到大家

    Android自定义权限permission

    在Android系统中,权限机制是保护应用程序数据和功能的关键组件,它允许开发者控制其他应用或系统服务对特定功能的访问。本实例将深入探讨如何在Android中创建和使用自定义权限,这对于理解Android的安全模型至关...

    Android版本检测安装

    在Android开发中,版本检测与安装是至关重要的环节,它涉及到用户体验、软件兼容性和安全性等多个方面。本文将深入探讨Android版本检测安装的相关知识点,并提供实际操作的指导。 首先,了解Android版本检测的基本...

    Android中wifi检测

    在Android系统中,WiFi检测是一项重要的功能,它允许应用程序实时监测和管理用户的WiFi连接状态。本文将深入探讨如何在Android应用中实现WiFi检测,包括使用`WifiManager`接口以及处理网络权限。 首先,我们需要...

    Android OpenCv 人脸检测

    本项目专注于利用OpenCV实现Android应用中的人脸检测功能,包括正脸检测和侧脸检测。一旦检测到人脸,会在屏幕上实时绘制矩形框,以便清晰地标识出人脸位置。 **OpenCV在Android中的集成** 在Android项目中使用...

    Android自定义action与permission_java_action_

    在《Android自定义action与permission的方法教程》PDF中,你将找到更详细的步骤和示例,包括如何在代码中检查权限、如何在Intent中使用自定义Action,以及如何处理权限请求等。这份教程将帮助你更好地理解和掌握这两...

    android检测U盘插拔事件

    在Android系统中,检测U盘(USB存储设备)的热插拔事件是一项常见的需求,尤其在开发与USB设备交互的应用时。"android检测U盘插拔事件"这个标题揭示了我们要探讨的核心技术点:如何在Android应用中监听并处理U盘的...

    Android 悬浮Activity ( Dialog风格)

    在Android开发中,"悬浮Activity"通常指的是一个可以悬浮在其他应用之上,类似Dialog样式但功能更为丰富的Activity。这样的设计可以提供用户一种便捷的方式访问或操作应用,而无需完全退出当前正在使用的应用。悬浮...

    Android 安全与权限 Security Permission

    Android 安全与权限 Security Permission Android 安全架构的中心思想是确保应用程序在默认情况下不能执行任何对其他应用程序、系统或用户带来负面影响的操作。为了实现这个目标,Android采用了多种机制,包括进程...

    android permission 访问权限大全

    在Android操作系统中,权限管理是保护用户数据和设备安全的关键机制。每个应用程序在运行时,如果需要访问特定的系统资源或执行敏感操作,必须先在`AndroidManifest.xml`文件中声明所需权限。以下是对给定文件中列出...

Global site tag (gtag.js) - Google Analytics