Android设备获Root权限后使用mkdir创建文件夹失败问题
解决LIBSU执行mkdir成功但文件夹未生成的问题
核心问题分析
你的代码存在几个关键问题,导致命令返回成功但实际未创建目录:
- 无效的挂载操作:
/data/data/<packageName>是应用私有目录,挂载点是整个/data分区,单独remount该路径不会生效,反而可能干扰后续操作。 - 未检查命令实际输出:仅依赖
isSuccess()判断不准确,即使命令执行过程中出现权限或SELinux限制,也可能返回true。 - Shell会话未复用:多次调用
Shell.su()可能创建独立会话,导致状态不连贯。 - SELinux限制:多数Root设备默认SELinux处于Enforcing模式,会阻止对应用私有目录的Root级修改。
修正后的代码
fun createDialog(packageInfo: ApplicationInfo) { val packageName = packageInfo.packageName sudo(packageName) } fun sudo(packageName: String) { val path = "/data/data/$packageName" val targetDir = "$path/lol" // 获取并复用同一个Root Shell会话 val shell = Shell.su() if (!shell.isRoot) { Log.e("Daniel", "未获取Root权限") return } // 临时关闭SELinux(解决权限拦截问题) shell.exec("setenforce 0") // 执行mkdir命令并捕获完整输出 val mkdirResult = shell.exec("mkdir -p $targetDir") Log.e("Daniel", "mkdir执行结果:${mkdirResult.isSuccess()}") Log.e("Daniel", "标准输出:${mkdirResult.out.joinToString("\n")}") Log.e("Daniel", "错误输出:${mkdirResult.err.joinToString("\n")}") // 验证目录是否存在 val checkResult = shell.exec("ls -ld $targetDir") Log.e("Daniel", "目录检查结果:${checkResult.out.joinToString("\n")}") // 可选:恢复SELinux到Enforcing模式 shell.exec("setenforce 1") }
关键说明
- 移除无效remount:应用私有目录默认具备可写权限,无需单独挂载,强行操作无意义。
- 复用Shell会话:使用同一个
shell对象执行所有命令,保证环境一致性。 - 检查命令输出:通过
result.out和result.err查看命令执行的真实情况,快速定位问题。 - SELinux处理:临时关闭SELinux是验证问题的快速方式,若要长期解决,可使用
chcon命令设置目录的SELinux上下文为应用私有目录默认值(如u:object_r:app_data_file:s0:<packageName>)。
内容的提问来源于stack exchange,提问作者DDeveloper
相关产品推荐
相关产品推荐

