com.package.name
is your app identifier, and the file path is relative to the app user's home directory, e.g. '/data/user/0/com.package.name
.
adb shell run-as com.package.name cp relative/path/file.ext /sdcard
adb pull /sdcard/file.ext
See long explanation below.
Trying to adb pull
files from our app's directory fails with Permission denied
,
because the adb user doesn't have access to the home directory.
adb pull /data/user/0/com.package.name/file.ext
Error:
adb: error: failed to stat remote object '/data/user/0/com.package.name/file.ext': Permission denied
You can try to run adb
as root first:
adb root
But on a non-rooted device, this fails with:
adbd cannot run as root in production builds`
Here's a workaround on how to download a file from the app data directory using run-as
.
This explains the solution step by step.
Start a shell session on the device. All following commands will be executed in the shell session on your device.
adb shell
Assuming our app identifier is com.package.name
, the app data directory is at /data/user/0/com.package.name
.
You can try to list files in that directory:
ls /data/user/0/com.package.name
This should result in error:
ls: /data/user/0/com.package.name/: Permission denied
However, you can run a command using the com.package.name
application identity with the run-as
command
run-as com.package.name ls /data/user/0/com.package.name/
You should now see a directory listing, and you can find the file you want,
and copy it to a directory on your device that doesn't require root access, e.g. /sdcard
:
run-as com.package.name cp /data/user/0/com.package.name/file.ext /sdcard
We can then exit the adb shell:
exit
Back at our own computer, we can adb pull
the file:
adb pull /sdcard/file.ext
For those who facing
package not debuggable
for release build.IF: debug have same package name and signed with same key as release (which is not recommended in some cases)
You can install debug build and access the files in same way after that.
Unless your file is not recreated/rewritten/modified_in_interfering_way on app start, do not run.
Bonus track: one-liner for linux/macos
adb shell "run-as $package base64 '$1'" | base64 -d > "$save_as"
Base64 ensures that binary file is not affected with any adb/\n shenanigans