Pobierz bazę danych lub dowolny inny plik z pamięci wewnętrznej przy użyciu funkcji run-as


113

Na niezrootowanym urządzeniu z Androidem mogę przejść do folderu danych zawierającego bazę danych za pomocą run-aspolecenia z nazwą mojego pakietu. Większość typów plików zadowala mnie po prostu przeglądaniem, ale z bazą danych chciałbym pobrać ją z urządzenia z systemem Android.

Czy istnieje polecenie download copylub movez tej części powłoki adb? Chciałbym pobrać plik bazy danych i obejrzeć jej zawartość w przeglądarce bazy danych.

Jedna odpowiedź polega na przekształceniu całego pakietu aplikacji w skompresowane archiwum, ale nie ma dalszej odpowiedzi na temat tego, jak wyodrębnić to archiwum po wykonaniu tej czynności i przeniesieniu go na maszynę, pozostawiając mnie bardzo bocznym, gdy może być bardziej bezpośrednie rozwiązanie na początek



stackoverflow.com/questions/13006315 Ściągnij bazę danych bez urządzenia do
— rootowania

Odpowiedzi:


230

Konstrukcja usersystemu Android (czyli to, co masz w telefonie, dopóki nie odblokujesz bootloadera i nie sflashujesz telefonu za pomocą oprogramowania userdebuglub engoprogramowania) ogranicza dostęp do pamięci wewnętrznej - każda aplikacja ma dostęp tylko do własnych plików. Na szczęście dla programistów nie chcąc wykorzenić swoje telefony Google dostarcza sposób dostępu do pamięci wewnętrznej z debuggable wersje swoich pakietów wykorzystujących run-aspolecenia.

Aby pobrać /data/data/debuggable.app.package.name/databases/filez urządzenia z systemem Android 5.1+, uruchom następujące polecenie:

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

Aby pobrać wiele plików w jednym folderze /data/data/debuggable.app.package.name/na raz - użyj 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
Lub po prostu run-asskopiuj plik do miejsca w pamięci zewnętrznej i pobierz plik bazy danych z tego miejsca, zamiast mieszać z uprawnieniami do plików.
— CommonsWare,

