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