Android 文件权限
查看权限
Android 是基于 Linux 衍生的,在很多地方和 Linux 保持高度一致,比如文件权限管理。我们可以在adb shell
和 Linux终端
中,通过命令 ls -la
分别看到 Android 和Linux 的文件权限信息。
比如在 adb shell
看到这样的内容是这样的:
drwxr-xr-x 4 root root 100 2015-01-01 01:05 storage
dr-xr-xr-x 15 root root 0 2015-01-01 01:04 sys
drwxr-xr-x 19 root root 4096 1970-01-01 08:00 system
lrwxrwxrwx 1 root root 14 1970-01-01 08:00 vendor -> /system/vendor
在 Linux
终端中看到的内容是这样的:
drwxrwxr-x 2 shawn shawn 4096 Sep 6 14:45 release
-rwxrwxr-x 1 shawn shawn 1277 Oct 15 09:37 remake
-rwxrwxr-x 1 shawn shawn 1276 Oct 15 09:37 rmPropFiles
drwxrwxr-x 24 shawn shawn 4096 May 30 15:28 sdk
drwxrwxr-x 28 shawn shawn 4096 May 30 15:28 system
可以看到输出的信息基本一致,其中最后一列是文件名(或路径),而第一列就是权限信息
;剩下的除了第二列的数字可能不明白以外,其它列应该都能猜到是什么意思。
这里只关注第一列的权限信息
,但这一串子母和横线的组合是什么意思呢?
权限组成
权限信息则由4部分
组成,分别是:文件类型、用户权限、用户组权限、其他组用户权限
,以上面部分信息为例就是这样定义的:
其中,权限里面 “-
” 表示不具备该权限;文件类型里面“-
”表示普通文件,也就是我们日常理解的文件。在 Linux 下,文件的概念很宽泛,如下内容均叫做“文件”:
权限的组成知道了,可怎么修改权限?
修改权限
首先要知道修改权限的命令:chmod
,其使用方法如下:
chmod MODE FILE...
这里 MODE
就是要改成的权限;FILE
表示目标文件,其后的...
表示文件可以有多个。
1、MODE 是3位数字
我们知道,机器运算是以二进制进行的,二进制内容机器不需要转换就能懂,因此二进制的操作在一定程度上能提升运算速度。这里的权限管理也采用二进制表示,但人是很难理解这些 01 组合的,因此设计了这个rwx
的表示方法,它们的对应关系如下:
举个栗子:
假设有文件 text.log,只有创建者有所有权限,其他用户没有任何权限,那它就是这样的:
如果要把权限改成所有用户都有,也就是rwxrwxrwx
,按对应关系就是这样:
因此命令应该这么写:
chmod 777 text.log
这种方法每次设置都要计算3组值,然后拼成参数。那么当只需要修改某一组的权限时,有没有更简单直接的方法呢?
2、MODE 是字母组合
上面说了,为了方便给人看,设计了 rwx 来表示权限。同时设计者也提供了更直观的权限修改方法,但在介绍这个方法之前,还是再提下这几个权限组:
- user:文件拥有者,表示为 u
- group:文件拥有者所在的用户组,表示为 g
- other:其它用户,表示为 o
- all:所有用户,表示为 a
基于这种表示方法,就有了下面这种更简单直观的权限修改方法
chmod 用户+权限 FILE...
还是用上面的栗子,改成 rwxrwxrwx
,那这里的写法就是:
chmod a+rwx text.log
这里意思就是给 a
用户添加 rwx
权限。如果只需要给 o
用户添加 rw
权限,只需要这么写:
chmod o+rw text.log
说明
上面的十进制说法是个人理解,我的理解是3 组 rwx 的二进制单独运算
,然后拼起来组成参数。
但实际应该是八进制表示的,把 3 组 rwx 的二进制当作一个整体,也就是当作一个 9 位二进制数去运算,然后将结果转换成 3 位八进制数,也就是这样:
3位八进制数因为 3个二进制位表示的最大数也只有7,因此个人认为就按十进制还更好理解一点。