Questa risposta si basa sulla mia esperienza con altre risposte e sui commenti nelle risposte. La mia speranza è di poter aiutare qualcuno in una situazione simile.
Lo sto facendo su OSX tramite terminale.
In precedenza, la risposta di Vinicius Avellar funzionava benissimo per me. La maggior parte delle volte ho sempre avuto bisogno del database dal dispositivo da un'applicazione di debug.
Oggi ho avuto un caso d'uso in cui avevo bisogno di più file privati . Ho trovato due soluzioni che hanno funzionato bene per questo caso.
Usa la risposta accettata insieme ai commenti specifici per OSX di Someone Somewhere. Crea un backup e utilizza la soluzione di terze parti,
sourceforge.net/projects/adbextractor/files/?source=navbar per decomprimere in un tar. Scriverò di più sulla mia esperienza con questa soluzione in fondo a questa risposta. Scorri verso il basso se questo è quello che stai cercando.
Una soluzione più rapida con la quale ho deciso. Ho creato uno script per estrarre più file simile alla risposta di Tamas. Sono in grado di farlo in questo modo perché la mia app è un'app di debug e ho accesso a run-as sul mio dispositivo. Se non hai accesso a run-as questo metodo non funzionerà per te su OSX.
Ecco il mio script per estrarre più file privati che condividerò con te, il lettore, che sta anche indagando su questa fantastica domanda;):
#!/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
Torna al metodo 1 , decrittografare un backup utilizzando Android Backup Extractor
Ecco i passaggi che ho eseguito sul mio Mac e i problemi che ho riscontrato:
Per prima cosa ho messo in coda un backup (e ho impostato una password per crittografare il mio backup, il mio dispositivo lo richiedeva):
adb backup -f myAndroidBackup.ab com.corp.appName
Secondo ho scaricato solo abe.jar da qui: https://sourceforge.net/projects/adbextractor/files/abe.jar/download
Successivamente ho eseguito:
java -jar ./abe.jar unpack myAndroidBackup.ab myAndroidBackup.tar
A questo punto ho ricevuto un messaggio di errore. Poiché il mio archivio è crittografato, java mi ha fornito un errore che mi serviva per installare alcune librerie di criteri di sicurezza.
- Quindi sono andato su http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html e ho scaricato i file dei criteri di sicurezza di cui avevo bisogno. Ora nel mio caso le istruzioni di installazione mi hanno detto che la posizione sbagliata per mettere i file jar. Dice che la posizione corretta è <java-home> / lib / security . Li ho inseriti per primi e ho ancora ricevuto il messaggio di errore. Quindi ho indagato e sul mio Mac con Java 1.8 il posto corretto per metterli era: <java-home> / jre / lib / security . Mi sono assicurato di eseguire il backup dei file dei criteri originali e di inserirli lì. Vola Sono stato in grado di inserire una password con abe.jar e decifrare in un file tar.
Infine ho appena eseguito ( dopo aver eseguito di nuovo il comando precedente )
tar xvf myAndroidBackup.tar
Ora è importante notare che se puoi semplicemente correre come e gatto, è molto molto più veloce. Uno, ottieni solo i file che desideri e non l'intera applicazione. Due, più file (+ crittografia per me) rende più lento il trasferimento. Quindi sapere in questo modo è importante se non hai run-as su OSX, ma lo script dovrebbe essere prima goto per un'applicazione di debug.
Intendiamoci, l'ho scritto oggi e l'ho testato un paio di volte, quindi per favore avvisatemi di eventuali bug!