Ambil database atau file lainnya dari Penyimpanan Internal menggunakan run-as

113

Pada perangkat android yang tidak di-rooting, saya dapat menavigasi ke folder data yang berisi database menggunakan run-asperintah dengan nama paket saya. Sebagian besar jenis file saya puas dengan hanya melihat, tetapi dengan database saya ingin menarik jika dari perangkat android.

Apakah ada perintah download copyor movedari bagian adb shell ini? Saya ingin mendownload file database dan melihat isinya menggunakan browser database.

Satu jawaban di sini melibatkan mengubah seluruh paket aplikasi menjadi arsip terkompresi, tetapi tidak ada jawaban lebih lanjut tentang cara mengekstrak arsip itu setelah ini selesai dan dipindahkan ke mesin, membuat saya sangat teralihkan ketika mungkin ada solusi yang lebih langsung untuk memulai.

CQM
sumber
stackoverflow.com/questions/13006315 Tarik database tanpa perangkat rooting
Naveen Prince P

Jawaban:

230

Dengan desain userbuild Android (itulah yang Anda miliki di ponsel Anda sampai Anda membuka kunci bootloader dan mem -flash ponsel dengan userdebugatau engperangkat lunak) membatasi akses ke Penyimpanan Internal - setiap aplikasi hanya dapat mengakses file-nya sendiri. Untungnya bagi pengembang perangkat lunak yang tidak mau melakukan root pada ponsel mereka, Google menyediakan cara untuk mengakses Penyimpanan Internal versi yang dapat di - debug dari paket mereka menggunakan run-asperintah.

Untuk mengunduh /data/data/debuggable.app.package.name/databases/filedari perangkat Android 5.1+, jalankan perintah berikut:

adb exec-out run-as debuggable.app.package.name cat databases/file > file

Untuk mengunduh banyak file dalam folder di bawah /data/data/debuggable.app.package.name/sekaligus - gunakan tar:

