首页 > 解决方案 > DDMS 事件日志:runLogService 得到“com.android.ddmlib.AdbCommandRejectedException:已关闭”

问题描述

因此,在检查事件日志面板/选项卡时,我尝试改进独立的 DDMS。我收到了这个错误:

11:09:45 E/EventLog: closed
com.android.ddmlib.AdbCommandRejectedException: closed
at com.android.ddmlib.AdbHelper.runLogService(AdbHelper.java:579)
at com.android.ddmlib.AdbHelper.runEventLogService(AdbHelper.java:548)
at com.android.ddmlib.Device.runEventLogService(Device.java:584)
at com.android.ddmuilib.log.event.EventLogPanel$8.run(EventLogPanel.java:461)

到目前为止,我尝试使用模拟器 fw 2.3.3(API 10)并且它可以工作,但不适用于 fw 6.0(API 23)。

到目前为止,我发现:
在 fw 2.3.3 API 10 上:
- 它有文件路径/dev/log/events
- 当我拉出文件时,似乎记录了我需要的事件

在 fw 6.0 API 23 上:
- 它没有文件路径/dev/log/events,而是移动到/dev/input/event0dev/input/event1
- 当我拉文件时,它的大小为 0,意味着它是一个空文件

有些设备/dev/log/events甚至具有 fw 6.0 API 23(在我的情况下是三星 SM-A500F)。手动拉取时,它不是空的,但仍然有 adb 拒绝错误“关闭”。

到目前为止我所做的:
- 将命令从更改byte[] request = formAdbRequest("log:" + logName);为:byte[] request = formAdbRequest("input:event0");-> 仍然得到“关闭”错误
- 将命令更改为:byte[] request = formAdbRequest("shell:logcat -v threadtime -b " + logName);-> “关闭”错误消失了,但结果数据无法解析,它有不同的格式

public static void runLogService(InetSocketAddress adbSockAddr, Device device, String logName,
        LogReceiver rcvr) throws TimeoutException, AdbCommandRejectedException, IOException {
    SocketChannel adbChan = null;

    try {
        adbChan = SocketChannel.open(adbSockAddr);
        adbChan.configureBlocking(false);

        // if the device is not -1, then we first tell adb we're looking to talk
        // to a specific device
        setDevice(adbChan, device);

        byte[] request = formAdbRequest("log:" + logName);
        write(adbChan, request);

        AdbResponse resp = readAdbResponse(adbChan, false /* readDiagString */);
        if (!resp.okay) {
            throw new AdbCommandRejectedException(resp.message);
        }

        byte[] data = new byte[16384];
        ByteBuffer buf = ByteBuffer.wrap(data);
        while (true) {
            int count;

            if (rcvr != null && rcvr.isCancelled()) {
                break;
            }

            count = adbChan.read(buf);
            if (count < 0) {
                break;
            } else if (count == 0) {
                try {
                    Thread.sleep(WAIT_TIME * 5);
                } catch (InterruptedException ie) {
                }
            } else {
                if (rcvr != null) {
                    rcvr.parseNewData(buf.array(), buf.arrayOffset(), buf.position());
                }
                buf.rewind();
            }
        }
    } finally {
        if (adbChan != null) {
            adbChan.close();
        }
    }
}

恐怕系统事件日志不再可以阅读了log:events,但我仍然找不到这方面的文件。

任何意见都受到高度赞赏。
提前致谢。

标签: androidadbddms

解决方案


推荐阅读