SharpAdb / AdvancedSharpAdbClient

AdvancedSharpAdbClient is a .NET library that allows .NET, Mono and Unity applications to communicate with Android devices. It's improved version of SharpAdbClient.
https://sharpadb.github.io
Apache License 2.0
201 stars 54 forks source link

logcat is very slow #66

Closed bigsinger closed 1 year ago

bigsinger commented 1 year ago

Describe the bug

Here is the code:

// 打开Logcat
private void menuItemLogcatOpen_Click(object sender, EventArgs e) {
    if (!star.AdbHelper.isDeviceSelected()) { formLog.showConsoleWnd(); star.UILogger.logOnConsole("设备未连接", star.UILogger.LogLevel.warning); return; }
    formLog.showLogcatWnd();

    try {
        string shellCmd = "logcat";
        star.UILogger.logOnConsole(shellCmd, star.UILogger.LogLevel.info);
        cancellationTokenSource = new();
        taskLogcat = star.AdbHelper.shellCmdAsync(shellCmd, new star.AdbShellLogcatReceiver(context), cancellationTokenSource.Token);
        star.UILogger.logOnConsole("—————————————————————\n", star.UILogger.LogLevel.verbose);
    } catch (Exception ex) {
        star.UILogger.logOnConsole(ex.ToString(), star.UILogger.LogLevel.error);
    }
}

AdbShellLogcatReceiver is a class that receives callback logs and echoes them:

class AdbShellLogcatReceiver : IShellOutputReceiver {
    private readonly SynchronizationContext context;   //获取UI线程同步上下文

    public AdbShellLogcatReceiver(SynchronizationContext context) {
        this.context = context;
    }
    bool IShellOutputReceiver.ParsesErrors { get; }

    void IShellOutputReceiver.AddOutput(string line) {
        UILogger.logOnLogcat(line, UILogger.LogLevel.verbose, context, false); //异步时可能文本量较大,加速用
    }

    void IShellOutputReceiver.Flush() {
    }
}

It takes a long time to obtain and display the logs. How can I improve it?

Steps to reproduce the bug

Refer to the code above

Expected behavior

No response

Screenshots

No response

NuGet package version

2.5.7

.NET Platform

.NET 7

Platform type

No response

System version

No response

IDE

No response

Additional context

No response

wherewhere commented 1 year ago

真的有人用logcat欸 不过这里有一个用来读logcat的方法

AdbClient.RunLogService(DeviceData device, Action<LogEntry> messageSink, params LogId[] logNames);

虽然不知道能不能用

bigsinger commented 1 year ago

我上面的代码也能用的,就是速度有点慢。

wherewhere commented 1 year ago

所以速度有多慢。。。

bigsinger commented 1 year ago
logcat

哈哈 还好你没说:真的有人用C#。。。

bigsinger commented 1 year ago

所以速度有多慢。。。

没定量测试过,这个不着急,如果你们看这块的话就做下性能优化,目前logcat用的少,只是想起来了就提一下。

wherewhere commented 1 year ago

我害怕是我瞎改异步导致的变慢。。。

bigsinger commented 1 year ago

我害怕是我瞎改异步导致的变慢。。。

不会,我这个问题应该很早了。不是才发生的,我是看到这个三方库有升级,觉得有人维护了,才反馈的。最近新的版本感觉快些了。

wherewhere commented 1 year ago

你和adb本体的速度比较一下,如果本体快但是这个轮子慢的话就是通信的问题了。。。

bigsinger commented 1 year ago

你和adb本体的速度比较一下,如果本体快但是这个轮子慢的话就是通信的问题了。。。

测了下。不稳定,有时候十秒读完,有时候几十秒,有时候一分多钟

bigsinger commented 1 year ago

找到原因了,是c# ui的bug,已解决,速度很快了。

wherewhere commented 1 year ago

额。。。

bigsinger commented 1 year ago

@wherewhere

真是坑啊,如果有更好的方法,也可以推荐。

wherewhere commented 1 year ago

不应该是异步获取日志,然后异步显示到UI吗,之前只知道后台阻塞UI,第一次听说UI阻塞后台。。。

bigsinger commented 1 year ago

不应该是异步获取日志,然后异步显示到UI吗,之前只知道后台阻塞UI,第一次听说UI阻塞后台。。。

是异步。 它每次都自动滚动,这个自动滚动会影响效率,大量的自动滚动就会影响性能了。

wherewhere commented 1 year ago

终端也是自动滚动,滚慢点就当动画了。。。

bigsinger commented 1 year ago

终端也是自动滚动,滚慢点就当动画了。。。

控制台跟UI不太一样。 UI的话也可以用一些技巧,例如每秒自动滚动一次,这样也不会影响效率。

wherewhere commented 1 year ago

终端输出大量文本的时候也很慢,建议迁移到XAML世界,WinForm性能很差的

bigsinger commented 1 year ago

终端输出大量文本的时候也很慢,建议迁移到XAML世界,WinForm性能很差的

WPF么,也用的。开发小工具就winform最快(开发效率),拖拖拽拽点点,几分钟就搞定了。

wherewhere commented 1 year ago

XAML写习惯了布局起来更快,WinForm不支持自适应,弄出来的奇奇怪怪的,而且因为本体是win32控件所以要各种和win32交互,太麻烦了 (实际上我想说的是UWP流汗滑稽流汗滑稽流汗滑稽