Kişi kendi Android uygulamasının (özel) verilerini nasıl çekebilir?


100

Kullanarak tek bir dosya çekmeye çalışıyorum

adb pull /data/data/com.corp.appName/files/myFile.txt myFile.txt

ile başarısız

failed to copy '/data/data/com.corp.appName/files/myFile.txt myFile.txt' to 'myFile.txt': Permission denied

bu USB hata ayıklama cihazda etkin olmasına rağmen.

Arkaik rotada problemin etrafından dolaşabiliriz

adb shell
run-as com.corp.appName
cat files/myFile.txt > myFile.txt

ancak bu, birden fazla dosya için kullanışsızdır.

/Data/data/com.corp.appName/files dizinini MacBook'uma nasıl çekebilirim?

Bunu ya doğrudan ya da / storage / sdcard0 / myDir'de (Android Dosya Aktarımı ile devam edebileceğim yerden) bir geçiş yoluyla yapmak iyi.

Ek Yorum

Bu sadece koşuyor olabilir

adb backup  -f myFiles com.corp.appName

aradığım dosyaları oluşturacak. Bu durumda ortaya çıkan yedeği açmak / açmak için bir yol arıyorum!


5
Cihaz köklenmedikçe, bunu yapamazsınız.
323go

Umarım yanılıyorsundur, ancak her ihtimale karşı, lütfen yorumunuzu yanıt olarak taşıyın. Neden böyle düşündüğünüzü desteklemek için bir çeşit referans ekleyebilir misiniz? Yayınlanmaya daha yakın olan programımın her türlü girdi dosyasını incelikle işleyeceğinden emin olmak için programımın buggy sürümlerinin kaydettiği tüm gereksiz dosyaları kaydetmek istiyorum.
Calaf

1
Bu, dizini dünyadan: - x'den dünyaya: rx'e, dosyaları getirebilecek kadar uzun süre değiştirebileceğiniz anlamına mı geliyor?
Calaf

1
@Knossos Bu benim uygulamam olmasına rağmen, kullanıcıların bir uygulamanın cihazlarında depoladığı özel verilerin bir kopyasını kaydetmeleri yasal değil mi? Sonuçta, veriler muhtemelen uygulamanın yazarına değil cihaz sahibine aittir.
Calaf

