为什么ping适用于某些设备而不适用于其他设备?

Adi*_*ain 8 android ping connectivity android-internet

我的应用程序中有以下代码...

Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
return process.waitFor();
Run Code Online (Sandbox Code Playgroud)

...我发现它在某些设备(例如Motorola G)上工作(返回0)但在其他设备(例如Galaxy S3)上不起作用(返回2).我已经检查了Galaxy S3设备,它肯定有一个"/ system/bin/ping"文件,当然我已经确定它确实连接到了互联网.

任何人都有任何想法为什么命令可能无法在某些设备上工作......以及我可以做些什么来让它工作?

小智 20

为每个OEM(原始设备制造商)实施ping的方式可能不同.这不仅限于ping.例如,尝试在adb shell上的旧三星设备(S3)和更新的设备(Motorola G)上运行linux du命令.

S3确实支持du,但它不需要一些参数,如-m(以兆字节显示),而较新的设备,如Moto G甚至三星设备(过去的Galaxy S5)都支持它.尝试在S3中的adb shell上运行ping -c 1 8.8.8.8,你会注意到它不是你的Java代码,而是OEM.

同样,甚至诸如dumpsys之类的命令也具有不同格式的输出,具体取决于Android版本和设备.因此,最好使用完全不同的方法尝试使用Android中提供的API ping所需的IP,而不是使用每个OEM可能支持不同的参数的进程.

也可能是每个设备的权限不同.

在应用程序中运行流程时,您只会授予应用程序对流程的有限权限.因此,如果ping需要根级别权限(在特定设备上),这也可能是它无法工作的原因.它最终取决于他们如何定制Android的OEM.

资料来源:我在OEM工作.