5
Run-as nie ma uprawnień do zapisu na sdcard - w najnowszej aktualizacji dodano coś nowego ... :(
— slott

4
Kiedy uruchamiam powłokę adb „run-as nazwa_pakietu chmod 666 /data/data/package.name/databases/file” adb kończy błąd -> run-as: exec nie powiodło się dla chmod666 Błąd: Odmowa uprawnień. Jestem w Nexusie 7 bez
— rootowania

2
Dostęp do zapisu na zewnętrznej karcie SD nie jest już możliwy dzięki adb.
— slott

3
Jeśli okaże się, że otrzymujesz pusty lub prawie pusty plik, może się okazać, że plik jest po prostu błędem z konsoli, która została przekierowana do tego pliku, który utworzyłeś. Częstym problemem jest to, że próbujesz skopiować bazę danych z wariantu wydania aplikacji. Możesz kopiować tylko bazy danych z wariantu debugowania aplikacji . Jeśli tak się stanie, po prostu zainstaluj wariant debugowania i spróbuj ponownie wykonać polecenie. Mam nadzieję, że to komuś pomoże.
— Aonghus Shortt

73

Zaakceptowana odpowiedź już dla mnie nie działa (zablokowana przez Androida?)

Więc zamiast tego zrobiłem to:

> 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
Powinna to być nowa poprawna odpowiedź LUB @Alex P. należy dodać tę odpowiedź dla nowszych wersji Androida. Również w moim przypadku musiałem użyć 777 i zastosować go najpierw do katalogu bazy danych / również, zanim mogłem uzyskać dostęp do pliku db.
— muetzenflo

1
Moje urządzenie jest zrootowane, ale okazało się, że nadal muszę uruchomić, suaby run-aspolecenie działało.
— ThomasW,

A jeśli nie masz karty SD?
— Gyum Fox

1
jeśli nie masz karty SD, i tak istnieje katalog „sdcard”.
— treesAreEverywhere

1
Wspaniały!. na mnie też zadziałało. Czy możemy utworzyć plik wsadowy / powłoki? po prostu przekazując nazwę pliku db jako parametr i mamy plik db.
— Qadir Hussain

22

Jeśli ktoś szuka ściągnięcia bazy danych z aplikacji debugującej może skorzystać z poniższej procedury:

  1. wyszukaj i otwórz eksplorator plików urządzenia

wyszukaj i otwórz eksplorator plików urządzenia

  1. Wybierz swój telefon, a następnie przejdź do data/datakatalogu

przejdź do katalogu data / data

  1. Teraz znajdź pakiet aplikacji i przejdź do folderu baz danych. Możesz tam zobaczyć bazy danych, a po kliknięciu prawym przyciskiem myszy pojawi się opcja zapisania tego na dysku.

wprowadź opis obrazu tutaj


1
Wow, o wiele łatwiejsze i bezpieczniejsze w porównaniu do korzystania z adb-shell
— user1708860

9

Opublikowałem prosty skrypt powłoki do zrzucania baz danych:

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

Wykonuje dwie różne metody opisane tutaj:

  1. Najpierw próbuje udostępnić plik innym użytkownikom i próbuje pobrać go z urządzenia.
  2. Jeśli to się nie powiedzie, przesyła zawartość pliku przez terminal do lokalnego komputera. Wykonuje dodatkową sztuczkę, aby usunąć \rznaki wysyłane przez niektóre urządzenia do powłoki.

Z tego miejsca możesz używać różnych aplikacji CLI lub GUI SQLite, takich jak sqlite3lub sqlitebrowser, do przeglądania zawartości bazy danych.


Ten skrypt jest przeznaczony dla aplikacji, które można debugować, a co z tym, że aplikacji nie można debugować?
— blueware

Jedynymi opcjami są prawdopodobnie użycie narzędzi do tworzenia kopii zapasowych, jeśli dana aplikacja ujawnia te dane jako część kopii zapasowej. Poza tym obawiam się, że wymagałoby to wyższych uprawnień.
— Paul Lammertsma

7

Nie mogłem znaleźć niczego innego do pracy, ale to:

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

Pierwsze wyjście to wyjście z run-as, drugie wyjście to wyjście z powłoki adb, aby wykonać pociągnięcie.


3

W przypadku wersji do debugowania aplikacji bardzo wygodne jest użycie polecenia adb exec-out run-as xxx.yyy.zzz cat somefile > somefiledo wyodrębnienia pojedynczego pliku. Ale musisz to zrobić wiele razy dla wielu plików. Oto prosty skrypt, którego używam do wyodrębnienia katalogu.

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

Mam nadzieję, że to byłoby pomocne. Ten skrypt jest również dostępny pod adresem gist .

Typowe użycie to

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

następnie wyodrębni wszystkie pliki z katalogu baz danych aplikacji, czyli /data/data/com.example.myapplication/databasesdo bieżącego katalogu.


1
nawet dla wielu plików jest to nadal tylko jedno polecenie. sprawdź aktualizację stackoverflow.com/a/18472135/1778421, jeśli wolisz, możesz również dodać kolejną potokę po stronie hosta, aby rozpakować pliki
— Alex P.

2

O wiele prostsze podejście do pobrania pliku na komputer lokalny:

W powłoce komputera uruchom:

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

Całkiem blisko, ale to wyciąga dla mnie zniekształconą bazę danych.
— 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

Możesz użyć tego skryptu do pobrania bazy danych Realm.


0

Jeśli ktoś szuka innej odpowiedzi, której można użyć do pobrania, Databasea także Shared Preferenceswykonaj następujące czynności:

W build.gradlepliku swojej aplikacji dodaj wiersz

debugCompile „com.amitshekhar.android:debug-db:1.0.0”

teraz, gdy uruchomisz aplikację w non-releasetrybie, aplikacja automatycznie otworzy port 8080 z twojego urządzenia, IP addressupewnij się, że twoje urządzenie jest połączone przez wifii że laptopwspółdzielisz tę samą sieć. Teraz po prostu odwiedź adres URL

http: // your_mobile_device_ip: 8080 /

aby obserwować wszystkie dane bazy danych wraz ze wspólnymi preferencjami.


0

Oto rozwiązanie, które działa na urządzeniu z systemem Android 5.1. Poniższy przykład dotyczy systemu Windows.

Potrzebujesz seda (lub sed.exe na Windowsie, np. Z cygwin.) (Na Uniksie, po prostu tam będzie;)). Aby usunąć złe znaki „\ r”, przynajmniej w systemie Windows.

Teraz po prostu uruchom następujące polecenie:

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

Polecenie sed usuwa końcowe znaki / r.

Oczywiście należy zastąpić „com.yourcompany.yourapp” nazwą pakietu aplikacji, a „YourDatabaseName” nazwą bazy danych w aplikacji.


0

Plik bazy danych jest pusty podczas używaniaadb run-as . Można to rozwiązać, wywołując metodę close () w instancji RoomDatabase. Wywołaj close (), aby SQLite zapisał swój dziennik na dysku. Utworzyłem ten przycisk, który na żądanie zamyka połączenie z bazą danych:

przez GIPHY

Oto jak wywołać close w instancji RoomDatabase.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.