android - 如何操作应用的私有数据目录(删除, 重新创建后的linux权限/selinux权限恢复)
注: 需root
应用私有数据目录, 通常在 /data/data/[packageName] 下.
"通常" 是指的的是不涉及"android多用户"的时候, 注意是android多用户, 不是linux或其他的什么多用户.
/data/data/[packageName] 路径等价于 /data/user/0/[packageName].
"/data/user/0/[packageName]" 里面的0就是用户 id, 多用户下, 其他用户的id替换这个0 就是其他用户下, 本应用的私有数据路径.
可以参考小米/魅族 手机的"应用分身功能" 即基于android多用户.你root了手机, 就可以手动操作应用私有数据.(反之, 不root, 你用adb无法访问)
废话不多说, 直接上操作:(操作图/ 操作解说)
// 1> 应用私有目录被删除:
moasm:~/_tmp/0512/files/logs$ adb shell ls -alh /data/data/com.duoxxx.xxxx/
ls: /data/data/com.duoxxx.xxxx/: No such file or directory
// 2> 尝试恢复/重新创建之:
moasm:~/_tmp/0512/files/logs$ adb shell mkdir /data/data/com.duoxxx.xxxx/
// 3> 进入手机shell, 进一步设置权限(linux权限-用户,用户组,读写权限), selinux context)
// 注: 命令提示符前面的 # , 表示我已经事先 root了手机, 并 adb root获取了root权限
moasm:~/_tmp/0512/files/logs$ adb shell
walleye:/ # cd /data/data/
walleye:/data/data # ls -alh | grep xxx -C 2
drwxr-x--x 4 u0_a43 u0_a43 4.0K 2020-05-06 11:03 com.android.wallpaperpicker
drwx------ 4 u0_a58 u0_a58 4.0K 2020-05-11 17:15 com.android.webview
drwxrwxrwx 2 root root 4.0K 2020-05-12 14:49 com.duoxxx.xxxx
drwx------ 4 u0_a92 u0_a92 4.0K 2019-08-23 19:56 com.example.emptyactivity
drwx------ 7 u0_a188 u0_a188 4.0K 2020-02-16 10:27 com.example.lhztest1
// 4> 通过dumpsys package 获取xxx的 uid(注: 原生的bug, 这里的userId实际上是 uid, uid = (userId*10000 + appId) )
walleye:/data/data # dumpsys package com.duoxxx.xxxx | grep userId
userId=10242
// 5> 看上去读写权限(drwxrwxrwx) > 原来的(drwx------ 或 drwxr-x--x), 懒得改了, 要改使用chmod咯.
// 6> 恢复文件的group:user权限: chown
1|walleye:/data/data # chown u0_a242:u0_a242 com.duoxxx.xxxx
walleye:/data/data # ls -alh | grep xxx -C 2
drwxr-x--x 4 u0_a43 u0_a43 4.0K 2020-05-06 11:03 com.android.wallpaperpicker
drwx------ 4 u0_a58 u0_a58 4.0K 2020-05-11 17:15 com.android.webview
drwxrwxrwx 2 u0_a242 u0_a242 4.0K 2020-05-12 14:49 com.duoxxx.xxxx
drwx------ 4 u0_a92 u0_a92 4.0K 2019-08-23 19:56 com.example.emptyactivity
drwx------ 7 u0_a188 u0_a188 4.0K 2020-02-16 10:27 com.example.lhztest1
// 7> 查看当前文件 selinux context状态, 对比其他类似app, 找规律:
walleye:/data/data # ls -alhZ | grep xxx -C 2
drwxr-x--x 4 u0_a43 u0_a43 u:object_r:app_data_file:s0:c512,c768 4.0K 2020-05-06 11:03 com.android.wallpaperpicker
drwx------ 4 u0_a58 u0_a58 u:object_r:app_data_file:s0:c58,c256,c512,c768 4.0K 2020-05-11 17:15 com.android.webview
drwxrwxrwx 2 u0_a242 u0_a242 u:object_r:system_data_file:s0 4.0K 2020-05-12 14:49 com.duoxxx.xxxx
drwx------ 4 u0_a92 u0_a92 u:object_r:app_data_file:s0:c92,c256,c512,c768 4.0K 2019-08-23 19:56 com.example.emptyactivity
drwx------ 7 u0_a188 u0_a188 u:object_r:app_data_file:s0:c188,c256,c512,c768 4.0K 2020-02-16 10:27 com.example.lhztest1
// 8> 恢复selinux context
// 参考技术文档:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/selinux_users_and_administrators_guide/sect-security-enhanced_linux-working_with_selinux-selinux_contexts_labeling_files
walleye:/data/data # chcon --help
usage: chcon [-hRv] CONTEXT FILE...
Change the SELinux security context of listed file[s].
-h change symlinks instead of what they point to
-R recurse into subdirectories
-v verbose output
walleye:/data/data # chcon u:object_r:app_data_file:s0:ca242,c256,c512,c768 com.duoxxx.xxxx
walleye:/data/data # ls -alhZ | grep xxx -C 2
drwxr-x--x 4 u0_a43 u0_a43 u:object_r:app_data_file:s0:c512,c768 4.0K 2020-05-06 11:03 com.android.wallpaperpicker
drwx------ 4 u0_a58 u0_a58 u:object_r:app_data_file:s0:c58,c256,c512,c768 4.0K 2020-05-11 17:15 com.android.webview
drwxrwxrwx 2 u0_a242 u0_a242 u:object_r:app_data_file:s0:ca242,c256,c512,c768 4.0K 2020-05-12 14:49 com.duoxxx.xxxx
drwx------ 4 u0_a92 u0_a92 u:object_r:app_data_file:s0:c92,c256,c512,c768 4.0K 2019-08-23 19:56 com.example.emptyactivity
drwx------ 7 u0_a188 u0_a188 u:object_r:app_data_file:s0:c188,c256,c512,c768 4.0K 2020-02-16 10:27 com.example.lhztest1
好了, 看上去这个目录各种权限都恢复啦, 跟没删除一样~
end