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.