장치에서 sqlite 데이터베이스 디버깅


98

현재 Android 용 WiFi 애플리케이션을 개발 중입니다. 장치의 데이터베이스에 액세스하는 데 문제가 있습니다. 에뮬레이터에서 Wi-Fi를 지원하지 않기 때문에 에뮬레이터에서 디버깅이 작동하지 않습니다. 나는 사용하여 장치에서 데이터베이스 파일을 꺼내려고했습니다.

adb pull data/data/package-name/databases/database-name

하지만 "Permission denied."라는 오류가 발생합니다. 이 답변에서 Android : 데이터베이스 파일은 어디에 저장됩니까? , Commonsware는 디버그 모드에서 실행하여 데이터베이스 파일을 가져올 것을 제안했습니다. 그러나 그것은 너무 작동하지 않습니다. 장치를 루팅하지 않고 데이터베이스를 디버깅하는 방법에 대한 도움을 주시면 감사하겠습니다.

답변:


142

다른 답변 에서 반복하겠습니다 .

API 레벨 8 (Android 2.2)부터 애플리케이션을 디버그 가능으로 빌드하는 경우 셸 run-as명령을 사용하여 특정 사용자 / 애플리케이션으로 명령 또는 실행 파일을 실행하거나 애플리케이션으로 전환하여 UID데이터에 액세스 할 수 있습니다. 예배 규칙서.

따라서 장치에서 응용 프로그램 데이터베이스를 가져 오려면 응용 프로그램의 디버그 빌드를 adb shell실행하고 다음 명령과 연결하여 실행해야합니다.

run-as com.yourpackage sh -c "cat ~/databases/db-file" > /sdcard/db-file.sqlite

이렇게하면 db-fileSD 카드 / 외부 저장소의 루트에 복사됩니다 . 이제 파일 관리자 adb pull또는 원하는 다른 것을 사용하여 쉽게 가져올 수 있습니다 . 이 접근 방식을 WRITE_EXTERNAL_STORAGE사용하면 항상 외부 저장소에 쓸 수있는 셸 사용자가 복사를 수행하므로 앱에 권한 이 필요하지 않습니다 .

Linux / Mac 시스템에서는 adb 셸을 입력하지 않고도 사용할 수있는 다음 명령을 사용하여 데이터베이스를 컴퓨터에 직접 복사 할 수 있습니다.

adb shell 'run-as com.yourpackage sh -c "cat ~/databases/db-file"' > db-file.sqlite

그러나 이것은 CR / LF 기호 변환으로 인해 Windows에서 올바르게 작동하지 않습니다. 거기에서 이전 방법을 사용하십시오.


1
@MikeIsrael 만약을 대비해서 앱에서 SQLCipher를 사용하지 않습니까? 그렇지 않은 경우 데이터베이스가 올바르게 다운로드되었는지 대략적으로 확인하려면 뷰어 (바람직하게는 hex-viewer)에서 DB 파일을 열고 SQLite format 3문자열로 시작하는지 확인합니다 . 또한 올바른 sqlite버전 인지 확인하십시오 (즉, sqlite2 실행 파일로 sqlite3 데이터베이스를 열려고하지 않음). 또한 다른 SQLite 클라이언트 (예 : SQLiteStudio ) 를 사용해 볼 수도 있습니다 . 도움이되기를 바랍니다.
Idolon

1
한 라이너에 문제가 있습니다. 쉘에서 명령을 실행하면 잘 작동하지만 한 라이너를 넣으면 다음과 같은 결과가 나타납니다. 시스템이 지정된 경로를 찾을 수 없습니다.
Rev Tyler

2
패키지 <내 패키지>는 알 수 없습니다 ... 누구나 이유를 압니다. 디버그 버튼을 눌러 스튜디오를 통해 설치했습니다.
Nathan Schwermann 2014 년

4
Android Lollipop에서 내가 받고 있습니다permission denied
Muhammad Babar

1
두 개의 테이블과 각각에 12 개 정도의 행이있는 데이터베이스를 가져 와서 각 테이블에 대해 전체 선택 쿼리를 수행했습니다. 하나는 잘 작동하고 다른 하나는 파일의 데이터 오류를보고했습니다. 지금 내 가장 좋은 추측은 Android와 로컬 셸 간의 인코딩 불일치입니다.
Mason