adb exec-out run-as debuggable.app.package.name tar c databases/ > databases.tar
adb exec-out run-as debuggable.app.package.name tar c shared_prefs/ > shared_prefs.tar
Alex P.
sumber
8
Atau, cukup gunakan run-asuntuk menyalin file ke suatu tempat di penyimpanan eksternal, dan tarik file database dari sana, daripada mengotak-atik izin file.
CommonsWare
5
Run-as tidak memiliki izin untuk menulis ke sdcard - ada sesuatu yang baru ditambahkan dengan pembaruan terbaru ... :(
slott
4
Ketika saya menjalankan adb shell "run-as package.name chmod 666 /data/data/package.name/databases/file" adb mengakhiri kesalahan saya -> run-as: exec gagal untuk chmod666 Error: Izin ditolak. Saya menggunakan Nexus 7 tanpa root
Shudy
2
Akses tulis ke kartu sd eksternal tidak lagi dimungkinkan dengan adb.
slott
3
Jika Anda menemukan bahwa Anda mendapatkan kembali file kosong atau hampir kosong, Anda mungkin menemukan bahwa file tersebut hanyalah kesalahan dari konsol yang telah dialihkan ke file yang telah Anda buat ini. Masalah yang sering terjadi di sini adalah Anda mencoba menyalin DB dari varian Rilis aplikasi Anda. Anda hanya dapat menyalin DB dari varian Debug aplikasi Anda . Jika ini terjadi, instal saja varian debug dan coba perintah lagi. Semoga ini bisa membantu seseorang.
Aonghus Shortt
73

Jawaban yang diterima tidak berfungsi lagi untuk saya (diblokir oleh Android?)

Jadi saya melakukan ini:

> adb shell
shell $ run-as com.example.package
shell $ chmod 666 databases/file
shell $ exit                                               ## exit out of 'run-as'
shell $ cp /data/data/package.name/databases/file /sdcard/
shell $ run-as com.example.package
shell $ chmod 600 databases/file
> adb pull /sdcard/file .
marmor
sumber
3
Ini harus menjadi jawaban baru yang benar ATAU @Alex P. Anda harus menambahkan jawaban ini untuk versi Android yang lebih baru. Juga dalam kasus saya, saya harus menggunakan 777 dan menerapkannya ke direktori database terlebih dahulu / juga sebelum saya dapat mengakses file db.
muetzenflo
1
Perangkat saya di-root, tetapi saya merasa masih perlu menjalankan suagar run-asperintah berfungsi.
ThomasW
Bagaimana jika Anda tidak memiliki kartu SD?
Gyum Fox
1
jika Anda tidak memiliki kartu SD, masih ada direktori "sdcard".
treesAreEverywhere
1
Bagus!. itu berhasil untuk saya juga. Bisakah kita membuat file batch / shell? hanya meneruskan nama file db sebagai param dan kami memiliki file db.
Qadir Hussain
22

Jika ada yang ingin menarik database dari aplikasi debug dapat menggunakan prosedur di bawah ini:

  1. cari dan buka file explorer perangkat

cari dan buka file explorer perangkat

  1. Pilih handset Anda dan kemudian browse ke data/datadirektori

pergi ke direktori data / data

  1. Sekarang temukan paket aplikasi Anda dan masuk ke folder database. Anda dapat melihat database di sana dan dengan klik kanan, Anda akan mendapatkan opsi untuk menyimpan ini di drive Anda.

masukkan deskripsi gambar di sini

Ifta
sumber
1
Wow, jauh lebih mudah dan lebih aman dibandingkan dengan menggunakan adb-shell
user1708860
9

Saya telah menerbitkan skrip shell sederhana untuk membuang database:

https://github.com/Pixplicity/humpty-dumpty-android

Ini melakukan dua metode berbeda yang dijelaskan di sini:

  1. Pertama, ia mencoba membuat file dapat diakses oleh pengguna lain, dan mencoba menariknya dari perangkat.
  2. Jika gagal, itu mengalirkan konten file melalui terminal ke mesin lokal. Ini melakukan trik tambahan untuk menghapus \rkarakter yang dikeluarkan beberapa perangkat ke shell.

Dari sini Anda dapat menggunakan berbagai aplikasi CLI atau GUI SQLite, seperti sqlite3atau sqlitebrowser, untuk menelusuri konten database.

Paul Lammertsma
sumber
Skrip ini untuk aplikasi yang dapat di-debug, bagaimana jika aplikasi tidak dapat di-debug?
blueware
Satu-satunya pilihan Anda kemungkinan menggunakan alat cadangan, jika aplikasi yang dipermasalahkan memperlihatkan data itu sebagai bagian dari cadangan. Selain itu, saya khawatir ini akan membutuhkan izin yang lebih tinggi.
Paul Lammertsma
7

Saya tidak bisa mendapatkan hal lain untuk bekerja untuk saya tetapi ini:

adb shell
run-as package.name
cat /databases/databaseFileName.db > /sdcard/copiedDatabaseFileName.db
exit
exit
adb pull /sdcard/copiedDatabaseFileName.db /file/location/on/computer/

Keluar pertama adalah keluar dari run-as, keluar kedua adalah keluar dari adb shell untuk melakukan penarikan.

Triplee 121
sumber
3

Untuk versi debug aplikasi, sangat mudah menggunakan perintah adb exec-out run-as xxx.yyy.zzz cat somefile > somefileuntuk mengekstrak satu file. Tetapi Anda harus melakukannya berkali-kali untuk banyak file. Berikut ini skrip sederhana yang saya gunakan untuk mengekstrak direktori.

#!/bin/bash
P=
F=
D=

function usage()
{
    echo "$(basename $0) [-f file] [-d directory] -p package"
    exit 1
}

while getopts ":p:f:d:" opt
do
    case $opt in
        p)
            P=$OPTARG
            echo package is $OPTARG
            ;;
        f)
            F=$OPTARG
            echo file is $OPTARG
            ;;
        d)
            D=$OPTARG
            echo directory is $OPTARG
            ;;
        \?)
            echo Unknown option -$OPTARG
            usage
            ;;
        \:)
            echo Required argument not found -$OPTARG
            usage
            ;;
    esac
done

[ x$P == x ] && {
    echo "package can not be empty"
    usage
    exit 1
}

[[ x$F == x  &&  x$D == x ]] && {
    echo "file or directory can not be empty"
    usage
    exit 1
}

