เราจะดึงข้อมูล (ส่วนตัว) ของแอพ Android ของตัวเองได้อย่างไร?


100

กำลังพยายามดึงไฟล์เดียวโดยใช้

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

ล้มเหลวด้วย

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

แม้ว่าจะเปิดใช้งานการดีบัก USB บนอุปกรณ์ก็ตาม

เราสามารถแก้ไขปัญหาได้โดยใช้เส้นทางโบราณ

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

แต่จะไม่สะดวกสำหรับไฟล์มากกว่าหนึ่งไฟล์

ฉันจะดึงไดเร็กทอรี /data/data/com.corp.appName/files ไปยัง MacBook ได้อย่างไร

การทำเช่นนี้โดยตรงหรือผ่านการขนส่งใน `/ storage / sdcard0 / myDir (จากที่ฉันสามารถดำเนินการต่อด้วย Android File Transfer) ก็ใช้ได้

ความคิดเห็นเพิ่มเติม

อาจเป็นได้ว่าเพิ่งวิ่ง

adb backup  -f myFiles com.corp.appName

จะสร้างไฟล์ที่ฉันกำลังมองหา ในกรณีนั้นฉันกำลังมองหาวิธีคลาย / คลายซิปข้อมูลสำรองที่ได้!


5
หากอุปกรณ์ไม่ได้รับการรูทคุณก็ไม่สามารถทำได้
323 ก.

ฉันหวังว่าคุณจะคิดผิด แต่ในกรณีนี้โปรดย้ายความคิดเห็นของคุณเพื่อเป็นคำตอบ คุณช่วยเพิ่มข้อมูลอ้างอิงเพื่อสำรองว่าทำไมคุณถึงคิดเช่นนั้น ฉันต้องการบันทึกไฟล์ขยะทั้งหมดที่โปรแกรมเวอร์ชันบั๊กกี้ของฉันบันทึกไว้เพื่อให้แน่ใจว่าโปรแกรมที่ใกล้จะวางจำหน่ายของฉันจะจัดการไฟล์อินพุตทุกประเภทได้อย่างสง่างาม
Calaf

1
นั่นหมายความว่าเราสามารถ chmod ไดเร็กทอรีจาก world: - x to world: rx นานพอที่จะดึงไฟล์ได้หรือไม่?
Calaf

1
@Knossos แม้ว่าจะเป็นแอปของฉัน แต่ผู้ใช้สามารถบันทึกสำเนาข้อมูลส่วนตัวที่แอปเก็บไว้ในอุปกรณ์ได้หรือไม่ ท้ายที่สุดข้อมูลน่าจะเป็นของเจ้าของอุปกรณ์ไม่ใช่ผู้สร้างแอป
Calaf

1
ปัญหาคือคุณจะแยกความแตกต่างระหว่างเจ้าของและแอป / โปรแกรมที่เป็นอันตรายได้อย่างไรโดยพยายามเชื่อมต่อกับข้อมูลส่วนตัวของแอปของคุณ (ซึ่งอาจมีข้อมูลส่วนบุคคลของผู้ใช้อยู่)
Knossos

คำตอบ:


105

การสำรองข้อมูล adb จะเขียนไฟล์เก็บถาวรเฉพาะ Android:

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

ไฟล์เก็บถาวรนี้สามารถแปลงเป็นรูปแบบ tar โดยใช้:

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

อ้างอิง:

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

ค้นหา "อัปเดต" ที่ลิงก์นั้น


หรือใช้ตัวแยกข้อมูลสำรองของ Androidเพื่อแยกไฟล์จากไฟล์สำรองข้อมูล Android ( .ab)


5
bs=24 skip=1เร็วกว่ามากbs=1 skip=24(ในระบบของฉัน 38.6 MB / s เทียบกับ 1.7 MB / s) :)
netvope

19
ทางเลือก Python สำหรับที่ที่ไม่ได้รวบรวม openssl ด้วย zlib: dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -(จากแหล่งที่มาด้านบน)
OJFord

6
ฉันไม่เคยประสบความสำเร็จกับddคำสั่งบน MacBook ในที่ทำงาน แต่ฉันใช้java -jar ./abe.jar unpack data.ab data.tar. คุณสามารถดาวน์โหลดยูทิลิตี้ abe ได้จากsourceforge.net/projects/adbextractor/files/?source=navbar
Somewhere

4
นอกจากนี้ฉันสังเกตเห็นว่าฉันต้องบังคับปิดแอพที่มีข้อมูลที่ฉันต้องการสำรองมิฉะนั้นการสำรองข้อมูลจะว่างเปล่า! (แอนดรอยด์ 4.4.2) ซึ่งเป็นเอฟเฟกต์เดียวกับเมื่อรายการแสดงandroid:allowBackup="false"
ใครสักคน

2
ยิ่งไปกว่านั้นให้แตกไฟล์ลงในไดเร็กทอรีภายในโดยตรง:dd if=myAndroidBackup.ab bs=24 skip=1 | openssl zlib -d | tar -x
mreichelt

51

ฉันมีปัญหาเดียวกัน แต่แก้ไขได้โดยดำเนินการดังนี้:

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

หลังจากนี้คุณสามารถเรียกใช้

$ adb pull /mnt/sdcard/{file}

1
ขอบคุณมาก! คุณต้องใช้ "cp -r" เพื่อสร้างสำเนาซ้ำ stackoverflow.com/questions/39961621/…
朱西西

31

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน:

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

ฉันกำลังพิมพ์ฐานข้อมูลลงในไฟล์ในเครื่องโดยตรง


3
คำสั่งนี้ทำให้ไฟล์ db ของฉันเสียหาย แต่ฉันทำให้มันทำงานตามขั้นตอนต่อไปนี้: ------ adb shell ------ ภายในเชลล์รันrun-as com.example.test ------ ภายในเชลล์รันcat ...db > /mnt/sdcard/file.db------ adb pull /mnt/sdcard/file.db .------ end (ขออภัยการแบ่งบรรทัดใช้ไม่ได้)
Kirill Oficerov

@KirillOficerov มันจะดีถ้าคำสั่งเหล่านั้นสามารถเขียนได้ในบรรทัดเดียว
emen

ยอดเยี่ยมเมื่อคุณต้องการ 1 ไฟล์ ใช้สิ่งนี้สำหรับฐานข้อมูล ตอนนี้กำลังเผชิญกับกรณีที่ฉันต้องการไฟล์หลายไฟล์
Dave Thomas

ด้วยเหตุผลบางอย่างการใช้adb shellไม่ได้ผลสำหรับฉัน แต่การทำตามคำตอบนี้และใช้adb exec-outมันได้ผล!
EpicPandaForce

21

บน MacOSX โดยการรวมคำตอบจาก Calaf และ Ollie Ford สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉัน

ในบรรทัดคำสั่ง (ตรวจสอบให้แน่ใจว่า adb อยู่ในเส้นทางของคุณฉันอยู่ที่ ~ / Library / Android / sdk / platform-tools / adb) และเมื่อเสียบอุปกรณ์ Android ของคุณและอยู่ในโหมดดีบัก USB ให้รัน:

 adb backup -f backup com.mypackage.myapp

อุปกรณ์ Android ของคุณจะขออนุญาตจากคุณในการสำรองข้อมูลของคุณ เลือก "สำรองข้อมูลของฉัน"

รอสักครู่.

การสำรองไฟล์จะปรากฏในไดเร็กทอรีที่คุณเรียกใช้ adb

ตอนนี้เรียกใช้:

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

ตอนนี้คุณจะมีไฟล์ backup.tar ที่คุณสามารถแก้ปัญหาได้ดังนี้:

 tar xvf backup.tar

และดูไฟล์ทั้งหมดที่จัดเก็บโดยแอปพลิเคชันของคุณ


เวอร์ชัน Mac ของคุณใช้งานได้! หมายเหตุ: ทั้งสองadb backupและddขั้นตอนการแปลง tar ไม่ให้สถานะในขณะที่ทำงานและสามารถใช้เวลานาทีถ้าคุณมีข้อมูลเป็นจำนวนมาก อดใจรอ!
MechEthan

2
ฉันได้รับ: "zlib.error: เกิดข้อผิดพลาด -3 ขณะคลายการบีบอัดข้อมูล: ตรวจสอบส่วนหัวไม่ถูกต้อง" ข้อมูลสำรองของฉันกำลังขอรหัสผ่านเพื่อเข้ารหัส วิธีหลามนี้ไม่ขอรหัสผ่านเพื่อถอดรหัสข้อมูลสำรอง abe.jar ในความคิดเห็นในตัวอย่างด้านบนขอรหัสผ่าน แต่ฉันไม่ได้รับไฟล์ทั้งหมดหลังจากไม่ใส่ใจใช้วิธีการนั้น
Dave Thomas

ความพยายามครั้งที่สองของฉันกับ abe.jar ในการสำรองข้อมูลที่เข้ารหัสใช้งานได้
Dave Thomas

7

Android Studio เวอร์ชันใหม่กว่ามีDevice File Explorerซึ่งฉันพบว่าเป็นวิธี GUI ที่สะดวกในการดาวน์โหลดไฟล์จากการพัฒนา Nexus 7 ของฉัน

คุณต้องแน่ใจว่าคุณได้เปิดใช้งาน USB Debugging บนอุปกรณ์แล้ว

  1. คลิก View> Tool Windows> Device File Explorer หรือคลิกปุ่ม Device File Explorer ในแถบหน้าต่างเครื่องมือเพื่อเปิด Device File Explorer
  2. เลือกอุปกรณ์จากรายการดรอปดาวน์
  3. โต้ตอบกับเนื้อหาอุปกรณ์ในหน้าต่าง File Explorer คลิกขวาที่ไฟล์หรือไดเร็กทอรีเพื่อสร้างไฟล์หรือไดเร็กทอรีใหม่บันทึกไฟล์หรือไดเร็กทอรีที่เลือกลงในเครื่องของคุณอัปโหลดลบหรือซิงโครไนซ์ ดับเบิลคลิกที่ไฟล์เพื่อเปิดใน Android Studio

    Android Studio จะบันทึกไฟล์ที่คุณเปิดด้วยวิธีนี้ในไดเรกทอรีชั่วคราวภายนอกโครงการของคุณ หากคุณทำการแก้ไขไฟล์ที่คุณเปิดโดยใช้ Device File Explorer และต้องการบันทึกการเปลี่ยนแปลงของคุณกลับไปที่อุปกรณ์คุณต้องอัปโหลดไฟล์เวอร์ชันที่แก้ไขไปยังอุปกรณ์ด้วยตนเอง

โปรแกรมสำรวจไฟล์

เอกสารฉบับเต็ม


6

คุณสามารถใช้เชลล์สคริปต์ด้านล่างนี้ มันสามารถดึงไฟล์จากแคชของแอพได้เช่นกันไม่เหมือนกับ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'"

จากนั้นคุณสามารถใช้งานได้ดังนี้:

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

10
ส่วนที่ดีที่สุดคือเมื่อคุณไม่ได้ให้ข้อโต้แย้งแล้วทดแทนโชคดีก็ไม่ได้rm /sdcard/ -rf
TWiStErRob

3
คุณสามารถ cat ไปยังไฟล์บนโฮสต์ได้โดยตรง: "adb shell run-as com.whatever.Fnord cat /data/data/com.whatever.Fnord/databases/logging.db> / tmp / foo" (โดยที่ / tmp / foo เป็นไฟล์บนเครื่องโฮสต์ไม่ใช่อุปกรณ์ Android)
James Moore

เพิ่งรู้ว่า @ dave-thomas แก้ไขปัญหาเมื่อครู่ที่แล้ว การลบการลงคะแนนของฉัน
Don Hatch

หรือไม่ :-( "ตอนนี้การโหวตของคุณถูกล็อคเว้นแต่จะมีการแก้ไขคำตอบนี้"
Don Hatch

TBH ฉันไม่เข้าใจความยุ่งยากเกี่ยวกับเรื่องนี้ สคริปต์ (ดั้งเดิม) จะไม่ลบไดเร็กทอรี (สวิตช์ -rf ที่ขาดหายไป) เว้นแต่จะว่างเปล่า ฉันไม่ได้ตรวจสอบ แต่แม้ว่าไดเร็กทอรีจะว่างเปล่าฉันสงสัยว่าสคริปต์ลบไดเร็กทอรีเนื่องจากเป็นจุดต่อเชื่อม สคริปต์ดูอันตราย แต่มันไม่เคยเป็น ...
Tamas

5

หากคุณใช้เครื่อง Mac และโทรศัพท์ Samsung นี่คือสิ่งที่คุณต้องทำ (เนื่องจากใช้run-as ไม่ได้กับ Samsung และzlib ไม่ทำงานบน Mac)

  1. สำรองข้อมูลไดเรกทอรีข้อมูลของแอป adb backup -f /Users/username/Desktop/data.ab com.example

  2. คุณจะถูกขอรหัสผ่านเพื่อเข้ารหัสในโทรศัพท์ของคุณอย่าป้อนใด ๆ เพียงแตะที่ "สำรองข้อมูลของฉัน" ดูวิธีการสำรองข้อมูล?

  3. เมื่อสำรองข้อมูลเรียบร้อยแล้วคุณจะเห็นdata.abไฟล์ในเดสก์ท็อปของคุณ ตอนนี้เราต้องแปลงสิ่งนี้เป็นtarรูปแบบ

  4. ใช้Android Backup Extractorสำหรับสิ่งนี้ ดาวน์โหลด | รหัสแหล่งที่มา

  5. ดาวน์โหลดและคุณจะเห็นabe.jarไฟล์ เพิ่มสิ่งนี้ในตัวแปร PATH ของคุณ

  6. ดำเนินการนี้เพื่อสร้างไฟล์tar :java -jar abe.jar unpack /Users/username/Desktop/data.ab /Users/username/Desktop/data.tar

  7. แตกไฟล์data.tarเพื่อเข้าถึงไฟล์ทั้งหมด


2
ทำตามสิ่งนี้และdata.tarสารสกัดจากdata.tar.cpgz@henry
user-44651

2

คำตอบนี้มาจากประสบการณ์ของฉันกับคำตอบอื่น ๆ และความคิดเห็นในคำตอบ ความหวังของฉันคือฉันสามารถช่วยใครบางคนในสถานการณ์คล้าย ๆ กันได้

ฉันกำลังทำสิ่งนี้บนOSXผ่านเทอร์มินัล

ก่อนหน้านี้คำตอบของ Vinicius Avellar ใช้ได้ผลดีสำหรับฉัน ฉันเป็นเพียงช่วงเวลาส่วนใหญ่ที่ต้องการฐานข้อมูลจากอุปกรณ์จากแอปพลิเคชันดีบัก

วันนี้ผมมีกรณีการใช้งานที่ผมจำเป็นต้องมีไฟล์ส่วนตัวหลาย ฉันได้วิธีแก้ปัญหาสองวิธีที่ใช้ได้ผลดีสำหรับกรณีนี้

  1. ใช้คำตอบที่ยอมรับพร้อมกับความคิดเห็นเฉพาะ OSX ของใครบางคน สร้างข้อมูลสำรองและใช้โซลูชันของบุคคลที่สาม sourceforge.net/projects/adbextractor/files/?source=navbarเพื่อคลายแพ็กลงใน tar ฉันจะเขียนเพิ่มเติมเกี่ยวกับประสบการณ์ของฉันกับโซลูชันนี้ที่ด้านล่างของคำตอบนี้ เลื่อนลงหากนี่คือสิ่งที่คุณกำลังมองหา

  2. วิธีแก้ปัญหาที่เร็วกว่าซึ่งฉันตัดสินด้วย ฉันสร้างสคริปต์สำหรับดึงไฟล์หลายไฟล์ที่คล้ายกับคำตอบของ Tamas ฉันสามารถทำได้ด้วยวิธีนี้เนื่องจากแอปของฉันเป็นแอปดีบักและฉันสามารถเข้าถึงการรันบนอุปกรณ์ของฉันได้ หากคุณไม่สามารถเข้าถึง run-as วิธีนี้จะไม่ได้ผลสำหรับคุณบน OSX

นี่คือสคริปต์ของฉันสำหรับการดึงไฟล์ส่วนตัวหลายไฟล์ที่ฉันจะแบ่งปันกับคุณผู้อ่านซึ่งกำลังตรวจสอบคำถามที่ยอดเยี่ยมนี้ด้วย;):

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

ส่วนสำคัญ: https://gist.github.com/davethomas11/6c88f92c6221ffe6bc26de7335107dd4


กลับไปที่วิธีที่ 1การถอดรหัสข้อมูลสำรองโดยใช้Android Backup Extractor

นี่คือขั้นตอนที่ฉันทำบน Mac และปัญหาที่ฉันพบ:

ก่อนอื่นฉันจัดคิวข้อมูลสำรอง (และตั้งรหัสผ่านเพื่อเข้ารหัสข้อมูลสำรองของฉันอุปกรณ์ของฉันจำเป็นต้องใช้):

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

อย่างที่สองฉันดาวน์โหลด abe.jar จากที่นี่: https://sourceforge.net/projects/adbextractor/files/abe.jar/download

ต่อไปฉันวิ่ง:

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

ณ จุดนี้ฉันได้รับข้อความแสดงข้อผิดพลาด เนื่องจากไฟล์เก็บถาวรของฉันถูกเข้ารหัส java ทำให้ฉันมีข้อผิดพลาดที่ฉันต้องติดตั้งไลบรารีนโยบายความปลอดภัยบางอย่าง

  • ฉันจึงไปที่http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.htmlและดาวน์โหลดกระปุกนโยบายความปลอดภัยที่ฉันต้องการ ตอนนี้ในกรณีของฉันคำแนะนำในการติดตั้งบอกตำแหน่งที่ไม่ถูกต้องในการใส่ไฟล์ jar มันบอกว่าสถานที่ที่เหมาะสมเป็น<Java บ้าน> / lib / การรักษาความปลอดภัย ฉันใส่ไว้ที่นั่นก่อนและยังคงได้รับข้อความแสดงข้อผิดพลาด ดังนั้นผมจึงสอบสวนและบน Mac ของฉันกับ Java 1.8 สถานที่ที่ถูกต้องที่จะนำพวกเขาคือ: <Java บ้าน> / JRE / lib / การรักษาความปลอดภัย ฉันแน่ใจว่าได้สำรองข้อมูลในช่องนโยบายเดิมและวางไว้ที่นั่น Vola ฉันสามารถป้อนรหัสผ่านด้วย abe.jar และถอดรหัสเป็นไฟล์ tar

สุดท้ายฉันเพิ่งวิ่ง ( หลังจากเรียกใช้คำสั่งก่อนหน้าอีกครั้ง )

tar xvf myAndroidBackup.tar

ตอนนี้สิ่งสำคัญคือต้องสังเกตว่าถ้าคุณสามารถวิ่งเป็นและแมวได้มันจะเร็วกว่ามาก ประการแรกคุณจะได้รับเฉพาะไฟล์ที่คุณต้องการไม่ใช่แอปพลิเคชันทั้งหมด สองไฟล์ยิ่งมากขึ้น (+ การเข้ารหัสสำหรับฉัน) ทำให้การถ่ายโอนช้าลง ดังนั้นการรู้วิธีนี้จึงเป็นสิ่งสำคัญหากคุณไม่ได้รันบน OSX แต่สคริปต์ควรเป็นขั้นแรกสำหรับแอปพลิเคชันดีบัก

โปรดทราบว่าฉันเพิ่งเขียนวันนี้และทดสอบไปสองสามครั้งดังนั้นโปรดแจ้งให้ฉันทราบถึงข้อบกพร่องใด ๆ !


1
ขอบคุณสำหรับการตอบกลับของคุณด้วยวิธี # 1 ฉันสามารถรับและสำรวจการสำรองแพ็กเกจจากแอปที่กำหนดเป้าหมายการดีบักที่ติดตั้งบนอุปกรณ์ที่ใช้งานจริงที่ไม่ได้รูท แต่การสำรองข้อมูลมีเฉพาะไฟล์รายการเท่านั้น ด้วยวิธี # 2 ฉันดาวน์โหลดข้อมูลของแอพทั้งหมด แต่ไบนารี (เช่นไฟล์ SQLite) ไม่สามารถอ่านได้ ฉันเพิ่มโซลูชันตามสคริปต์ของคุณที่เหมาะกับฉัน
Paolone

1

หลังจากตั้งค่าสิทธิ์ที่ถูกต้องโดยเพิ่มรหัสต่อไปนี้:

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

adb pull ทำงานได้ตามต้องการ

ดูFile.setReadable ()


1
การเปลี่ยนสิทธิ์ขณะทำการดีบักเป็นเรื่องที่ถูกต้อง แต่ในบางช่วงเวลาที่ใกล้การเปิดตัวการทำเช่นนั้นจะทำให้การป้องกันที่มีให้โดยค่าเริ่มต้น (เพื่อป้องกันไม่ให้แอปอื่นเข้าถึง / ยุ่งกับไฟล์) ดังนั้นวิธีสำหรับนักพัฒนาในการเข้าถึงไฟล์แม้ว่าจะเป็นเพียงผู้ใช้อ่าน / เขียนได้จึงเป็นที่ต้องการมากกว่า
Calaf

1

แบบฟอร์มเริ่มต้นสคริปต์ Dave Thomas ฉันสามารถเขียนวิธีแก้ปัญหาของตัวเองเพื่อเอาชนะ 2 ปัญหา:

  1. ข้อมูลสำรองของฉันมีเฉพาะไฟล์รายการ
  2. ไฟล์ไบนารีมาพร้อมกับ Dave Thomas โดยที่อ่านไม่ได้

นี่คือสคริปต์ของฉันที่คัดลอกข้อมูลแอปไปยัง sdcard แล้วดึงออก

#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นี่คือหนึ่งซับสำหรับ Mac OS X เพื่อดึงไฟล์ทั้งหมดสำหรับแอพyour.app.idจากอุปกรณ์ของคุณและบันทึกลงใน (ในกรณีนี้) ~/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จะดึงจากโปรแกรมจำลอง
  • ไม่เหยียบตัวแปรเซสชันของคุณ
  • คุณสามารถวางบล็อกทั้งหมดลงใน Terminal.app (หรือลบบรรทัดใหม่ได้หากต้องการ)

0

ได้รับการสนับสนุนข้อมูลเกมกับ apk ตังเม 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

นั่นหมายความว่าเราสามารถ chmod ไดเร็กทอรีจาก world: - x to world: rx นานพอที่จะดึงไฟล์ได้หรือไม่?

ใช่แน่นอน น่าแปลกที่คุณต้องใช้ไฟล์เพื่อxตั้งค่าบิต (อย่างน้อยบน Android 2.3)

chmod 755 วิธีการคัดลอกไฟล์ทั้งหมดลงไป (แต่คุณควรยกเลิกการอนุญาตในภายหลังหากคุณวางแผนที่จะใช้อุปกรณ์ต่อไป)


0

คุณทำได้:

adb ดึง / ที่เก็บข้อมูล / จำลอง / 0 / Android / data //


2
อย่าเข้าใจฉันผิด แต่คุณอ่านคำถามถูกต้องหรือยัง? OP ขอให้ดึงข้อมูล 'ส่วนตัว' ไม่ใช่ 'สาธารณะ'
baburao
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.