(stream)
| 599 | # described at https://android.stackexchange.com/a/74660. All supported versions |
| 600 | # of Android use format version 2 or later. |
| 601 | async def read_logcat(stream): |
| 602 | async def read_bytes(size): |
| 603 | return await stream.readexactly(size) |
| 604 | |
| 605 | async def read_int(size): |
| 606 | return int.from_bytes(await read_bytes(size), "little") |
| 607 | |
| 608 | payload_len = await read_int(2) |
| 609 | if payload_len < 2: |
| 610 | # 1 byte for priority, 1 byte for null terminator of tag. |
| 611 | raise ValueError(f"payload length {payload_len} is too short") |
| 612 | |
| 613 | header_len = await read_int(2) |
| 614 | if header_len < 4: |
| 615 | raise ValueError(f"header length {header_len} is too short") |
| 616 | await read_bytes(header_len - 4) # Ignore other header fields. |
| 617 | |
| 618 | priority_int = await read_int(1) |
| 619 | try: |
| 620 | priority = LogPriority(priority_int) |
| 621 | except ValueError: |
| 622 | priority = LogPriority.UNKNOWN |
| 623 | |
| 624 | payload_fields = (await read_bytes(payload_len - 1)).split(b"\0") |
| 625 | if len(payload_fields) < 2: |
| 626 | raise ValueError( |
| 627 | f"payload {payload!r} does not contain at least 2 " |
| 628 | f"null-separated fields" |
| 629 | ) |
| 630 | tag, message, *_ = [ |
| 631 | field.decode(*DECODE_ARGS) for field in payload_fields |
| 632 | ] |
| 633 | return priority, tag, message |
| 634 | |
| 635 | |
| 636 | def stop_app(serial): |
no test coverage detected
searching dependent graphs…