Run-as kullanarak Dahili Depolamadan veritabanını veya başka herhangi bir dosyayı alın


113

Köklü olmayan bir android cihazda, run-aspaket adımla komutu kullanarak veritabanını içeren veri klasörüne gidebilirim . Sadece görüntülemekten memnun olduğum çoğu dosya türü, ancak veritabanıyla android cihazdan çekmek istiyorum.

Adb kabuğunun bu kısmından bir download copyveya movekomut var mı ? Veritabanı dosyasını indirmek ve içeriğini bir veritabanı tarayıcısı kullanarak görüntülemek istiyorum.

Buradaki bir cevap, tüm uygulama paketini sıkıştırılmış bir arşive dönüştürmeyi içerir, ancak bu işlem yapıldıktan ve makineye taşındıktan sonra bu arşivin nasıl çıkarılacağına dair başka bir cevap yoktur, bu da başlamak için daha doğrudan bir çözüm olabileceği zaman beni çok şaşırttı.



stackoverflow.com/questions/13006315 Veri tabanını köklendirme cihazı olmadan çekin
Naveen Prince P

Yanıtlar:


230

userAndroid'in tasarım yapısı gereği ( önyükleyicinin kilidini açana ve telefonu userdebugveya engyazılımla yanıp sönene kadar telefonunuzda sahip olduğunuz şey budur ) Dahili Depolamaya erişimi kısıtlar - her uygulama yalnızca kendi dosyalarına erişebilir. Neyse istekli değil yazılım geliştiriciler için kök telefonlarını Google erişmek için bir yol sağlar Dahili Depolama ait debuggable kullanarak paketlerin sürümleri run-askomutunu.

/data/data/debuggable.app.package.name/databases/fileBir Android 5.1+ cihazdan indirmek için aşağıdaki komutu çalıştırın:

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

Bir klasördeki birden çok dosyayı /data/data/debuggable.app.package.name/aynı anda indirmek için - şunu kullanın 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

8
Veya, run-asdosyayı harici depolama alanındaki bir noktaya kopyalamak için kullanın ve dosya izinleriyle uğraşmak yerine veritabanı dosyasını oradan çekin.
CommonsWare

