Почему ping работает на некоторых устройствах, а не на других?

У меня есть следующий код в моем приложении...

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

... и я вижу, что он работает (возвращает 0) на некоторых устройствах (например, Motorola G), но не работает (возвращает 2) на других устройствах (например, Galaxy S3). Я проверил устройство Galaxy S3, и у него определенно есть файл "/system/bin/ping", и, конечно же, я убедился, что он действительно подключен к Интернету.

У кого-нибудь есть идеи, почему команда может не работать на некоторых устройствах... и что я могу сделать, чтобы заставить ее работать?

Ответ 1

Способ ping для каждого OEM (производителя оригинального оборудования) может отличаться. Это не ограничивается только ping. Например, попробуйте запустить команду linux du на старых устройствах Samsung (S3) и более новых устройствах (Motorola G) на оболочке adb.

S3 поддерживает du, но не принимает некоторые параметры, такие как -m (отображение в мегабайтах), в то время как новые устройства, такие как Moto G или даже устройства Samsung (в прошлом Galaxy S5), поддерживают его. Попробуйте запустить ping -c 1 8.8.8.8 на оболочке adb в S3, и вы заметите, что это не ваш код Java, это OEM.

Опять же, даже команды, такие как dumpsys, имеют отформатированный формат в зависимости от версии Android и устройства. Из-за этого было бы лучше, если бы вы могли использовать совершенно другой метод, чтобы попытаться выполнить идентификацию желаемого IP-адреса с помощью API-интерфейсов, представленных на Android, вместо использования процесса с параметрами, которые могут быть по-разному поддерживаться для каждого OEM-сервера.

Также может быть, что разрешения для каждого устройства различны.

Когда вы запускаете процесс в своем приложении, вы предоставляете только ограниченное разрешение приложения для этого процесса. Поэтому, если для ping требуется разрешение на уровне root (на конкретном устройстве), это также может быть причиной того, что он не работает. В конечном счете, до OEM-производителей, как они настроили Android.

Источник: Я работаю на OEM-сервере.