当前位置: 首页 > article >正文

Android读写权限分析

Android系统使用的是Linux内核,所以Android系统沿用了linux系统的那一套文件读写权限。

目录

  • 1,权限解读
    • 1.1,权限分为三种类型:
    • 1.2,权限针对的三类对象:
    • 1.3,文件和目录的权限区别
      • 1.3.1,对于文件
      • 1.3.2,对于目录
    • 1.4,权限查看实例
      • 1.4.1,文件类型和权限信息
      • 1.4.2,链接数
      • 1.4.3,所有者
      • 1.4.4,所属组
      • 1.4.5,文件大小
      • 1.4.6,时间戳
      • 1.4.7,文件名
  • 2,权限操作
    • 2.1,指令修改
      • 2.1.1,方法一
      • 2.1.2,方法二
      • 2.1.3,方法三
      • 2.1.4,目录递归赋权限
    • 2.2,代码修改
      • 2.2.1,Java层实现
      • 2.2.2,C++层实现

1,权限解读

在Linux系统中,读写权限是用来控制用户对文件或目录的访问权限的一种机制。按照用户与组进行分类,针对不同的群体进行了权限管理,用他来确定谁能通过何种方式对文件或目录进行访问和操作。
在这里插入图片描述
上面的这张图,涉及到一个文件linux权限的基本信息,包括文件类型、文件权限、以及对应的用户组等信息。

1.1,权限分为三种类型:

Read,读权限,缩写r
Write,写权限,缩写w
Execute,执行权限,缩写x
另,root用户不受文件权限的读写权限限制,但执行权限也会受限制。

1.2,权限针对的三类对象:

owner,文件所属主,缩写u
group,用户所属组,缩写g
other,其他不相关用户,缩写o

1.3,文件和目录的权限区别

对于文件和目录,r、w、x有着稍微不同的作用和含义:

1.3.1,对于文件

r:代表可读(read),可以读取、查看;
w:代表可写(write), 可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件;
x:代表可执行(execute),可以被执行;

1.3.2,对于目录

r:代表可读(read),可以读取,ls 查看目录内容;
w:代表可写(write),可以修改,对目录内创建+删除+重命名目录;
x:代表可执行(execute),可以进入该目录;

1.4,权限查看实例

adb登录android系统,通过ls -l查看,如果是linux系统,也可以 ll指令查看。

mt2712_saic_as33:/data/testrwx # ls -l
total 1724
-rw-r--r-- 1 root root 1759120 2024-11-25 12:42 adbd
lrwxrwxrwx 1 root root      17 2019-01-01 00:08 linktest -> data/testlink.txt
drwxrwxrwx 2 root root    4096 2019-01-01 00:33 testdir1
mt2712_saic_as33:/data/testrwx #

上面查询到的信息,一共分为7列。

1.4.1,文件类型和权限信息

第一列,第一个字符表示的是文件类型,其可能是普通文件、目录、符号链接等,可能的值如下:
-:普通文件,如上面的adbd文件的信息中,一个字符就是-
d:目录
l:符号链接
b:块设备文件
c:字符设备文件
s:套接字文件
p:命令管道文件
其余的字符分为三组,每组三个字符,分别代表文件所有者的权限、组内其他用户的权限和其他用户的权限。每组字符的含义如下:
r:可读权限(4)
w:可写权限(2)
x:可执行权限(1)
-:无权限(0)
整理第一列的权限表示如下表格式:
在这里插入图片描述
如前面adbd文件的权限为-rw-r–r–,参照上面的表,解读为adbd是个文件,所有者对这个文件可读可写不可执行,所属组用户对文件可读不可写不可执行,其他用户也对此文件可读不可写不可执行。
如果用数字来表示adbd文件权限,二进制应该为110100100,十进制应该为644。

1.4.2,链接数

这一列显示了文件的硬链接数。对于目录,这一列显示了目录下的子目录数。如果是普通文件,这一列显示为-。

1.4.3,所有者

这一列显示了文件的所有者用户名,如上面截图里的实际情况,为root用户,因为本人是root后adb登录创建的文件。

1.4.4,所属组

