问题
When I just run adb shell
, I get shell running from uid=2000(shell) gid=2000(shell)
, without ptrace access to my application.
How to open a shell with the same UID as launched application?
回答1:
Use run-as <your package name>
to switch to your app's UID or run-as <your package name> <command>
to run a single command with your app's UID.
回答2:
From this answer:
- The packages.xml file present in /data/system
- The packages.list file present in /data/system
Contain the list of applications installed and their corresponding UID's.
Another answer in the same question suggests:
adb shell dumpsys package com.example.myapp | grep userId=
You can then open your shell as normal and run:
$ su <UID>
You should then have the same access and privileges as the app that uses that UID.
回答3:
Workaround way using socat:
- Add
android.permission.INTERNET
to your application; - Put socat binary (mirror) to
/data/local/tmp/
. Ensure everybody can start it; - Add
Runtime.getRuntime().exec("/data/local/tmp/socat tcp-l:4446,fork,reuseaddr exec:/system/bin/sh,pty,stderr,setsid");
at startup of your Java-based application; adb forward tcp:4446 tcp:4446
- Use
socat `tty`,raw,echo=0,opost=1 tcp:127.0.0.1:4446
on host to connect to the shell in your application context.
Note that this setup is not secure and should not be left in production app.
来源:https://stackoverflow.com/questions/23896396/how-to-open-adb-shell-in-context-of-application-being-debugged-on-non-rooted