Java TCPDump从adb外壳工作,但不从设备工作

Java TCPDump从adb外壳工作,但不从设备工作,java,android,tcpdump,Java,Android,Tcpdump,我正在开发一个android应用程序来监控android设备中的网络使用情况 应用程序要求之一是提供由tcpdump命令创建的“.pcap”文件。 当我尝试从adb shell执行tcpdum命令时,一切正常,我能够创建这个文件。 但是,当我尝试使用java代码从设备本身执行此命令时,我得到了权限拒绝错误 应该提到的是,我的java代码对于其他不需要特殊权限的命令也可以很好地工作 还应该提到的是,我使用了以下两款根设备(第一款三星-运行安卓4.4,第二款三星-运行安卓5.1.1) 此外,我尝试安

我正在开发一个android应用程序来监控android设备中的网络使用情况

应用程序要求之一是提供由tcpdump命令创建的“.pcap”文件。 当我尝试从adb shell执行tcpdum命令时,一切正常,我能够创建这个文件。 但是,当我尝试使用java代码从设备本身执行此命令时,我得到了权限拒绝错误

应该提到的是,我的java代码对于其他不需要特殊权限的命令也可以很好地工作

还应该提到的是,我使用了以下两款根设备(第一款三星-运行安卓4.4,第二款三星-运行安卓5.1.1)

此外,我尝试安装另一个tcpdump二进制文件,并授予它执行权限,还尝试了tcpdump命令的不同变体,以获得带有“su”的权限。 据我所知,这是内核的行为,出于安全原因,但尽管如此,我还是想知道 如果有办法解决这个问题/为我的应用程序提供运行上述命令所需的权限。 下面是我尝试运行的命令和得到的响应

命令:tcpdump-l-i eth1-w/sdcard/output.pcap 响应:tcpdump:eth1:您没有在该设备上捕获的权限 (插座:不允许操作)

命令:tcpdump-w/sdcard/output.pcap 响应:tcpdump:无法打开netlink套接字13:权限被拒绝

响应:tcpdump:rmnet0:您没有在该设备上捕获的权限

我的清单权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.REORDER_TASKS" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_SUPERUSER"/>

adb shell
是否提供根shell?
public static boolean executeCommandViaShell(String sCmd) {
    DataInputStream isErr = null, isRes = null;
    BufferedReader brErr = null, brRes = null;
    try {
        Process process = Runtime.getRuntime().exec(sCmd);
        isErr = new DataInputStream(process .getErrorStream());
        brErr = new BufferedReader(new InputStreamReader(isErr));
        isRes = new DataInputStream(process .getInputStream());
        brRes = new BufferedReader(new InputStreamReader(isRes));
        // errors:
        while ((m_sMessage = brErr.readLine()) != null) {
            if (m_sMessage.equalsIgnoreCase("INVALID"))
            {
                return false;
            }
        }
        while ((m_sMessage = brRes.readLine()) != null) {
            if (m_sMessage.equals("SUCCESS")) {
                Log.d(TAG, "SUCCESS m_sMessage: " + m_sMessage);
            }
            else {
                return false;
            }
        }
        return true;
    }
    catch (Exception e) {
        e.printStackTrace();
        return false;
    }
    finally {
        try {
            isErr.close();
            isRes.close();
            brErr.close();
            brRes.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}