这一列显示了文件所属的用户组名称,如上面截图里的实际情况,为root组,因为本人是root后adb登录创建的文件。

1.4.5,文件大小

这一列显示了文件的大小,以字节为单位。对于目录,这一列显示为4096,为啥是4096呢??因为在 Linux/Android 系统中,‌目录本身是一种特殊类型的文件‌,它存储的是目录条目,系统会给目录分配固定大小的块(block),而默认block大小就是4096字节。

1.4.6,时间戳

这一列显示了文件的最后修改时间或最后访问时间,分为年月日和时分秒。具体显示的日期和时间取决于系统的配置和语言环境。

1.4.7,文件名

这一列显示了文件的名称。

2,权限操作

可以通过chmod指令来修改文件权限,或者也可以通过代码来修改。

2.1,指令修改

使用chmod指令修改,指令格式:chmod [选项] <文件名>
以如下adbd文件为例,修改前权限为:

mt2712_saic_as33:/data/testrwx # ls -l
total 1724
-rw-r--r-- 1 root root 1759120 2024-11-25 12:42 adbd
lrwxrwxrwx 1 root root      17 2019-01-01 00:08 linktest -> data/testlink.txt
drwxrwxrwx 2 root root    4096 2019-01-01 00:33 testdir1
mt2712_saic_as33:/data/testrwx #

有几种修改方式,如下。

2.1.1,方法一

示例执行指令chmod 776 adbd

mt2712_saic_as33:/data/testrwx # chmod 776 adbd
mt2712_saic_as33:/data/testrwx # ls -l
total 1724
-rwxrwxrw- 1 root root 1759120 2024-11-25 12:42 adbd
lrwxrwxrwx 1 root root      17 2019-01-01 00:08 linktest -> data/testlink.txt
drwxrwxrwx 2 root root    4096 2019-01-01 00:33 testdir1
mt2712_saic_as33:/data/testrwx #

可以看到adbd文件由-rw-r–r–变成了-rwxrwxrw-

2.1.2,方法二

上面是用776数字的方式来表示rwxrwxrw-权限,也可以不用数字而是直接用rwx方式来表示,示例如

mt2712_saic_as33:/data/testrwx # chmod u=rwx,g=rw,o=r adbd
mt2712_saic_as33:/data/testrwx # ls -l
total 1724
-rwxrw-r-- 1 root root 1759120 2024-11-25 12:42 adbd
lrwxrwxrwx 1 root root      17 2019-01-01 00:08 linktest -> data/testlink.txt
drwxrwxrwx 2 root root    4096 2019-01-01 00:33 testdir1
mt2712_saic_as33:/data/testrwx #

在执行chmod u=rwx,g=rw,o=r adbd指令后,adbd权限就变成了rwxrw-r–

文件权限的值可以通过字符也可以通过数字来表示,示例如下:
字符:rwx rw- r--
数字:111 110 100
	  7    6   4

2.1.3,方法三

指令格式:chmod [who opt per] file
这里的who、opt、per可能的值分别为:

  who:u g o a  //u表示文件所有者,g表示与文件所有者属于同一组的其他用户,o表示其他用户
  opt:+=	// + 、-、= 变更权限,+是增加,-是除去,=相同
  per:r w x X	//读、写、执行

示例如下

mt2712_saic_as33:/data/testrwx # ls -l
total 1724
-rwxrw-r-- 1 root root 1759120 2024-11-25 12:42 adbd
lrwxrwxrwx 1 root root      17 2019-01-01 00:08 linktest -> data/testlink.txt
drwxrwxrwx 2 root root    4096 2019-01-01 00:33 testdir1
mt2712_saic_as33:/data/testrwx # chmod o+w adbd
mt2712_saic_as33:/data/testrwx #
mt2712_saic_as33:/data/testrwx #
mt2712_saic_as33:/data/testrwx # ls -l
total 1724
-rwxrw-rw- 1 root root 1759120 2024-11-25 12:42 adbd
lrwxrwxrwx 1 root root      17 2019-01-01 00:08 linktest -> data/testlink.txt
drwxrwxrwx 2 root root    4096 2019-01-01 00:33 testdir1
mt2712_saic_as33:/data/testrwx #