1
Sorun, Google Apps özel verilerinizle arayüz oluşturmaya çalışan sahip ile kötü niyetli bir Uygulama / programı nasıl ayırt edeceğinizdir. (kullanıcıların kişisel verilerini
içerebilir

Yanıtlar:


105

adb backup Android'e özel bir arşiv yazacaktır:

adb backup  -f myAndroidBackup.ab  com.corp.appName

Bu arşiv aşağıdakiler kullanılarak tar formatına dönüştürülebilir:

dd if=myAndroidBackup.ab bs=4K iflag=skip_bytes skip=24 | openssl zlib -d > myAndroidBackup.tar

Referans:

http://nelenkov.blogspot.ca/2012/06/unpacking-android-backups.html

Bu bağlantıda "Güncelle" yi arayın.


Alternatif olarak, dosyaları Android yedekleme ( ) dosyasından ayıklamak için Android yedekleme çıkarıcısını kullanın .ab.


5
bs=24 skip=1bs=1 skip=24
şundan

19
dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -
Openssl'nin

6
ddİşyerinde MacBook'umdaki komutla hiçbir zaman başarılı olamadım. Bunun yerine kullanıyorum java -jar ./abe.jar unpack data.ab data.tar. Abe yardımcı programını sourceforge.net/projects/adbextractor/files/?source=navbar
Someone Somewhere

4
Ayrıca, verilerini yedeklemek istediğim uygulamayı zorla kapatmak zorunda olduğumu fark ettim, aksi takdirde yedekleme boştur! (Android 4.4.2) Bu, manifestin gösterdiği android:allowBackup="false"
Someone Somewhere

2
Daha da iyisi, dosyaları doğrudan yerel dizine dd if=myAndroidBackup.ab bs=24 skip=1 | openssl zlib -d | tar -x
çıkarın

51

Ben de aynı sorunu yaşadım ama aşağıdaki şekilde çözdüm:

$ adb shell
$ run-as {app-package-name}
$ cd /data/data/{app-package-name}
$ chmod 777 {file}
$ cp {file} /mnt/sdcard/

Bundan sonra koşabilirsin

$ adb pull /mnt/sdcard/{file}

1
teşekkürler dostum! yinelemeli bir kopya yapmak için "cp -r" kullanmanız gerekir. stackoverflow.com/questions/39961621/…
朱 西西

31

İşte benim için işe yarayan şey:

adb -d shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db

Veritabanını doğrudan yerel dosyaya yazdırıyorum.


3
Tam olarak bu komut db dosyamın bozulmasına neden oldu. Ancak aşağıdaki adımlarla adb shell çalışmasını run-as com.example.test sağladım : ------ ------ kabuk içinde ------ kabuğun içinde cat ...db > /mnt/sdcard/file.db------ adb pull /mnt/sdcard/file.db .------ son (üzgünüm, satır aralarında çalışmıyor)
Kirill Oficerov

O komutlar tek satırda yazılabilir eğer @KirillOficerov iyi olurdu
emen

1 dosyaya ihtiyacınız olduğunda harika. Bunu veritabanı için kullanıyorum. Şimdi birden fazla dosyaya ihtiyacım olan davayla yüzleşiyorum.
Dave Thomas

Nedense kullanmak adb shellbenim için işe yaramadı, ancak bu cevabı takip edip kullanmak adb exec-outişe yaradı!
EpicPandaForce

21

MacOSX'te, Calaf ve Ollie Ford'un cevaplarını birleştirerek, aşağıdakiler benim için çalıştı.

Komut satırında (adb'nin yolunuzda olduğundan emin olun, benimki ~ / Library / Android / sdk / platform-tools / adb'deydi) ve android cihazınız takılı ve USB hata ayıklama modundayken şunu çalıştırın:

 adb backup -f backup com.mypackage.myapp

Android cihazınız, verilerinizi yedeklemek için sizden izin isteyecektir. "VERİLERİMİ YEDEKLE" seçeneğini seçin

Birkaç dakika bekleyin.

Dosya yedeği, adb'yi çalıştırdığınız dizinde görünecektir.

Şimdi çalıştırın:

dd if=backup bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" > backup.tar

Şimdi, şu şekilde açabileceğiniz bir backup.tar dosyanız olacak:

 tar xvf backup.tar

Ve uygulamanız tarafından depolanan tüm dosyaları görün.


Mac sürümünüz çalışıyor! NOT: Her iki adb backupve ddkatran dönüşüm adımları çalışırken hiçbir statü sağlar ve çok fazla veri varsa dakika sürebilir. Sabırlı ol!
MechEthan

2
Alıyorum: "zlib.error: Veri sıkıştırması açılırken hata -3: yanlış başlık kontrolü" Yedeklemem şifrelemek için bir parola istiyor. Bu python yöntemi yedeklemenin şifresini çözmek için parola istemez. Yukarıdaki örnekteki yorumlarda bulunan abe.jar parola soruyor, ancak bu yöntemi kullanarak kaldırdıktan sonra tüm dosyaları alamadım.
Dave Thomas

Abe.jar ile şifrelenmiş bir yedekleme üzerinde ikinci denemem işe yaradı.
Dave Thomas

7

Android Studio'nun daha yeni sürümleri, geliştirme Nexus 7'den dosya indirmek için kullanışlı bir GUI yöntemi olduğunu bulduğum Cihaz Dosyası Gezgini'ni içerir.

Cihazda USB Hata Ayıklamayı etkinleştirdiğinizden emin olmalısınız

  1. Aygıt Dosya Gezgini'ni açmak için Görünüm> Araç Pencereleri> Aygıt Dosya Gezgini'ne tıklayın veya araç penceresi çubuğundaki Aygıt Dosyası Gezgini düğmesine tıklayın.
  2. Açılır listeden bir cihaz seçin.
  3. Dosya gezgini penceresindeki cihaz içeriğiyle etkileşim kurun. Yeni bir dosya veya dizin oluşturmak, seçilen dosyayı veya dizini makinenize kaydetmek, karşıya yüklemek, silmek veya senkronize etmek için bir dosya veya dizine sağ tıklayın. Android Studio'da açmak için bir dosyayı çift tıklayın.

    Android Studio, bu şekilde açtığınız dosyaları projenizin dışında geçici bir dizine kaydeder. Cihaz Dosya Gezgini'ni kullanarak açtığınız bir dosyada değişiklikler yaparsanız ve değişikliklerinizi cihaza geri kaydetmek isterseniz, dosyanın değiştirilmiş sürümünü cihaza manuel olarak yüklemeniz gerekir.

dosya Gezgini

Tam Belgeler


6

Aşağıdaki kabuk komut dosyasını kullanabilirsiniz. Araçtaki gibi değil, uygulama önbelleğinden de dosya çekebilir adb backup:

#!/bin/sh

if [ -z "$1" ]; then 
    echo "Sorry script requires an argument for the file you want to pull."
    exit 1
fi

adb shell "run-as com.corp.appName cat '/data/data/com.corp.appNamepp/$1' > '/sdcard/$1'"
adb pull "/sdcard/$1"
adb shell "rm '/sdcard/$1'"

O zaman bunu şu şekilde kullanabilirsiniz:

./pull.sh files/myFile.txt
./pull.sh cache/someCachedData.txt

10
En iyi yanı, argümanlar vermemeniz ve sonra rm /sdcard/yerine koymamanızdır, şanslıyız -rf.
TWiStErRob

3
Ana bilgisayardaki bir dosyaya doğrudan cat yapabilirsiniz: "adb shell run-as com.whatever.Fnord cat /data/data/com.whatever.Fnord/databases/logging.db> / tmp / foo" (burada / tmp / foo, ana makinedeki bir dosyadır, android cihazda değildir)
James Moore

Az önce farkedilen @ dave-thomas sorunu bir süre önce çözdü. Olumsuz oyumu kaldırıyorum.
Don Hatch

Veya değil :-( "Bu yanıt düzenlenmedikçe
Don Hatch

TBH Bu konudaki yaygarayı anlamıyorum. (Orijinal) komut dosyası, boş olmadığı sürece dizini (eksik -rf anahtarı) asla silmezdi. Kontrol etmedim, ancak dizin boş olsa bile, betiğin bir bağlama noktası olduğu için dizini sildiğinden şüpheliyim. Senaryo tehlikeli görünüyordu, ama hiç olmadı ...
Tamas

5

Bir Mac makinesi ve Samsung telefonu kullanıyorsanız, bu (çünkü yapmanız gereken budur run-as eser yok Samsung ve zlib çalışmıyor Mac'te)

  1. Uygulamanızın veri dizininin yedeğini alın adb backup -f /Users/username/Desktop/data.ab com.example

  2. Cihazınızda şifrelemek için bir şifre istenecektir, şifre girmeyin. "Verilerimi yedekle" seçeneğine dokunun. Bkz BackUp Nasıl alınır?

  3. Başarıyla yedeklendiğinde, data.abdosyayı Masaüstünüzde göreceksiniz . Şimdi bunu tarformata dönüştürmemiz gerekiyor .

  4. Bunun için Android Backup Extractor'ı kullanın . İndir | Kaynak kodu

  5. İndirin ve abe.jardosyayı göreceksiniz . Bunu PATH değişkeninize ekleyin.

  6. Tar dosyasını oluşturmak için bunu yürütün :java -jar abe.jar unpack /Users/username/Desktop/data.ab /Users/username/Desktop/data.tar

  7. Tüm dosyalara erişmek için data.tar dosyasını çıkarın


2
Bunu tam olarak takip ettim data.tarve bir data.tar.cpgz@henry'den alıntılar
user-

2

Bu cevap, diğer cevaplarla ilgili deneyimime ve cevaplardaki yorumlara dayanmaktadır. Umudum, benzer bir durumda birine yardım edebilirim.

Bunu OSX'te terminal aracılığıyla yapıyorum .

Daha önce Vinicius Avellar'ın cevabı benim için harikaydı. Sadece çoğu zaman bir hata ayıklama uygulamasından cihazdaki veritabanına ihtiyaç duyuyordum.

Bugün, birden fazla özel dosyaya ihtiyacım olan bir kullanım durumum vardı . Bu dava için iyi çalışan iki çözüm buldum.

  1. Kabul edilen yanıtı Someone Somewhere'in OSX'e özgü yorumlarıyla birlikte kullanın. Bir yedek oluşturun ve bir katran paketini açmak için 3. taraf çözümü olan sourceforge.net/projects/adbextractor/files/?source=navbar'ı kullanın. Bu cevabın altına bu çözümle ilgili deneyimim hakkında daha fazla yazacağım. Aradığınız şey buysa aşağı kaydırın.

  2. Yerleştiğim daha hızlı bir çözüm. Tamas'ın cevabına benzer birden çok dosyayı çekmek için bir komut dosyası oluşturdum. Bunu bu şekilde yapabiliyorum çünkü uygulamam bir hata ayıklama uygulaması ve cihazımda farklı çalıştırma erişimim var. Çalıştırma erişiminiz yoksa, bu yöntem OSX'te sizin için çalışmayacaktır.

İşte bu harika soruyu araştıran okuyucu olarak sizinle paylaşacağım birden fazla özel dosyayı çekmek için betiğim;):

#!/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"`"

Ana bilgi: https://gist.github.com/davethomas11/6c88f92c6221ffe6bc26de7335107dd4


Yöntem 1'e geri dön , Android Backup Extractor kullanarak bir yedeklemenin şifresini çözme

İşte Mac'imde attığım adımlar ve karşılaştığım sorunlar:

Önce bir yedeklemeyi sıraya koydum (ve yedeklememi şifrelemek için bir parola belirledim, cihazım gerekliydi):

adb backup -f myAndroidBackup.ab  com.corp.appName

İkincisi, abe.jar dosyasını buradan indirdim: https://sourceforge.net/projects/adbextractor/files/abe.jar/download

Sonra koştum:

java -jar ./abe.jar unpack myAndroidBackup.ab myAndroidBackup.tar

Bu noktada bir hata mesajı aldım. Arşivim şifreli olduğu için, java bana bazı güvenlik politikası kitaplıklarını yüklemem gerektiğine dair bir hata verdi.

  • Bu yüzden http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html adresine gittim ve ihtiyacım olan güvenlik politikası kavanozlarını indirdim. Şimdi benim durumumda yükleme talimatları bana jar dosyalarını yerleştirmek için yanlış yeri söyledi. Uygun konumun <java-home> / lib / security olduğunu söylüyor . Onları önce oraya koydum ve hala hata mesajı alıyorum. Bu yüzden araştırdım ve Java 1.8 ile Mac'imde onları yerleştirmek için doğru yer şuydu: <java-home> / jre / lib / security . Orijinal ilke kavanozlarını yedekledim ve oraya koydum. Vola abe.jar ile bir şifre girebildim ve bir tar dosyasının şifresini çözebildim.

Son olarak koştum ( önceki komutu tekrar çalıştırdıktan sonra )

tar xvf myAndroidBackup.tar

Şimdi not etmek önemlidir ki, sadece koşabilir ve kedi yiyebilirseniz, çok daha hızlıdır. Birincisi, tüm uygulamayı değil, yalnızca istediğiniz dosyaları alırsınız. İkincisi, daha fazla dosya (benim için şifreleme) aktarımı yavaşlatır. Bu nedenle, OSX'te olduğu gibi çalıştırmıyorsanız, bu şekilde yapmayı bilmek önemlidir, ancak komut dosyası bir hata ayıklama uygulaması için ilk olarak gitmelidir.

Bugün yazdım ve birkaç kez test ettim, bu yüzden lütfen hataları bana bildirin!


1
1. yöntemle verdiğiniz yanıt sayesinde, köklü olmayan bir üretim cihazına yüklenmiş hata ayıklama hedefli bir uygulamadan bir paket yedeği alıp inceleyebildim, ancak yedek yalnızca bildirim dosyasını içeriyor. Yöntem # 2 ile tüm uygulamanın verilerini indirdim, ancak ikili dosyalar (yani SQLite dosyaları) okunamıyor. Benim için çalışan senaryoya dayalı bir çözüm ekliyorum.
Paolone

1

Aşağıdaki kodu ekleyerek doğru izinleri ayarladıktan sonra:

File myFile = ...;
myFile.setReadable(true, false); // readable, not only for the owner

adb pull istendiği gibi çalışır.

File.setReadable () konusuna bakın


1
Hata ayıklama sırasında izinleri değiştirmek sorun değil, ancak bir noktada yayınlamanın yakın bir noktasında bunu yapmak varsayılan olarak sunulan korumayı geçersiz kılacaktır (diğer uygulamaların dosyalara erişmesini / bunlarla uğraşmasını önlemek için). Bu nedenle, geliştiricinin dosyalara yalnızca kullanıcı tarafından okunabilir / yazılabilir olsalar bile erişmesinin bir yolu daha arzu edilir.
Calaf

1

Dave Thomas senaryosundan başlayarak 2 sorunun üstesinden gelmek için kendi çözümümü yazabildim:

  1. yedeğim yalnızca bildirim dosyasını içeriyordu
  2. ikili dosyalar Dave Thomas ile okunamayan yerlerde var

Bu, uygulama verilerini sdcard'a kopyalayan ve ardından çeken komut dosyam

#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 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

    adb shell "run-as $packageName cp -r /data/data/$packageName/ /sdcard/$packageName"
    adb pull /sdcard/$packageName
    adb shell rm -rf /sdcard/$packageName

1

Tamas'ın cevabına benzer şekilde , burada Mac OS X için tüm dosyaları your.app.idcihazınızdan almak ve buraya kaydetmek için tek satırlık bir program var (bu durumda) ~/Desktop/your.app.id:

(
    id=your.app.id &&
    dest=~/Desktop &&
    adb shell "run-as $id cp -r /data/data/$id /sdcard" &&
    adb -d pull "/sdcard/$id" "$dest" &&
    if [ -n "$id" ]; then adb shell "rm -rf /sdcard/$id"; fi
)
  • -dÖykünücüden çekmeyi hariç tut
  • Oturum değişkenlerinizi bastırmaz
  • Tüm bloğu Terminal.app içine yapıştırabilirsiniz (veya isterseniz yeni satırları kaldırabilirsiniz)

0

Oyun verileri apk ile yedeklendi . Nougat Oneplus 2.

**adb backup "-apk com.nekki.shadowfight" -f "c:\myapk\samsung2.ab"**

adb backup -f myapp.ab -apk com.myapp # backup on one device adb restore myapp.ab # restore to the same or any other device
Steven Linn

0

Bu, dizini dünyadan: - x'den dünyaya: rx'e, dosyaları getirebilecek kadar uzun süre değiştirebileceğiniz anlamına mı geliyor?

Evet kesinlikle. Yeterince tuhaf bir şekilde, dosyaya sahip olmak için dex bit . (en azından Android 2.3'te)

chmod 755 Tamamen bir dosyayı kopyalamak için çalıştı (ancak cihazı kullanmaya devam etmeyi planlıyorsanız, daha sonra izinleri geri almalısınız).


0

yapabilirsin:

adb pull / storage / emulated / 0 / Android / data //


2
Beni yanlış anlama ama soruyu doğru okudun mu? OP, 'özel' verileri 'kamuya' DEĞİL ' çekmek istiyor
baburao
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.