Rooted Android 13设备无法读取/data/data/com.packagename目录求助
解决Root设备Android 13读取/data/data指定包目录的问题
先指出你代码里的核心问题,以及Android 13的特殊限制:
- 多余的su命令:你已经通过
Runtime.getRuntime().exec("su")进入root环境,循环里再执行su命令会直接导致执行失败,这是进程返回1的原因之一。 - 无意义的高风险权限修改:给
/、/data加777权限完全没必要,还会破坏系统权限结构,Android 13的SELinux也会直接拦截这类操作。 - 未捕获错误输出:你只看了进程返回码,没读取错误流,根本没法定位是路径写错还是权限被拦截。
修复后的代码示例
val targetDir = "/data/data/com.packagename" try { val process = Runtime.getRuntime().exec("su") val out = DataOutputStream(process.outputStream) val errReader = BufferedReader(InputStreamReader(process.errorStream)) val outputReader = BufferedReader(InputStreamReader(process.inputStream)) // 先验证目标路径是否存在(排查包名错误) out.writeBytes("ls $targetDir\n") // Android 13需临时关闭SELinux,否则权限修改会被拦截 out.writeBytes("setenforce 0\n") // 仅修改目标目录权限(用完建议改回默认的700) out.writeBytes("chmod 755 $targetDir\n") out.writeBytes("exit\n") out.flush() // 读取命令输出和错误信息,方便调试 var line: String? Log.d("MYAPPINFOTA", "命令输出:") while (outputReader.readLine().also { line = it } != null) { Log.d("MYAPPINFOTA", line!!) } Log.d("MYAPPINFOTA", "错误信息:") while (errReader.readLine().also { line = it } != null) { Log.d("MYAPPINFOTA", line!!) } val procCode = process.waitFor() Log.d("MYAPPINFOTA", "进程返回码: $procCode") // 尝试读取目标目录 val file = File(targetDir) if (file.exists()) { Log.d("MYAPPINFOTA", "目录存在,文件数量: ${file.listFiles()?.size ?: 0}") } else { Log.d("MYAPPINFOTA", "目录不存在,请检查包名是否完全正确") } } catch (e: Exception) { e.printStackTrace() }
关键注意事项
- 核对包名:提示"文件不存在"大概率是包名拼写错误,先在su环境执行
ls /data/data,确认目标应用的包名完全一致。 - SELinux处理:Android 13的SELinux强制模式会阻止多数root权限操作,
setenforce 0是临时关闭方式,重启后会恢复默认状态。如果只是读取文件,也可以直接在su环境用cat命令读取,不用修改目录权限。 - 权限回滚:应用目录默认权限是700,修改完后建议执行
chmod 700 $targetDir恢复,避免影响目标应用正常运行。
内容的提问来源于stack exchange,提问作者Ahmad Ali
相关产品推荐
相关产品推荐

