Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ndk-build: Use uid to limit logcat to the current application #33

Merged
merged 1 commit into from
Nov 22, 2023

Conversation

MarijnS95
Copy link
Member

Fixes #10

This is a port of:
rust-mobile/xbuild#131
rust-mobile/xbuild#135

Having never really understood how Android Studio does it, I just stumbled upon this very new stackoverflow answer that has a rather beatiful solution to the current problems with pidof, without drawbacks. Pidof has always been flaky as it relies on the app to be running, which may either take some time or never happen if the app crashed before pidof is first run. This results in silly workarounds such as loops that induce extra delay and need to have an upper bound. And this pid changes every time the app is restarted, making it a tedious process that also doesn't react to manual app restarts on the device. Retrieving the uid via pm list packages -U on the other hand, and passing that to logcat --uid has the following advantages:

  • Always available immediately after the app has been installed, no need to check it in a loop (no extra delay);
  • Doesn't change after the app is (re!)installed, unless the user fully deletes and installs the app again;
  • Is resilient against app crashes because of that, and allows the user to see any error/crash related messages straight away;
  • Still includes logs printed by other system components that run or are invoked within an app, as before.

The only downside is that pm list package possibly returns multiple packages if there is a substring match; for this reason the code searches for an explicit match in the output.

This is a port of:
rust-mobile/xbuild#131
rust-mobile/xbuild#135

Having never really understood how Android Studio does it, I just
stumbled upon this very new [stackoverflow answer] that has a rather
beatiful solution to the current problems with `pidof`, without
drawbacks.  Pidof has always been flaky as it relies on the app to be
running, which may either take some time or never happen if the app
crashed before `pidof` is first run.  This results in silly workarounds
such as loops that induce extra delay and need to have an upper bound.
And this `pid` changes every time the app is restarted, making it a
tedious process that also doesn't react to manual app restarts on the
device.  Retrieving the `uid` via `pm list packages -U` on the other
hand, and passing that to `logcat --uid` has the following advantages:

- Always available immediately after the app has been installed, no need
  to check it in a loop (no extra delay);
- Doesn't change after the app is (re!)installed, unless the user fully
  deletes and installs the app again;
- Is resilient against app crashes because of that, and allows the user
  to see any error/crash related messages straight away;
- Still includes logs printed by other system components that run or are
  invoked within an app, as before.

The only downside is that `pm list package` possibly returns multiple
packages if there is a substring match; for this reason the code
searches for an explicit match in the output.

[stackoverflow answer]: https://stackoverflow.com/a/76551835
@MarijnS95 MarijnS95 merged commit 8fac06e into main Nov 22, 2023
41 checks passed
@MarijnS95 MarijnS95 deleted the adb-logcat-uid branch November 22, 2023 09:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Error: String `` is not a PID
1 participant