You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android设备获Root权限后使用mkdir创建文件夹失败问题

解决LIBSU执行mkdir成功但文件夹未生成的问题

核心问题分析

你的代码存在几个关键问题,导致命令返回成功但实际未创建目录:

  1. 无效的挂载操作:/data/data/<packageName> 是应用私有目录,挂载点是整个 /data 分区,单独remount该路径不会生效,反而可能干扰后续操作。
  2. 未检查命令实际输出:仅依赖 isSuccess() 判断不准确,即使命令执行过程中出现权限或SELinux限制,也可能返回true。
  3. Shell会话未复用:多次调用 Shell.su() 可能创建独立会话,导致状态不连贯。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:52:30