5

I can run

adb pull /data/data/com.xlythe.saolauncher/databases ./

or

adb pull /data/data/com.xlythe.saolauncher/files ./

and it works fine. However, if I try

adb pull /data/data/com.xlythe.saolauncher ./

It fails with the error:

adb: error: failed to copy '/data/data/com.xlythe.saolauncher/lib' to './com.xlythe.saolauncher/lib': remote No such file or directory

It happens because the lib folder is actually a symlink to /data/app-lib/com.xlythe.saolauncher

Now, if I wanted only com.xlythe.saolauncher I would just do it by hand copying one folder at time, but I want instead to pull all /data/data at once.
So I need a way to tell ADB to just skip symlinks instead of failing the copy.
Any hints?

6

Method 1:

If you're okay with getting the output file as a .tar archive, try this command:

adb exec-out tar c data/data > data_backup.tar

Make sure to omit the leading / in your path. (Source)

Method 2:

If you want to copy file-wise, use the following script written by me:

#!/bin/bash
## Run as: ./filename.sh <source_folder> <destination_folder>
## If no <destination_folder> is provided, it's stored in current directory.

location=$1
if [ -z "$2" ]
  then
    destination=.
else
  destination=$2
fi

## Find the full path of all the files in the given directory, and retrieve each file one by one

while read line
do
  ## Create the directory where the file will reside, by removing the filename alone from the fullpath.
  ## Thanks to https://stackoverflow.com/a/9022471/5002496
  mkdir -p $destination"${line%/*}"
  adb pull $line $destination$line
done <<< `adb shell find $location -type f`

## The find binary in Android doesn't seem to show symlinks when '-type f' option is used.
## Source: https://stackoverflow.com/a/16303559/5002496

Save it as adb_pull.sh, run chmod 777 adb_pull.sh and run it like:

./adb_pull.sh /data/data data_backup

All the contents from /data/data from Android device will be stored into data_backup folder.
(Note: DON'T specify the source folder like /data/data/ with an additional / after the folder name)

Tested and working on my Ubuntu 17.04, using an Android 7.1 device.
Note: To access /data partition completely via ADB, you need to run adb root. (more help..)

  • 2
    +1 I had to join this site just to give an upvote to this answer (Method 1) which really helped me. :) – Jason Bassford Jul 29 '18 at 0:47
  • 1
    Creating a tar archive may fail because of combining stdout and stderr. Try adb shell 'tar -cf - data 2>/dev/null' | gzip -9 > backup.tar.gz instead. – Mikko Rantalainen Mar 29 at 18:30

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.