23

내 MAC에서이 셸 스크립트를 사용하여 데이터베이스를 내 홈 폴더로 직접 복사합니다. 간편한 원 클릭 솔루션으로 패키지 이름 (com.example.app)과 데이터베이스 이름 (database.sqlite) 만 변경하면됩니다.

간단한 스크립트

#!/bin/bash
adb -d shell 'run-as com.example.app cat /data/data/com.example.app/databases/database.sqlite > /sdcard/database.sqlite'
adb pull /sdcard/database.sqlite ~/

인수 [package_name] [database]를 받아들이는 스크립트

#!/bin/bash

REQUIRED_ARGS=2
ADB_PATH=/Users/Tadas/Library/sdk/platform-tools/adb
PULL_DIR="~/"

if [ $# -ne $REQUIRED_ARGS ]
    then
        echo ""
        echo "Usage:"
        echo "android_db_move.sh [package_name] [db_name]"
        echo "eg. android_db_move.sh lt.appcamp.impuls impuls.db"
        echo ""
    exit 1
fi;


echo""

cmd1="$ADB_PATH -d shell 'run-as $1 cat /data/data/$1/databases/$2 > /sdcard/$2' "
cmd2="$ADB_PATH pull /sdcard/$2 $PULL_DIR"

echo $cmd1
eval $cmd1
if [ $? -eq 0 ]
    then
    echo ".........OK"
fi;

echo $cmd2
eval $cmd2

if [ $? -eq 0 ]
    then
    echo ".........OK"
fi;

exit 0

첫 번째 명령은 데이터베이스의 0 바이트 복사본을 만드는 것이었기 때문에 스크립트를 약간 조정했습니다. gist.github.com/romulof/6af8a8919660f395f975
romulof

14

Android 앱 데이터베이스를보고 관리하는 가장 좋은 방법은이 라이브러리 https://github.com/sanathp/DatabaseManager_For_Android 를 사용하는 것입니다.

이 라이브러리를 사용하면 앱 자체에서 앱 SQLite 데이터베이스를 관리 할 수 ​​있습니다. 앱 데이터베이스의 테이블을보고, 업데이트하고, 삭제하고, 테이블에 행을 삽입 할 수 있습니다.

그것의 단일 자바 활동 파일, 그냥 소스 폴더에 자바 파일을 추가합니다. 개발이 완료되면 src 폴더에서 자바 파일을 제거하십시오.

그것은 저를 많이 도왔습니다. 그것은 당신도 도움이되기를 바랍니다.

여기에서 1 분 데모를 볼 수 있습니다. http://youtu.be/P5vpaGoBlBY


11

비록 오래된 질문이지만 여전히 관련성이 있으며 현재 상태에 대한 답변이 필요하다고 생각합니다. 사용 가능한 도구가있어 데이터베이스를 직접 검사 할 수 있습니다 (장치 또는 에뮬레이터에서 가져올 필요없이).

내가 가장 최근에 발견 한 (그리고 가장 선호하는) 도구는 Android Debug Database 입니다.

다음 종속성 만 추가하면됩니다.

debugImplementation 'com.amitshekhar.android:debug-db:1.0.3'

추가 코드가 필요하지 않습니다. 앱을 시작한 후 logcat을 열고 "DebugDB"를 필터링하면 다음과 같은 메시지가 표시됩니다.

D/DebugDB: Open http://192.168.178.XXX:8080 in your browser

모든 브라우저에서 작동하며 데이터베이스 테이블과 공유 환경 설정을 검사 할 수 있습니다.

여기에 이미지 설명 입력

기본 및 Genymotion 에뮬레이터에서도 작동합니다.


이전에 사용한 도구는 stetho 입니다.

단점 : 약간의 코드를 추가해야하며 Chrome 브라우저에 연결되어 있습니다.

장점 : 네트워크 트래픽을 검사 할 수도 있습니다.



5

당신이 얻는다면

The system cannot find the path specified.

시험

adb -d shell "run-as com.yourpackage cat /data/data/com.yourpackage/databases/dbname.sqlite > /sdcard/dbname.sqlite"

큰 따옴표에 유의하십시오!


3

나는 단순히했다 :

$ adb shell
shell@android:/ $ run-as myapp.package.name sh
shell@android:/data/data/myapp.package.name $

그런 다음 sqlite 데이터베이스 또는 올바른 권한으로 쉘에서 원하는 모든 것을 디버깅 할 수 있습니다.


2

(루트가 아닌) adb 셸에서 run-as라는 프로그램을 사용하여 애플리케이션의 개인 파일을 복사 할 수있는 APK를 디버깅 할 수있는 방법이 있습니다.


2

여기에 단계별 지침이 있습니다. 대부분 다른 답변의 조합에서 가져온 것입니다. 잠금 해제되지 않은 장치에서 작동합니다.

  1. 장치를 연결하고 디버그 모드에서 응용 프로그램을 시작합니다.

  2. 응용 프로그램 폴더의 데이터베이스 파일을 SD 카드로 복사합니다.

    ./adb -d shell 'run-as com.yourpackge.name cat /data/data/com.yourpackge.name/databases/filename.sqlite> /sdcard/filename.sqlite'

  3. 컴퓨터로 데이터베이스 파일을 가져옵니다. 다음을 실행합니다.

    ./adb pull / sdcard / 실행 : ./adb

  4. Firefox SQLLite Manager 설치 : https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/

  5. Firefox SQLLite Manager를 열고 위의 3 단계에서 데이터베이스 파일을 엽니 다.

  6. 즐겨!


2

Android Studio 4.1 Android SQLite 데이터베이스보기 / 편집을위한 새로운 기능이 추가되었습니다.

여기에 이미지 설명 입력

Database Inspector를 여는 방법

Android Studio에서 Database Inspector를 열려면 View > Tool Windows > Database Inspector메뉴 모음에서 선택해야 합니다.

또한 API 레벨 26 이상을 실행하는 기기에서 앱을 실행해야합니다.

이 도구를 사용하여 다음을 수행 할 수 있습니다.

  • 데이터베이스 쿼리

  • 데이터베이스 수정 및 디버그

여기에 이미지 설명 입력


2

새로운 Android Studio 4.1 에는 새로운 Database Inspector가 있습니다.

https://developer.android.com/studio/preview/features/images/database-inspector.gif

메뉴 표시 줄에서 다음 옵션을 선택하여 View > Tool Windows > Database Inspector열 수 있습니다. 더 자세한 지침은 이 블로그 에서 찾을 수 있습니다 .

또 다른 방법은이를 위해 stetho 를 사용하는 입니다. 종속성을 추가 한 다음 Chrome DevTools (chrome : // inspect)를 사용하여 기기가 연결되었을 때 데이터베이스를 확인할 수 있습니다.


1

adb를 루트로 실행하거나 루팅 된 전화에서 사용해야합니다.

adb를 루트로 실행하려면 다음을 사용하십시오. adb root

참고 항목 : adb를 사용할 때 데이터 폴더에 대한 액세스가 거부되는 이유는 무엇입니까?


나는 이것을 시도했다. 하지만 그것은 나에게 "adb는 프로덕션 빌드에서 루트로 실행할 수 없습니다"를 제공합니다
Primal Pappachan 2011-08-03

디버그 모드에서 실행해야합니다.
Malfist

이것을보십시오 : mydroidworld.com/forums/android-hacks/… 에뮬레이터가 아닌 휴대폰에서 실행한다면, 루팅 해야합니다.
Malfist

디버그 모드에서 응용 프로그램을 실행하고 위의 단계도 시도했습니다. 작동하지 않습니다.
Primal Pappachan 2011-08-03

이것은 에뮬레이터 또는 루팅 된 기기에서만 작동합니다.
slott

1

run-as-and-cat-to-sdcard 솔루션은 Android 4.4.2에서 나를 위해 일 하지 않았습니다 . 확실하지 않지만 run-as도구가 새 권한 sdcard_rsdcard_rw권한을 올바르게 처리하지 못 하기 때문일 수 있습니다 .

먼저 /files애플리케이션의 개인 내부 저장소에 데이터베이스 파일을 복사해야했습니다 .

shell@hammerhead:/ $ run-as com.example.myapp   
shell@hammerhead:/data/data/com.example.myapp $ cp databases/mydb files/mydb

그런 다음 /sdcard/Android/data/com.example.myapp/filesJavaland에서 복사했습니다 ( WRITE_EXTERNAL_STORAGE허가 필요 ).

public class MainActivity extends BaseActivity {

    @Override
     protected void onCreate(Bundle savedInstanceState) {
         ...

         if (isExternalStorageWritable()) {
             final FileInputStream input;
             try {
                 input = openFileInput("mydb");

                 File output = new File(getExternalFilesDir(null), "mydb");

                 copy(input, output);
             } catch (FileNotFoundException e) {
                 e.printStackTrace();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     }

     public void copy(FileInputStream in, File dst) throws IOException {
         OutputStream out = new FileOutputStream(dst);

         // Transfer bytes from in to out
         byte[] buf = new byte[1024];
         int len;
         while ((len = in.read(buf)) > 0) {
             out.write(buf, 0, len);
         }
         in.close();
         out.close();
     }

     public boolean isExternalStorageWritable() {
         String state = Environment.getExternalStorageState();
         return Environment.MEDIA_MOUNTED.equals(state);
     }
 }

마지막으로 파일을 랩톱에 복사했습니다.

$ adb pull /sdcard/Android/data/com.example.myapp/files/mydb

1
더 간단한 해결책이 있습니다. sqlite 파일을 chmod 777 한 다음 run-as를 종료하면 일반 사용으로 / sdcard에 복사 할 수 있습니다.
zedix

1

내 장치에 sdcard가 없습니다.

그래서 첫 번째 해결책은 저에게 효과가 없었습니다.

비슷한 문제가있는 경우 다음과 같이 시도하십시오.

  adb shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
  adb pull /data/data/package/databases/yourdb.sqlite

/sdcard반드시 SD 카드는 아닙니다. 내 휴대 전화에서는 물리적 SD 카드가 없을 때 내부 저장소를 가리 킵니다.
DearVolt

0

이 앱을 사용해보십시오 : SQLiteWeb ( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb ). 데이터베이스를 꺼내지 않고 원격 액세스를 제공합니다.

유료 버전에서는 개인 데이터베이스 (/ data / data / package-name ...)에 대한 루트 액세스 권한이 있거나 SQLiteWeb (앱 내부 지침)을 사용하여 연결하는 콘텐츠 공급자를 구현합니다.

그러나 무료 버전을 유지하려면 외부 저장소에 데이터베이스를 만들 수 있습니다.

database = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()
        + "/" + DATABASE_NAME, null, DATABASE_VERSION);

0

OSX에서 automator 및 sqllitebrowser ( https://github.com/sqlitebrowser/sqlitebrowser ) 와 함께 @Tadas 응답 사용 :

  1. Automator를 열고 새 워크 플로를 만듭니다.

  2. "셸 스크립트 실행"작업을 추가합니다.

  3. 붙여 넣기 :

    source ~ / .bash_profile adb shell 'run-as cat /data/data/your_app_uid/databases/db.name> /tmp/db.name'adb pull /tmp/db.name ~ / open -a sqlitebrowser ~ / db. 이름

  4. 실행을 클릭하여 sqlitebrowser에서 데이터베이스를 새로 고칩니다.


0
  1. 터미널 열기
  2. cd <ANDROID_SDK_PATH>(Windows의 경우 cd C:\Users\Willi\AppData\Local\Android\sdk)
  3. cd platform-tools
  4. adb shell (하나의 에뮬레이터 만 실행중인 경우에만 작동 함)
  5. cd data/data
  6. su (슈퍼 유저 권한 획득)
  7. cd <PACKAGE_NAME>/databases
  8. sqlite3 <DB_NAME>
  9. SQL 문을 발행하십시오 ( 중요 :로 종료 ;하십시오. 그렇지 않으면 명령문이 발행되지 않고 대신 새 행으로 분리됩니다.)

참고 : 디렉토리 내용을 나열해야하는 경우 ls(Linux) 또는 dir(Windows)를 사용하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.