Esta respuesta se basa en mi experiencia con otras respuestas y comentarios en las respuestas. Mi esperanza es poder ayudar a alguien en una situación similar.
Estoy haciendo esto en OSX a través de la terminal.
Anteriormente, la respuesta de Vinicius Avellar funcionó muy bien para mí. La mayor parte del tiempo solo necesitaba la base de datos del dispositivo desde una aplicación de depuración.
Hoy tuve un caso de uso en el que necesitaba varios archivos privados . Terminé con dos soluciones que funcionaron bien para este caso.
Utilice la respuesta aceptada junto con los comentarios específicos de OSX de Someone Somewhere. Cree una copia de seguridad y use la solución de terceros,
sourceforge.net/projects/adbextractor/files/?source=navbar para descomprimir en un tar. Escribiré más sobre mi experiencia con esta solución al final de esta respuesta. Desplácese hacia abajo si esto es lo que está buscando.
Una solución más rápida con la que me conformé. Creé un script para extraer varios archivos similar a la respuesta de Tamas. Puedo hacerlo de esta manera porque mi aplicación es una aplicación de depuración y tengo acceso a ejecutar como en mi dispositivo. Si no tiene acceso a ejecutar, este método no le funcionará en OSX.
Aquí está mi script para extraer varios archivos privados que compartiré con usted, el lector, que también está investigando esta increíble pregunta;):
#!/bin/bash
#
# Strict mode: http://redsymbol.net/articles/unofficial-bash-strict-mode/
set -euo pipefail
IFS=$'\n\t'
#
# Usage: script -f fileToPull -p packageName
#
# This script is for pulling private files from an Android device
# using run-as. Note: not all devices have run-as access, and
# application must be a debug version for run-as to work.
#
# If run-as is deactivated on your device use one of the
# alternative methods here:
# http://stackoverflow.com/questions/15558353/how-can-one-pull-the-private-data-of-ones-own-android-app
#
# If you have encrypted backup files use:
# sourceforge.net/projects/adbextractor/files/?source=navbar
# From comments in the accepted answer in the above SO question
#
# If your files aren't encrypted use the accepted answer
# ( see comments and other answers for OSX compatibility )
#
# This script is open to expansions to allow selecting
# device used. Currently first selected device from
# adb shell will be used.
#Check we have one connected device
adb devices -l | grep -e 'device\b' > /dev/null
if [ $? -gt 0 ]; then
echo "No device connected to adb."
exit 1
fi
# Set filename or directory to pull from device
# Set package name we will run as
while getopts f:p: opt; do
case $opt in
f)
fileToPull=$OPTARG
;;
p)
packageName=$OPTARG
;;
esac
done;
# Block file arg from being blank
if [ -z "$fileToPull" ]; then
echo "Please specify file or folder to pull with -f argument"
exit 1
fi
# Block package name arg from being blank
if [ -z "$packageName" ]; then
echo "Please specify package name to run as when pulling file"
exit 1
fi
# Check package exists
adb shell pm list packages | grep "$packageName" > /dev/null
if [ $? -gt 0 ]; then
echo "Package name $packageName does not exist on device"
exit 1
fi
# Check file exists and has permission with run-as
fileCheck=`adb shell "run-as $packageName ls $fileToPull"`
if [[ $fileCheck =~ "Permission denied" ]] || [[ $fileCheck =~ "No such file or directory" ]]; then
echo "Error: $fileCheck"
echo "With file -> $fileToPull"
exit 1
fi
# Function to pull private file
#
# param 1 = package name
# param 2 = file to pull
# param 3 = output file
function pull_private_file () {
mkdir -p `dirname $3`
echo -e "\033[0;35m***" >&2
echo -e "\033[0;36m Coping file $2 -> $3" >&2
echo -e "\033[0;35m***\033[0m" >&2
adb shell "run-as $1 cat $2" > $3
}
# Check if a file is a directory
#
# param 1 = directory to check
function is_file_dir() {
adb shell "if [ -d \"$1\" ]; then echo TRUE; fi"
}
# Check if a file is a symbolic link
#
# param 1 = directory to check
function is_file_symlink() {
adb shell "if [ -L \"$1\" ]; then echo TRUE; fi"
}
# recursively pull files from device connected to adb
#
# param 1 = package name
# param 2 = file to pull
# param 3 = output file
function recurse_pull_private_files() {
is_dir=`is_file_dir "$2"`
is_symlink=`is_file_symlink "$2"`
if [ -n "$is_dir" ]; then
files=`adb shell "run-as $1 ls \"$2\""`
# Handle the case where directory is a symbolic link
if [ -n "$is_symlink" ]; then
correctPath=`adb shell "run-as $1 ls -l \"$2\"" | sed 's/.*-> //' | tr -d '\r'`
files=`adb shell "run-as $1 ls \"$correctPath\""`
fi
for i in $files; do
# Android adds nasty carriage return that screws with bash vars
# This removes it. Otherwise weird behavior happens
fileName=`echo "$i" | tr -d '\r'`
nextFile="$2/$fileName"
nextOutput="$3/$fileName"
recurse_pull_private_files "$1" "$nextFile" "$nextOutput"
done
else
pull_private_file "$1" "$2" "$3"
fi
}
recurse_pull_private_files "$packageName" "$fileToPull" "`basename "$fileToPull"`"
Gist:
https://gist.github.com/davethomas11/6c88f92c6221ffe6bc26de7335107dd4
Volver al método 1 , descifrar una copia de seguridad con Android Backup Extractor
Estos son los pasos que tomé en mi Mac y los problemas que encontré:
Primero puse en cola una copia de seguridad (y establecí una contraseña para cifrar mi copia de seguridad, mi dispositivo la requería):
adb backup -f myAndroidBackup.ab com.corp.appName
En segundo lugar, descargué solo abe.jar desde aquí: https://sourceforge.net/projects/adbextractor/files/abe.jar/download
Luego corrí:
java -jar ./abe.jar unpack myAndroidBackup.ab myAndroidBackup.tar
En este punto recibí un mensaje de error. Debido a que mi archivo está encriptado, Java me dio un error que necesitaba para instalar algunas bibliotecas de políticas de seguridad.
- Así que fui a http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html y descargué los archivos de política de seguridad que necesitaba. Ahora, en mi caso, las instrucciones de instalación me indicaron la ubicación incorrecta para colocar los archivos jar. Dice que la ubicación adecuada es <java-home> / lib / security . Los puse allí primero y todavía recibí el mensaje de error. Así que investigué y en mi Mac con Java 1.8 el lugar correcto para colocarlos era: <java-home> / jre / lib / security . Me aseguré de hacer una copia de seguridad de los archivos de políticas originales y los puse allí. Vola, pude ingresar una contraseña con abe.jar y descifrarla en un archivo tar.
Por último, acabo de ejecutar ( después de ejecutar el comando anterior nuevamente )
tar xvf myAndroidBackup.tar
Ahora es importante tener en cuenta que si puedes correr como y gato, es mucho más rápido. Uno, solo obtiene los archivos que desea y no la aplicación completa. Dos, cuantos más archivos (+ cifrado para mí), la transferencia es más lenta. Entonces, saber hacerlo de esta manera es importante si no tiene run-as en OSX, pero el script debe ir primero a una aplicación de depuración.
Eso sí, lo escribí hoy y lo probé varias veces, ¡así que notifícame de cualquier error!