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.extSee 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.extError:
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 rootBut 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 shellAssuming 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.nameThis 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 /sdcardWe can then exit the adb shell:
exitBack 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
cpto 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
ddcommand, which I guess is the command Android Studio uses for the "Save" and "Upload" functions on "Device Explorer".(Using
base64 -d > filewon'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