和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、安全架构设计
二、应用签名
三、用户ID 和文件访问
四、使用权限
五、正常权限和危险权限
六、自定义权限
七、动态申请权限案例
Android
是一个权限分隔的操作系统,其中每个应用都有其独特的系统标识(Linux
用户ID
和组 ID
)。系统各部分也分隔为不同的标识。Linux
据此将不同的应用以及应用与系统分隔开来。
其他更详细的安全功能通过“权限”机制提供,此机制会限制特定进程可以执行的具体操作,并且根据URI
权限授权临时访问特定的数据段。
一、 安全架构设计
Android
安全架构的中心设计点是:
在默认情况下任何应用都没有权限执行对其他应用、操作系统或用户有不利影响的任何操作。这包括读取或写入用户的私有数据(例如联系人或电子邮件)、读取或写入其他应用程序的文件、执行网络访问、使设备保持唤醒状态等。
由于每个 Android
应用都是在进程沙盒中运行,因此应用必须显式共享资源和数据。它们的方法是声明需要哪些权限来获取基本沙盒未提供的额外功能。应用以静态方式声明它们需要的权限,然后Android
系统提示用户同意。
二、应用签名
所有APK(.apk 文件)
都必须使用证书签署,其私钥由开发者持有。此证书用于识别应用的作者。证书不需要由证书颁发机构签署;Android
应用在理想情况下可以而且通常也是使用自签名证书。证书在 Android
中的作用是识别应用的作者。这允许系统授予或拒绝应用对签名级权限的访问,以及授予或拒绝应用获得与另一应用相同的 Linux
身份的请求。
比如:
声明一个安全权限,可用于限制对此或其他应用程序的特定组件或功能的访问。
权限声明
三、用户ID 和文件访问
在安装时,Android
为每个软件包提供唯一的 Linux
用户 ID
。此ID
在软件包在该设备上的使用寿命期间保持不变。在不同设备上,相同软件包可能有不同的 UID
;重要的是每个软件包在指定设备上的UID
是唯一的。
由于在进程级实施安全性,因此任何两个软件包的代码通常都不能在同一进程中运行,因为它们需要作为不同的 Linux
用户运行。您可以在每个软件包的 AndroidManifest.xml
的 manifest
标记中使用 sharedUserId
属性,为它们分配相同的用户ID
。这样做以后,出于安全目的,两个软件包将被视为同一个应用,具有相同的用户ID
和文件权限。
为保持安全性,只有两个签署了相同签名(并且请求相同的 sharedUserId
)的应用才被分配同一用户ID
。
应用存储的任何数据都会被分配该应用的用户ID
,并且其他软件包通常无法访问这些数据。使用 getSharedPreferences(String, int)、openFileOutput(String, int)
或 openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory)
创建新文件时,可以使用 MODE_WORLD_RE