Android 应用沙盒浅析

· android

其实这是一个存在很久的概念,只是近几年Android开发者才开始适配。他如同Linux和ios那样,应用单独储存却又可以互相交互。下面就来说一下这其中有什么

1. 沙盒

首先看官方的解释

Android 平台利用基于用户的 Linux 保护机制识别和隔离应用资源,可将不同的应用分隔开来,并保护应用和系统免受恶意应用的攻击。为此,Android 会为每个 Android 应用分配一个独一无二的用户 ID (UID),并让应用在自己的进程中运行。

Android 会使用该 UID 设置一个内核级应用沙盒。内核会在进程级别利用标准的 Linux 机制(例如,分配给应用的用户 ID 和组 ID)实现应用和系统之间的安全防护。默认情况下,应用不能彼此交互,而且对操作系统的访问权限会受到限制。如果应用 A 尝试执行恶意操作(例如在没有权限的情况下读取应用 B 的数据或拨打电话),系统会阻止此类行为,因为应用 A 没有相应的默认用户权限。这一沙盒机制非常简单,可审核,并且基于已有数十年历史的 UNIX 风格的进程用户隔离和文件权限机制。

首先我们要来简单说一下SELinux的概念。SELinux就是Security-Enhanced Linux(安全增强型Linux),https://github.com/SELinuxProject/selinux 。Android 使用SELinux对包括root/su在内的所有进程进行控制强制访问权限(MAC,mandatory access control)。

下面来说一下,各个Android版本之间的应用间保护机制:

2. 沙盒内容分享

数据文件/二进制文件 : content provider

不多赘述

物理媒体文件 :储存

Google推荐使用MediaStore 进行媒体文件储存,读取时使用MediaStore.Download 读取。 注意,这里的APP的intent必须使用ACTION_OPEN_DOCUMENT 属性。

Google 强调新APP需要使用分区储存,APP在自己data文件下储存内容即可,使用MediaStore进行媒体文件共享。如果你实在需要访问外部数据(之后的高版本系统可能被禁),那么你需要首先判断 Environment.getExternalStorageState() 的返回状态,当返回MEDIA_MOUNTED时,你可以在外部空间进行读写。返回MEDIA_MOUNTED_READ_ONLY时,你只可以进行读取。

共享集合空间的文件访问推荐使用MediaStore、MediaProvider进行适配。

其他

权限

r=读取属性  //值=4

w=写入属性  //值=2

x=执行属性  //值=1

7=4+2+1 ,5=4+1,3=2+1,6=4+2,0=没有权限

751 = 给file的属主分配读、写、执行(7)的权限,给file的所在组分配读、执行(5)的权限,给其他用户分配执行(1)的权限

700 依次类推