如何使用root权限运行Kotlin代码?基于libsu库的技术问询
用libsu以root权限执行Kotlin文件操作的方案
问题本质
你当前的应用进程本身没有root权限,只有通过Shell.cmd()启动的子shell进程拥有root权限,所以直接调用File类的方法是在应用自身权限下执行,自然访问不了root保护的目录。
可行解决方案
1. 用libsu内置的RootFile替代标准File
libsu专门提供了RootFile类,所有文件操作都会通过root shell执行,API和标准File几乎完全一致,直接替换即可:
import com.topjohnwu.su.io.RootFile val srcDir = "data/data" val rootDir = RootFile(srcDir) val dirChilds = rootDir.list() // 此操作以root权限运行
它支持list()、exists()、delete()、mkdirs()等所有常用文件操作,无需自己处理shell命令和结果解析。
2. 将文件操作转为shell命令执行
如果不想引入RootFile,可以把Kotlin的文件操作逻辑转换成对应的shell命令,通过Shell.cmd()执行后解析输出:
val srcDir = "data/data" val execResult = Shell.cmd("ls '$srcDir'").exec() if (execResult.isSuccess) { val dirChilds = execResult.out.filterNot { it.isBlank() } // 处理得到的目录列表 }
这种方式需要自己处理命令输出的格式,适合自定义逻辑较强的场景。
3. 全局提权(不推荐)
虽然可以通过fork root进程再重启应用的方式让整个进程获得root权限,但这种做法复杂度高、安全性差,还违背libsu的设计初衷,不建议使用。
注意点
- 确保libsu初始化正确,且用户已授予root权限
- 使用
RootFile时要处理权限不足、操作失败等异常情况
内容的提问来源于stack exchange,提问作者Cyber Avater
相关产品推荐
相关产品推荐