function file_type()
{
    # use printf to avoid carriage return
    __t=$(adb shell run-as $P "sh -c \"[ -f $1 ] && printf f || printf d\"")
    echo $__t
}

function list_and_pull()
{
    t=$(file_type $1)
    if [ $t == d ]; then
        for f in $(adb shell run-as $P ls $1)
        do
            # the carriage return output from adb shell should
            # be removed
            mkdir -p $(echo -e $1 |sed $'s/\r//')
            list_and_pull $(echo -e $1/$f |sed $'s/\r//')
        done
    else
        echo pull file $1
        [ ! -e $(dirname $1) ] && mkdir -p $(dirname $1)
        $(adb exec-out run-as $P cat $1 > $1)
    fi
}

[ ! -z $D ] && list_and_pull $D
[ ! -z $F ] && list_and_pull $F

Semoga bermanfaat. Skrip ini juga tersedia di intinya .

Penggunaan tipikal adalah

$ ./exec_out.sh -p com.example.myapplication -d databases

maka itu akan mengekstrak semua file di bawah direktori database aplikasi Anda, yang /data/data/com.example.myapplication/databases, ke direktori saat ini.

alijandro.dll
sumber
1
bahkan untuk banyak file itu masih hanya satu perintah. periksa pembaruan stackoverflow.com/a/18472135/1778421 jika Anda lebih suka, Anda juga dapat menambahkan pipa lain di sisi host untuk membongkar file
Alex P.
2

Pendekatan yang jauh lebih sederhana untuk mengunduh file ke komputer lokal Anda:

Di shell PC Anda, jalankan:

adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>
Emre
sumber
Cukup dekat tetapi ini mengeluarkan db yang salah format untuk saya.
Nae
1
#!/bin/bash
#export for adb
export PATH=$PATH:/Users/userMe/Library/Android/sdk/platform-tools
export PATH=$PATH:/Users/userMe/Library/Android/sdk/tools

adb -d shell 'run-as com.android.app  cp /data/data/com.android.app/files/db.realm /sdcard'
adb pull sdcard/db.realm /Users/userMe/Desktop/db

Anda dapat menggunakan skrip ini untuk mendapatkan database Realm.

dralexnumber
sumber
0

Jika seseorang mencari jawaban lain yang bisa digunakan untuk mengambil DatabasejugaShared Preferences ikuti langkah ini:

Di build.gradlefile aplikasi Anda, tambahkan baris

debugCompile 'com.amitshekhar.android:debug-db:1.0.0'

sekarang ketika Anda menjalankan aplikasi Anda dalam non-releasemode maka aplikasi Anda akan secara otomatis membuka port 8080 dari perangkat IP addressAnda memastikan perangkat Anda terhubung melalui wifidan Anda laptopberbagi jaringan yang sama. Sekarang cukup kunjungi url

http: // your_mobile_device_ip: 8080 /

untuk melihat semua data database bersama dengan preferensi bersama.

Pradeep Kumar Kushwaha
sumber
0

Berikut adalah solusi yang berfungsi pada perangkat yang menjalankan Android 5.1. Contoh berikut untuk Windows.

Anda membutuhkan sed (atau sed.exe di windows, misalnya dari cygwin.) (Di Unix, itu hanya akan ada di sana;)). Untuk menghapus karakter '\ r' yang buruk, setidaknya di windows.

Sekarang jalankan saja perintah berikut:

adb exec-out "run-as com.yourcompany.yourapp /data/data/com.yourcompany.yourapp/databases/YourDatabaseName" | c:\cygwin\bin\sed.exe 's/\x0D\x0A/\x0A/'>YourDatabaseName.db

Perintah sed menghapus karakter trailing / r.

Tentu saja Anda harus mengganti "com.yourcompany.yourapp" dengan nama paket aplikasi dan "YourDatabaseName" dengan nama database di aplikasi.

treeAreEverywhere
sumber
0

File database kosong saat menggunakanadb run-as . Ini bisa diselesaikan dengan memanggil close () pada instance RoomDatabase. Panggil close () agar SQLite menulis jurnalnya ke disk. Saya telah membuat tombol ini yang menutup koneksi database berdasarkan permintaan:

melalui GIPHY

Berikut adalah cara memanggil tutup pada instance RoomDatabase.

Eimert
sumber