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
I have searched for a way to pull and push data from the app's folder for 3 years (since I wrote this note). From Android 10, using
cp
to copy files from the app's folder to the common space (eg./sdcard
) won't work anymore.Recently, when I had to update my scripts to make them able to sync files from the device into the PC, the script by @listvin gave me a hint and helped me find out
dd
command, which I guess is the command Android Studio uses for the "Save" and "Upload" functions on "Device Explorer".(Using
base64 -d > file
won't work with Push flow)If you are interested, I summarize what I learned in this note: https://iamtuna.org/2023-10-08/use-adb-backup-restore-local-data-2