这里的chmod o+w adbd,是指给文件adbd文件的other用户添加w写权限,所以权限从rwxrw-r–变成了rwxrw-rw-。

2.1.4,目录递归赋权限

上面介绍的一直是文件的权限,对于目录的权限也是一样的操作方式,对于目录-R是常用的一个参数,用于目录递归赋值权限。
示例,testdir1目录下还有个子目录testdir2目录,通过chmod -R XXX 目录,递归赋值权限

mt2712_saic_as33:/data/testrwx/testdir1 # ls -l
total 4
drw-rw---- 2 root root 4096 2019-01-01 01:56 testdir2 	//子目录testdir2原始权限为660
mt2712_saic_as33:/data/testrwx # chmod -R 766 testdir1	//对testdir1以及其子目录都赋值766权限
mt2712_saic_as33:/data/testrwx # ls -l
total 1724
-rwxrw-rw- 1 root root 1759120 2024-11-25 12:42 adbd
lrwxrwxrwx 1 root root      17 2019-01-01 00:08 linktest -> data/testlink.txt
drwxrw-rw- 3 root root    4096 2019-01-01 01:56 testdir1
mt2712_saic_as33:/data/testrwx # cd testdir1/
mt2712_saic_as33:/data/testrwx/testdir1 # ls -l
total 4
drwxrw-rw- 2 root root 4096 2019-01-01 01:56 testdir2	子目录testdir2修改后权限为766
mt2712_saic_as33:/data/testrwx/testdir1 #

2.2,代码修改

2.2.1,Java层实现

因为是对系统得文件做操作,可能会遇到操作权限得问题,比如permission权限和selinux,这些根据实际使用时报错来定位解决。java层实现方式如下所示:

	try {
		String command = "chmod 777 " + destFile.getAbsolutePath();
		Log.i("test", "command = " + command);
		Runtime runtime = Runtime.getRuntime(); 
        Process proc = runtime.exec(command);
     } catch (IOException e) {
        Log.i("test","chmod fail!!!!");
        e.printStackTrace();
     }

或者

File file = new File(context.getFilesDir(), "example.txt");
// 设置可读权限(所有者、组、其他用户)
boolean isReadable = file.setReadable(true, false); // 参数2: 是否递归子项(仅限目录)
// 设置可写权限
boolean isWritable = file.setWritable(true, false);
// 设置可执行权限(通常用于脚本文件)
boolean isExecutable = file.setExecutable(true, false);

2.2.2,C++层实现

通过系统方法chmod(file,mode)修改文件权限,首先你这个服务得有权限修改这个文件,这个操作可能会遇到selinux权限问题。

...
#include <sys/stat.h>//头文件
...
int changeFileRWX(const char* file_path, mode_t mode) {
	...
	int result = chmod(file_path, (mode_t) mode); //需要文件路径和所需权限即可
	...
}


http://www.kler.cn/a/613472.html

相关文章:

  • MFC(1)-odbc-ado-调用mysql,sqlserver
  • AI大模型从0到1记录学习 day08
  • Go 语言标准库中encoding/xml模块详细功能介绍与示例
  • 【QT5 多线程示例】异步编程
  • Java 实现将Word 转换成markdown
  • fyrox 2D和3D游戏的制作
  • uvm factory
  • android studio调试aosp手机userdebug版本无法查看局部变量和参数问题如何解决?
  • 设置github 代理
  • 解决PLC通信会断然后报错的问题
  • 相对位置2d矩阵和kron运算的思考
  • MFC中的窗口线程安全性与CWnd类
  • 从 YOLO11 模型格式导出到TF.js 模型格式 ,环境爬坑,依赖关系已经贴出来了
  • 智慧养老时代:老年人慢性病预防与生活方式优化
  • 【今日EDA行业分析】2025年3月28日
  • 基于扩散模型的光照编辑新突破:IC-Light方法解析与优化
  • DeepSeek大模型应用开发新模式
  • 智能舵机:AI融合下的自动化新纪元
  • ADZS-ICE-2000和AD-ICE2000仿真器在线升级固件
  • Error:Flash Download failed