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

Android 7.1(RK3288)执行adb命令遇权限拒绝问题求助

解决Android应用执行logcat命令权限被拒的问题

首先得明确一个核心误区:你代码里调用的adb是电脑端的调试工具,Android设备本身并没有adb这个可执行程序,这才是你遇到Permission denied错误的根本原因(不是权限不够,是命令本身不存在)。要在Android应用内获取logcat日志,直接调用设备自带的logcat命令即可,不需要依赖adb。

下面是具体的解决方案:

1. 修正命令,直接调用设备的logcat

Android系统的/system/bin目录下自带logcat可执行文件,把你的命令改成去掉adb的版本:

try {
    // 直接执行设备内置的logcat命令,无需adb
    Process p = Runtime.getRuntime().exec("logcat -d -v time -f /mnt/sdcard/logcat.txt");
    // 等待命令执行完成,获取退出码判断是否成功
    int exitCode = p.waitFor();
    if (exitCode == 0) {
        Log.i("LogcatSuccess", "日志已成功保存到/mnt/sdcard/logcat.txt");
    } else {
        // 读取错误输出排查问题
        BufferedReader errorReader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        String errorLine;
        StringBuilder errorMsg = new StringBuilder();
        while ((errorLine = errorReader.readLine()) != null) {
            errorMsg.append(errorLine).append("\n");
        }
        Log.e("LogcatError", "命令执行失败:\n" + errorMsg.toString());
    }
} catch (IOException | InterruptedException e) {
    e.printStackTrace();
}

2. 配置必要的权限

要读取logcat日志,需要在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.READ_LOGS" />

但注意:在Android 7.1中,READ_LOGS是特殊权限,普通第三方应用无法通过常规动态申请获取,需要满足以下条件之一:

  • 将你的应用打包成系统应用(使用与设备系统一致的签名)
  • 设备已获取Root权限

3. 针对Root设备的处理

如果你的RK3288设备已经Root,可以通过su命令提升权限执行logcat,确保命令能成功运行:

try {
    // 通过su获取Root权限执行logcat命令
    Process p = Runtime.getRuntime().exec(new String[]{"su", "-c", "logcat -d -v time -f /mnt/sdcard/logcat.txt"});
    int exitCode = p.waitFor();
    if (exitCode == 0) {
        Log.i("LogcatSuccess", "Root模式下日志保存成功");
    } else {
        // 读取错误信息
        BufferedReader errorReader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        String errorLine;
        StringBuilder errorMsg = new StringBuilder();
        while ((errorLine = errorReader.readLine()) != null) {
            errorMsg.append(errorLine).append("\n");
        }
        Log.e("LogcatError", "Root模式下执行失败:\n" + errorMsg.toString());
    }
} catch (IOException | InterruptedException e) {
    e.printStackTrace();
}

额外说明

  • 不要尝试在Android设备上安装adb,这完全没必要,设备本身的logcat工具已经能满足需求
  • 如果你的应用是系统应用,签名与设备系统匹配后,添加READ_LOGS权限即可直接执行logcat命令,无需Root

内容的提问来源于stack exchange,提问作者user1502241

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:29:44