5
Sd karta yazma için hiçbir iznine sahip olarak çalışma - :( ... yeni son güncelleme ile eklenen bir şey var
slott

4
Adb kabuğunu çalıştırdığımda "paket olarak çalıştır.adı chmod 666 /data/data/package.name/databases/file" adb beni bitiriyor -> farklı çalıştır: chmod666 için exec başarısız oldu Hata: İzin reddedildi. Kök olmadan Nexus
7'deyim

2
Harici SD karta yazma erişimi artık adb ile mümkün değil.
slott

3
Boş veya neredeyse boş bir dosya geri aldığınızı fark ederseniz, dosyanın yalnızca oluşturduğunuz bu dosyaya yeniden yönlendirilmiş konsoldan bir hata olduğunu görebilirsiniz. Burada sık karşılaşılan bir sorun, uygulamanızın Sürüm varyantından bir DB kopyalamaya çalışmanızdır. DB'leri yalnızca uygulamanızın Hata Ayıklama varyantından kopyalayabilirsiniz . Böyle bir durumda, hata ayıklama varyantını yükleyin ve komutu tekrar deneyin. Umarım bu birine yardımcı olur.
Aonghus Shortt

73

Kabul edilen cevap artık benim için çalışmıyor (Android tarafından engellendi mi?)

Bunun yerine şunu yaptım:

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

3
Bu yeni doğru cevap olmalıdır VEYA @Alex P. daha yeni Android sürümleri için bu yanıtı eklemelisiniz. Ayrıca benim durumumda, db dosyasına erişmeden önce 777 kullanmam ve bunu veritabanı dizinine uygulamam gerekiyordu.
muetzenflo

1
Cihazım köklü, ancak komutun çalışması suiçin hala çalıştırmam gerektiğini fark ettim run-as.
ThomasW

Ya SD kartınız yoksa?
Gyum Fox

1
SD kartınız yoksa, yine de bir "sdcard" dizini vardır.
treesAreEverywhere

1
Harika!. benim için de çalıştı. Bir toplu iş / kabuk dosyası yapabilir miyiz? db dosya adını param olarak geçiyoruz ve db dosyamız var.
Qadir Hussain

22

Veritabanını hata ayıklama uygulamasından çekmek isteyen biri aşağıdaki prosedürü kullanabilir:

  1. cihaz dosyası gezginini ara ve aç

cihaz dosyası gezginini ara ve aç

  1. El cihazınızı seçin ve ardından data/data dizine

veri / veri dizinine git

  1. Şimdi uygulama paketinizi bulun ve veritabanları klasörüne gidin. Veritabanlarını orada görebilirsiniz ve sağ tıkladığınızda, bunu sürücünüze kaydetme seçeneğiniz olacaktır.

görüntü açıklamasını buraya girin


1
Vay canına, adb-shell kullanmaya kıyasla çok daha kolay ve daha güvenli
user1708860

9

Veritabanları için basit bir kabuk betiği yayınladım:

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

Burada açıklanan iki farklı yöntemi gerçekleştirir:

  1. İlk olarak, dosyayı diğer kullanıcılar için erişilebilir hale getirmeye çalışır ve onu cihazdan çekmeye çalışır.
  2. Bu başarısız olursa, dosyanın içeriğini terminal üzerinden yerel makineye aktarır. \rBazı cihazların kabuğa çıkardığı karakterleri kaldırmak için ek bir hile gerçekleştirir .

Buradan , veri tabanının içeriğine göz atmak için sqlite3veya gibi çeşitli CLI veya GUI SQLite uygulamalarını sqlitebrowserkullanabilirsiniz.


Bu komut dosyası hata ayıklanabilir uygulamalar içindir, uygulama hata ayıklanabilir değilse nasıl olur?
blueware

Söz konusu uygulama bu verileri bir yedeklemenin parçası olarak ifşa ederse, tek seçeneğiniz yedekleme araçlarını kullanma olasılığındadır. Bunun ötesinde, korkarım yükseltilmiş izinler gerektirecektir.
Paul Lammertsma

7

Benim için çalışacak başka bir şey bulamadım ama bu:

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

İlk çıkış koşudan çıkmak, ikinci çıkış çekmeyi yapmak için adb kabuğundan çıkmaktır.


3

Uygulamanın hata ayıklama sürümü için, adb exec-out run-as xxx.yyy.zzz cat somefile > somefiletek bir dosyayı çıkarmak için komutu kullanmak çok uygundur . Ancak birden çok dosya için birden çok kez yapmanız gerekir. İşte dizini çıkarmak için kullandığım basit bir betik.

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

Umarım yardımcı olur. Bu komut dosyası, ana sayfada da mevcuttur .

Tipik kullanım

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

daha sonra uygulama veritabanları dizininizdeki tüm dosyaları, yani /data/data/com.example.myapplication/databasesgeçerli dizine çıkaracaktır .


1
birden fazla dosya için bile bu hala tek bir komuttur. Güncelleştirme kontrol stackoverflow.com/a/18472135/1778421 sen de dosyaları açmak için ana bilgisayar tarafında bir pipo ekleyebilir tercih ediyorsanız
Alex P.

2

Dosyayı yerel bilgisayarınıza indirmek için çok daha basit bir yaklaşım:

Bilgisayarınızın kabuğunda çalıştırın:

adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>

Oldukça yakın ama bu benim için hatalı biçimlendirilmiş bir veri tabanı çıkarıyor.
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

Realm veritabanını almak için bu komut dosyasını kullanabilirsiniz.


0

Birisi almak için kullanılabilecek başka bir yanıt arıyorsa Databaseyanı sıra Shared Preferencesdaha sonra bu adımı izleyin:

Uygulamanızın build.gradledosyasında satır ekleyin

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

Artık uygulamanızı non-releasemodda çalıştırdığınızda, uygulamanız cihazınızdan otomatik olarak 8080 bağlantı noktasını açacak IP addressve cihazınızın üzerinden bağlandığından wifive laptopaynı ağı paylaştığından emin olun . Şimdi sadece url'yi ziyaret edin

http: // your_mobile_device_ip: 8080 /

tüm veritabanı verilerini paylaşılan tercihlerle birlikte izlemek.


0

İşte Android 5.1 çalıştıran bir cihazda çalışan bir çözüm. Aşağıdaki örnek Windows içindir.

Sed (veya windows üzerinde sed.exe'ye ihtiyacınız var , örneğin cygwin'den.) (Unix'te sadece orada olacak;)). En azından Windows'ta kötü '\ r' karakterlerini kaldırmak için.

Şimdi sadece aşağıdaki komutu çalıştırın:

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

Sed komutu sondaki / r karakterlerini çıkarır.

Elbette "com.yourcompany.yourapp" ifadesini uygulamanın paket adıyla ve "YourDatabaseName" öğesini uygulamadaki veritabanının adıyla değiştirmelisiniz.


0

Veritabanı dosyası kullanılırken emtpy olur adb run-as. Bu, RoomDatabase örneğinde close () çağırarak çözülebilir. SQLite'ın günlüğünü diske yazmasına izin vermek için close () işlevini çağırın. İstek üzerine veritabanı bağlantısını kapatan bu düğmeyi oluşturdum:

GIPHY aracılığıyla

RoomDatabase örneğinde close nasıl çağrılacağı aşağıda açıklanmıştır.

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.