Журнал событий DDMS: runLogService получил «com.android.ddmlib.AdbCommandRejectedException: closed» - PullRequest
0 голосов
/ 30 января 2019

Итак, я попытался улучшить автономную 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
- когда я извлекаю файл, кажется, что в журнале событий мне нужно

В API fw 6.0 23:
- у него нет пути к файлу /dev/log/events, вместо этого он перемещен в /dev/input/event0 или dev/input/event1
- когда я извлекаю файл, он имеет размер 0Это означает, что это пустой файл

На некоторых устройствах /dev/log/events есть даже fw 6.0 API 23 (в моем случае Samsung SM-A500F).При ручном извлечении он не пустой, но все равно имеет ошибку отклонения adb "закрыто".

Что я сделал до сих пор:
- измените команду с byte[] request = formAdbRequest("log:" + logName); на: byte[] request = formAdbRequest("input:event0"); -> stillполучить ошибку «Closed»
- изменить команду на: byte[] request = formAdbRequest("shell:logcat -v threadtime -b " + logName); -> ошибка «Closed» исчезла, но данные результата не могут быть проанализированы, они имеют другой формат

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

IБоюсь, что журнал системных событий больше не может быть прочитан через log:events, но я все еще не смог найти документы для этого.

Любые комментарии высоко ценятся.
Заранее спасибо.

...