ExecuteRemoteCommand bugged?!
Describe the bug
Эмулятор LDPlayer 9 крайней сборки с сайта авторов. Пытаюсь накидать автоматизацию. В процессе прикручиваю redsocks2. Там нужно "крутить" iptables. adb.adbClient.ExecuteRemoteCommand("echo -n > /data/local/tmp/rs/iptables.rules", adb.deviceData); не отрабатывает. Если добавить аргумент на receiver или Encoding, тогда срабатывает. Но, не всегда требуется "грабить" вывод. Тут он точно не требуется. В результате, файл не обнуляется.
Steps to reproduce the bug
Шаги простые - выполнить ExecuteRemoteCommand с единственным аргументом DeviceData.
Expected behavior
По всей видимости, команда должна отработать без возвращения куда-либо вывод с консоли.
Screenshots
No response
NuGet package version
3.3.13
.NET Platform
.NET Framework 4.8.x
Platform type
Windows
System version
Microsoft Windows [Version 10.0.19045.4780]
IDE
Visual Studio 2022
Additional context
No response
Команда не отработала с аргументом Encoding.ASCII. adb.adbClient.ExecuteRemoteCommand("echo -n > /data/local/tmp/rs/iptables.rules", adb.deviceData, Encoding.ASCII); при этом: adb -s emulator-5554 shell "echo -n > /data/local/tmp/rs/iptables.rules" - отработала нормально.
var tmp = ldplayer.Adb.adbClient.ExecuteRemoteCommand("echo -n > /data/local/tmp/rs/iptables.rules", ldplayer.Adb.deviceData, Encoding.ASCII);
string result = string.Join("\n", tmp);
и вот тогда отработала команда.
@yungd1plomat
Не уверен, как и почему, но deviceClient.StartApp(packageName) и deviceClient.StopApp(packageName) тоже не работают. просто ничего не выполняется.
Нашёл причину не срабатывания команд. Разработчики, возьмите на заметку: метод Connect цепляется к Offline девайсу, у которого transport_id меняется, когда State меняется на Online. От сюда и проблема.
I found the reason of not triggering commands. Developers, take note: Connect method connects to Offline device, which transport_id changes when State changes to Online. That's where the problem comes from.
закастылил:
adbClient.Connect($"emulator-{port}");
var timeout = 10;
var res = 1;
do
{
deviceData = adbClient.GetDevices().FirstOrDefault(p => p.Serial.Contains($"emulator-{port}"));
if (deviceData.State == DeviceState.Online)
{
res = 0;
break;
}
Task.Delay(1000).Wait();
} while (timeout-- != 0);
if (res != 0) throw new Exception($"Device emulator-{port} offline!");
deviceClient = new DeviceClient(adbClient, deviceData);
в итоге и это тоже не помогло. придётся карячить Appium...