Closed undefined303 closed 1 year ago
问题的根源是文件的所有组被设置成和文件所有用户一样了,就像本应该的u0_a177 ext_data_rw变成了u0_a177 u0_a177,而文件的权限位的“其他”字段又全是0,导致系统文件管理器也无权访问文件。
u0_a177 ext_data_rw
u0_a177 u0_a177
初步的测试,API level 29下(也不知道有没有问题是鸿蒙的原因)无此问题,也不会出现文件所有组改变的问题。以下就以API 33的模拟器来说明问题。
应用数据导入使用的是Rust tar crate的unpack_in方法。导入前后的文件和目录权限变化如下:
tar
unpack_in
emu64xa:/storage/emulated/0/Android/data/pers.zhc.tools $ ls -Rl .: total 8 drwxrws--- 3 u0_a177 ext_data_rw 4096 2023-07-12 19:57 files ./files: total 8 -drwxrws--- 3 u0_a177 ext_data_rw 4096 2023-07-12 19:57 some-tools-app +drwxr-xr-x 3 u0_a177 ext_data_rw 4096 2023-07-12 19:57 some-tools-app ./files/some-tools-app: total 8 -drwxrws--- 2 u0_a177 ext_data_rw 4096 2023-07-12 19:57 crash +drwxr-xr-x 2 u0_a177 u0_a177 4096 2023-07-12 19:57 crash ./files/some-tools-app/crash: total 8 --rw-rw---- 1 u0_a177 ext_data_rw 3433 2023-07-12 19:57 crash_2023-07-12_19-57-09_1689163029979.txt +-rw-rw---- 1 u0_a177 u0_a177 3433 2023-07-12 19:57 crash_2023-07-12_19-57-09_1689163029979.txt
我原以为是unpack_in方法会修改文件的uid和gid,但排查下来,原因其实是它改变了文件夹的权限位,然后当文件夹的权限从drwxrws---变到了drwxr-xr-x的时候,再在里面创建文件,文件的所有组会自动变成和所有用户同名,不知道为什么。因此就产生了上面的结果,adb shell的演示如下:
drwxrws---
drwxr-xr-x
adb shell
emu64xa:/storage/emulated/0/Android/data/pers.zhc.tools/demo $ mkdir d emu64xa:/storage/emulated/0/Android/data/pers.zhc.tools/demo $ touch d/1 emu64xa:/storage/emulated/0/Android/data/pers.zhc.tools/demo $ chmod 755 d emu64xa:/storage/emulated/0/Android/data/pers.zhc.tools/demo $ touch d/2 emu64xa:/storage/emulated/0/Android/data/pers.zhc.tools/demo $ ls -lp d total 8 -rw-rw---- 1 shell ext_data_rw 0 2023-07-12 20:09 1 -rw-rw---- 1 shell shell 0 2023-07-12 20:10 2
可以看到文件2就拥有了一样名字的所有组和所有用户。
2
https://github.com/bczhc/some-tools/commit/b34602dd9579de4ac888f0ce3465b16761047cc6 不再使用unpack_in,而是手动创建文件并写入,来修复问题。
问题的根源是文件的所有组被设置成和文件所有用户一样了,就像本应该的
u0_a177 ext_data_rw
变成了u0_a177 u0_a177
,而文件的权限位的“其他”字段又全是0,导致系统文件管理器也无权访问文件。初步的测试,API level 29下(也不知道有没有问题是鸿蒙的原因)无此问题,也不会出现文件所有组改变的问题。以下就以API 33的模拟器来说明问题。
应用数据导入使用的是Rust
tar
crate的unpack_in
方法。导入前后的文件和目录权限变化如下:我原以为是
unpack_in
方法会修改文件的uid和gid,但排查下来,原因其实是它改变了文件夹的权限位,然后当文件夹的权限从drwxrws---
变到了drwxr-xr-x
的时候,再在里面创建文件,文件的所有组会自动变成和所有用户同名,不知道为什么。因此就产生了上面的结果,adb shell
的演示如下:可以看到文件
2
就拥有了一样名字的所有组和所有用户。https://github.com/bczhc/some-tools/commit/b34602dd9579de4ac888f0ce3465b16761047cc6 不再使用
unpack_in
,而是手动创建文件并写入,来修复问题。