program story

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

inputbox 2020. 8. 28. 07:25
반응형

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


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

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

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


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

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에서 올바르게 작동하지 않습니다. 거기에서 이전 방법을 사용하십시오.


내 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

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

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

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

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

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


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

내가 가장 최근에 발견 한 (그리고 가장 선호하는) 도구는 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 브라우저에 연결되어 있습니다.

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


내 응용 프로그램에서 데이터베이스를 SD 카드로 내 보냅니다. 데이터베이스가 SD 카드에 있으면 장치를 컴퓨터에 연결하여 액세스 할 수 있습니다.

이 게시물보기 : Android에서 SDCard에 데이터베이스 백업 만들기


당신이 얻는다면

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"

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


나는 단순히했다 :

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

Then I can debug an sqlite database or whatever I wanna do from shell with the right permissions.


There is a way if an apk is debuggable to use a program called run-as from the (non-root) adb shell to copy an application's private file.


Here is step by step instructions - mostly taken from a combination of the other answers. This works with devices that are not unlocked.

  1. Connect your device and launch the application in debug mode.

  2. Copy the database file from your application folder to your sd card: execute:

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

  3. Pull the database files to your machine: execute:

    ./adb pull /sdcard/ execute: ./adb

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

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

  6. 즐겨!


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

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

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


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

내 장치에 sdcard가 없습니다.

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

If you are having similar issue try like this:

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

Try this app: SQLiteWeb (https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb). It provides remote access to your database without pulling it out.

In paid version, it has root access for private database (/data/data/package-name...) or implement a Content Provider to connect using SQLiteWeb (Instructions inside app)

But if want to stay with the free version, you may create your database in external storage:

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

On OSX,using @Tadas answer with automator and sqllitebrowser(https://github.com/sqlitebrowser/sqlitebrowser):

  1. open Automator and create new workflow.

  2. add "Run Shell Script" action.

  3. Paste this :

    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에서 데이터베이스를 새로 고칩니다.


  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)를 사용하십시오 .

참고 URL : https://stackoverflow.com/questions/6928849/debugging-sqlite-database-on-the-device

반응형