AdvancedSharpAdbClient icon indicating copy to clipboard operation
AdvancedSharpAdbClient copied to clipboard

ExecuteRemoteCommand bugged?!

Open SaymanNsk opened this issue 1 year ago • 5 comments

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

SaymanNsk avatar Aug 27 '24 17:08 SaymanNsk

Команда не отработала с аргументом 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" - отработала нормально.

SaymanNsk avatar Aug 27 '24 17:08 SaymanNsk

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);

и вот тогда отработала команда.

SaymanNsk avatar Aug 27 '24 18:08 SaymanNsk

@yungd1plomat

wherewhere avatar Aug 28 '24 02:08 wherewhere

Не уверен, как и почему, но deviceClient.StartApp(packageName) и deviceClient.StopApp(packageName) тоже не работают. просто ничего не выполняется.

SaymanNsk avatar Aug 29 '24 07:08 SaymanNsk

Нашёл причину не срабатывания команд. Разработчики, возьмите на заметку: метод 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...

SaymanNsk avatar Sep 04 '24 13:09 SaymanNsk