Android - Kéo cơ sở dữ liệu SQlite thiết bị Android


99

Tôi đã xem xét khắp nơi và không thể tìm thấy câu trả lời chính xác thực sự hoặc một hướng dẫn về cách, nếu có thể, để làm điều này.

Có thể lấy bất kỳ cách nào cơ sở dữ liệu của thiết bị Android mà không cần phải root nó không? Tôi chỉ cần trích xuất dữ liệu đó theo bất kỳ cách nào để thu thập nó trên máy tính của mình, vậy làm cách nào để thực hiện việc này? Tôi có phải lập trình lại ứng dụng hay bất kỳ phương pháp nào mà các bạn biết không, nhưng hãy nhớ mà không cần root thiết bị. cảm ơn


đây là giải pháp khả thi: stackoverflow.com/a/29257875/291427
kmalmur


1

Câu trả lời:


78

Một cách phổ biến để đạt được những gì bạn mong muốn là sử dụng lệnh pull ADB.

Một cách khác mà tôi thích trong hầu hết các trường hợp là sao chép cơ sở dữ liệu bằng mã vào thẻ SD:

try {
    File sd = Environment.getExternalStorageDirectory();

    if (sd.canWrite()) {
        String currentDBPath = "/data/data/" + getPackageName() + "/databases/yourdatabasename";
        String backupDBPath = "backupname.db";
        File currentDB = new File(currentDBPath);
        File backupDB = new File(sd, backupDBPath);

        if (currentDB.exists()) {
            FileChannel src = new FileInputStream(currentDB).getChannel();
            FileChannel dst = new FileOutputStream(backupDB).getChannel();
            dst.transferFrom(src, 0, src.size());
            src.close();
            dst.close();
        }
    }
} catch (Exception e) {

}

Đừng quên đặt quyền ghi trên SD trong tệp kê khai của bạn, như bên dưới.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

1
Tôi sẽ sử dụng cái này trên một chiếc samsung galaxy tab không có thẻ SD vậy làm cách nào để làm điều đó ở đó?
DeX03

và, tôi phải sử dụng đôi //?
DeX03

Có, điều này là do / là chuỗi ký tự đặc biệt. // trong "//" của bạn sẽ cho kết quả là /.
KarlKarlsom

4
Thay vì xây dựng đường dẫn cơ sở dữ liệu, SQLiteDatabase có một getPathphương thức.
Will

Câu trả lời tuyệt vời. rất thông minh, hữu ích và đơn giản.
Gundu Bandgar

179

Nếu thiết bị của bạn đang chạy Android v4 trở lên, bạn có thể lấy dữ liệu ứng dụng, bao gồm cả cơ sở dữ liệu, mà không cần root bằng cách sử dụng adb backuplệnh, sau đó giải nén tệp sao lưu và truy cập cơ sở dữ liệu sqlite.

Lần đầu tiên sao lưu dữ liệu ứng dụng vào PC của bạn qua cáp USB bằng lệnh sau, thay thế app.package.namebằng tên gói thực của ứng dụng.

adb backup -f ~/data.ab -noapk app.package.name

Thao tác này sẽ nhắc bạn "mở khóa thiết bị của bạn và xác nhận thao tác sao lưu". Không cung cấp mật khẩu để mã hóa sao lưu để bạn có thể giải nén nó sau này. Nhấp vào nút "Sao lưu dữ liệu của tôi" trên thiết bị của bạn. Màn hình sẽ hiển thị tên của gói bạn đang sao lưu, sau đó tự đóng lại khi hoàn tất thành công.

Tệp kết quả data.abtrong thư mục chính của bạn chứa dữ liệu ứng dụng ở định dạng sao lưu android. Để giải nén nó, hãy sử dụng lệnh sau:

dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf -

Nếu phần trên kết thúc bằng openssl:Error: 'zlib' is an invalid command.lỗi, hãy thử phần bên dưới.

dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -

Kết quả là apps/app.package.name/thư mục chứa dữ liệu ứng dụng, bao gồm cả cơ sở dữ liệu sqlite.

Để biết thêm chi tiết, bạn có thể kiểm tra bài đăng blog gốc .


9
Đối với những người chưa biên dịch zlib mà không có zlib, hãy xem câu trả lời trên blog.shvetsov.com/2013/02/… để trích xuất dữ liệu bằng python.
ingh.am

2
Đối với người dùng Windows không có lệnh giải nén, bạn có thể sử dụng Ứng dụng Java "Android Backup Extractor" ( sourceforge.net/projects/adbextractor ). Xem forum.xda-developers.com/showthread.php?t=2011811 để biết các lệnh giải nén tệp .ab.
lalitm

7
trên MacBook Pro của tôi, tôi nhận được thông báo openssl:Error: 'zlib' is an invalid command., mà tôi đã trả lời là dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -TUY NHIÊN, sau khi nó cho thấy 17+0 records in17+0 records out17 bytes transferred in 0.000064 secskhông có bằng chứng về bất kỳ điều gì đã được thực hiện với thư mục. Vì nó chỉ có 17 byte nên tôi cho rằng lệnh đó cũng không thành công. Tôi nghĩ thật tệ khi tôi không thể adb pulllấy cơ sở dữ liệu từ một ứng dụng gỡ lỗi !!
Ai đó ở đâu đó

12
mẹo chuyên nghiệp: nội dung sao lưu này sẽ không hoạt động nếu tệp kê khai của ứng dụng hiển thịandroid:allowBackup="false"
Ai đó ở đâu đó

9
My openssltrên Mac OS X không hỗ trợ zliblệnh hoặc, vì vậy tôi cài đặt lại một với brew: brew reinstall openssl. Điều này sẽ không thay thế hệ thống của bạn openssl. Do đó, tôi chỉ sửa đổi lệnh PATH cho phiên hiện tại: export PATH=/usr/local/opt/openssl/bin:$PATHsau đó có thể thực hiện thành công các lệnh từ câu trả lời này.
Aleks N.

69

Đối với các ứng dụng có thể gỡ lỗi 1 trên thiết bị không được root , bạn có thể sử dụng lệnh sau:

adb shell run-as package.name chmod 666 /data/data/package.name/databases/file
adb pull /data/data/package.name/databases/file

Thí dụ:

adb shell run-as com.app chmod 666 /data/data/com.app/databases/data.db
adb pull /data/data/com.app/databases/data.db

Đặt adb PATH cho Biến môi trường hoặc sử dụng lệnh cd cho công cụ-nền tảng thư mục sdk android.

Thí dụ:

cd /folder/android-sdk/platform-tools/

sau đó sử dụng lệnh trên


1 Lưu ý rằng hầu hết các ứng dụng trong Cửa hàng Play đều không thể gỡ lỗi vì nó yêu cầu đặt cờ có thể gỡ lỗi trong tệp kê khai.


8
Sau khi tôi thay thế package.namebằng gói của ứng dụng, lỗi được trả lại:run-as: Package 'com.my.app' is unknown
Một người nào đó ở đâu đó

3
Có vẻ như nó không hoạt động cho tất cả các điện thoại. Ví dụ: hoạt động cho Nexus 4, không hoạt động cho SGS4.
Roman Minenok

2
Tập tin db được lưu ở đâu?
Vojtěch Pešek

3
Điều này đã từng hoạt động đối với tôi, nhưng tôi dường như không thể làm cho điều này hoạt động trên Nexus 7 của tôi đã cập nhật lên Android 5. Có ai có thể xác nhận rằng tính năng này hoạt động trên Android 5 không?
treeAreEverywhere

15
Đây là bản hack cho Android 5 (Lollipop) adb shell "run-as [package_name] chmod -R 777 / data / data / [package_name] / databases" adb shell "mkdir -p / sdcard / tempDB" adb shell "cp -r / data / data / [package_name] / databases / / sdcard / tempDB /. " adb kéo sdcard / tempDB /. adb shell "rm -r / sdcard / tempDB / *"
Rubin Yoo

55

Hầu hết các câu trả lời ở đây phức tạp hơn nhiều so với những gì chúng phải có. Nếu bạn chỉ muốn sao chép cơ sở dữ liệu của ứng dụng từ điện thoại sang máy tính thì bạn chỉ cần lệnh sau:

adb -d shell "run-as your.package.name cat databases/database.name" > target.sqlite

Tất cả những gì bạn cần điền vào lệnh trên là tên gói ứng dụng của bạn, cơ sở dữ liệu được gọi là gì và tùy chọn cái / nơi bạn muốn cơ sở dữ liệu được sao chép vào.

Xin lưu ý rằng lệnh cụ thể này sẽ chỉ hoạt động nếu bạn chỉ có một thiết bị được kết nối với máy tính của mình. Các -dphương tiện tham số là thiết bị duy nhất kết nối sẽ được nhắm mục tiêu. Nhưng có những tham số khác mà bạn có thể sử dụng thay thế:

  • -e sẽ nhắm mục tiêu trình giả lập đang chạy duy nhất
  • -s <serialnumber> sẽ nhắm mục tiêu một thiết bị có số sê-ri cụ thể.


Làm cách nào để mở tệp này?
Jehad,

@Jehad: Tôi cũng gặp vấn đề tương tự. Tôi đã tìm ra cách này và nó phù hợp với tôi. Cài đặt SSHDroid trên điện thoại của bạn, adb -d shell "run-as your.package.name cat databases/database_name.db > /mnt/sdcard/database_name.db" khởi SSHDroidđộng FileZilla khởi động và kết nối với điện thoại của bạn qua giao thức SFTP. Đặt / mnt / sdcard làm thư mục từ xa mặc định.
Zoltán Süle

Câu trả lời dễ dàng nhất khi bạn muốn lấy cơ sở dữ liệu của ứng dụng của riêng mình. Hai bổ sung: 1) nếu bạn không chắc chắn về tên cơ sở dữ liệu của mình, bạn có thể sử dụng lệnh ls để liệt kê các tệp trong thư mục cơ sở dữ liệu ( adb -d shell "run-as your.package.name ls databases") và 2) bạn có thể muốn lấy bất kỳ tệp nào khác được liên kết cùng với cơ sở dữ liệu, trong trường hợp của tôi giải nén các tập tin -smh và -wal là cách duy nhất để có được DB Trình duyệt cho SQLite để mở cơ sở dữ liệu
Ronan

36

Sử dụng phiên bản Android Studio 3.0 trở lên, bạn có thể lấy cơ sở dữ liệu (cũng như tùy chọn chia sẻ, thư mục bộ nhớ cache và những thứ khác) nếu ứng dụng chạy ở chế độ gỡ lỗi trên thiết bị chưa root.

Để kéo cơ sở dữ liệu bằng cách sử dụng studio android, hãy làm theo các bước sau.

  1. Nhấp vào Xem > Công cụ Windows > Trình khám phá tệp thiết bị .
  2. Mở rộng các nút / data / data / [tên-gói] .

Các bước tiếp theo trong Android Studio 3.0


Cảm ơn. Các tệp đã tải xuống từ trình giả lập, trong khi không thể tải chúng từ Galaxy S4 chưa được root.
CoolMind

Bạn có thể lấy cơ sở dữ liệu từ bất kỳ ứng dụng nào hay chỉ ứng dụng của riêng bạn?
live-love vào

Bất kỳ ứng dụng nào nhưng điều kiện tiên quyết là ứng dụng phải có thể gỡ lỗi.
Shahidul

6
 adb shell "run-as [package.name] chmod -R 777 /data/data/[package.name]/databases" 
 adb shell "mkdir -p /sdcard/tempDB" 
 adb shell "cp -r /data/data/[package.name]/databases/ /sdcard/tempDB/." 
 adb pull sdcard/tempDB/ . 
 adb shell "rm -r /sdcard/tempDB/*"

5

Đối với Ubuntu (không chỉ?):

xem Sergeis Answer nhưng thay vì openssl, hãy sử dụng zlib-flate:

cat appbackup.ab | (dd bs = 24 tính = 0 bỏ qua = 1; mèo) | zlib-flate -uncompress> appbackup.tar

Nếu không thì openssl có thể sẽ ném:

openssl: Lỗi: 'zlib' là lệnh không hợp lệ.

bởi vì openssl không được biên dịch với hỗ trợ zlib trong Ubuntu


1

Kể từ đó, không có gì thực sự hiệu quả với tôi. Tôi tạo một kịch bản cửa sổ BATCH nhỏ dựa trên các câu trả lời khác được kết hợp với nhau. Hy vọng nó sẽ giúp ai đó. Đơn giản chỉ cần sử dụng: backupDatabase <PackageName> <ApplicationName> [TargetDirectory]. Nó sử dụng phương pháp sao lưu của Sergei và Android Backup Extractor .

@echo off

if [%1]==[] goto usage
if [%2]==[] goto usage
if NOT [%4]==[] goto usage

@echo Processing: preparations
set PACKAGE=%1
set APPLICATION_NAME=%2
set TARGET_DIR=%cd%
IF NOT "%~3"=="" set TARGET_DIR=%3

set PATH_ADB="c:\Program Files (x86)\Android\android-studio\sdk\platform-tools"
set PATH_ABE="c:\Programs\android-backup-extractor-20140630-bin"
set PATH_7Z="c:\Program Files\7-Zip"

@echo Processing: backup
%PATH_ADB%\adb.exe backup -f %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab -noapk %PACKAGE%

@echo Processing: unpack
java -jar %PATH_ABE%\abe.jar unpack %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab.tar

@echo Processing: extract
cd %TARGET_DIR%\%APPLICATION_NAME%
%PATH_7Z%\7z.exe e %APPLICATION_NAME%.ab.tar "apps\%PACKAGE%\db\%APPLICATION_NAME%"

@echo Processing: cleaning
del %APPLICATION_NAME%.ab
del %APPLICATION_NAME%.ab.tar
goto :eof

:usage
@echo.Pull out SQLite database file from your android device.
@echo.Needs: - connected device
@echo.       - device enable backup.
@echo.       - application enable backup
@echo.       - application in debug mode
@echo.       - installed Android Backup Extractor 
@echo.       - installed command line TAR extractor (7z, ...)
@echo.Does NOT need: root device
@echo.
@echo.Uses: - ADB backup (set PATH_ADB)
@echo.      - Android Backup Extractor (http://sourceforge.net/projects/adbextractor/) (set PATH_ABE)
@echo.      - Extract TAR container, uses 7z (set PATH_7Z)
@echo.
@echo.Usage: backupDatabase ^<PackageName^> ^<ApplicationName^> [TargetDirectory]
@echo.Example: backupDatabase com.foo.example ExampleApp 
@echo Example: backupDatabase com.foo.example ExampleApp workspace\AndroidProjects\Example
exit /B 1

1

bạn có thể dễ dàng giải nén tệp sqlite từ thiết bị của mình (không cần root)

  1. Đi tới Thư mục SDK
  2. cd platform-tools
  3. bắt đầu adb

    cd / sdk / platform-tools ./adb shell

    Sau đó nhập lệnh sau vào terminal

    ./adb -d shell "run-as com.your_packagename cat /data/data/com.your_packagename/databases/jokhanaNepal> /sdcard/jokhana.sqlite"

    Ví dụ:

    ./adb -d shell "run-as com.yuvii.app cat /data/data/com.yuvii.app/databases/jokhanaNepal> /sdcard/jokhana.sqlite"


1

Nếu bạn đang cố gắng làm điều đó trên android 6, hãy yêu cầu quyền và sử dụng mã câu trả lời của câu hỏi này

if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_RC); 
    return; 
} 

Sau khi nó được cấp

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == STORAGE_PERMISSION_RC) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //permission granted  start reading or writing database
        } else { 
            Toast.makeText(this, "No permission to read external storage.", Toast.LENGTH_SHORT).show();
        } 
    } 
} 

1

Ngoài ra, bạn có thể sử dụng thư viện Ultra Debugger của tôi . Nó cho phép tải xuống cơ sở dữ liệu dưới dạng tệp hoặc chỉnh sửa giá trị trực tiếp trong trình duyệt. Không cần root, rất dễ sử dụng.


1

Trên Mac (KHÔNG cần root)

1. Go to platform-tools folder.
2) Run following command in terminal.

./adb -d shell "run-as your.package.name cat databases/database.sqlite" > database.sqlite

Nó sẽ sao chép tệp sqlite trong thư mục công cụ nền tảng.


Điều này dường như chỉ hoạt động nếu ứng dụng được biên dịch để gỡ lỗi.
David Berry

@DavidBerry Có, nó sẽ kéo db nếu được biên dịch để gỡ lỗi, nếu không, bạn có thể kéo db của bất kỳ ứng dụng nào. Và nó sẽ là vấn đề bảo mật nghiêm trọng của ứng dụng. :)
Yogesh Suthar

0
 > is it possible to pull in any way a database of an Android device without having to root it? 

có nếu ứng dụng android của bạn tạo một bản sao tệp của cơ sở dữ liệu mà mọi người đều có thể truy cập được.

android bảo vệ dữ liệu riêng tư của ứng dụng để các ứng dụng khác không thể nhìn thấy / truy cập được. cơ sở dữ liệu là dữ liệu cá nhân. ứng dụng của bạn tất nhiên có thể đọc tệp cơ sở dữ liệu để nó có thể sao chép tệp vào một số tệp hiển thị công khai.


0

Trên thiết bị đã root, bạn có thể:

// check that db is there
>adb shell
# ls /data/data/app.package.name/databases
db_name.sqlite // a custom named db
# exit
// pull it
>adb pull /data/app.package.name/databases/db_name.sqlite

Tôi không chắc chắn 100% nhưng tôi nghĩ rằng trước khi kéo cần> su và phép Cung cấp cho
pavol.franek

0

Dựa trên câu trả lời do Lam Vinh đưa ra, đây là một tệp lô đơn giản phù hợp với tôi trên Nexus thế hệ thứ nhất 7. Nó nhắc người dùng nhập tên gói và sau đó là tên cơ sở dữ liệu (không có đuôi .sqlite) và đặt nó trong c: \ temp. Điều này giả sử bạn đã đặt sdk Android trong các biến môi trường.

@echo off
cd c:\temp\

set /p UserInputPackage= Enter the package name: 
set /p UserInputDB= Enter the database name: 

@echo on
adb shell "run-as %UserInputPackage% chmod 666 /data/data/%UserInputPackage%/databases/%UserInputDB%.sqlite"
adb pull /data/data/%UserInputPackage%/databases/%UserInputDB%.sqlite
@echo off
pause

0

Nếu bạn đang sử dụng Android 4.0 trở lên và bạn đang sử dụng mac , thì đây là một tập lệnh ruby ​​sẽ lưu nội dung ứng dụng của bạn vào màn hình. Tôi sẽ tưởng tượng điều này cũng sẽ hoạt động trong Ubuntu, mặc dù tôi đã không thử nghiệm nó.

puts "enter your package name"
package_name = gets.chomp
puts "press the 'Back up my data' button on your device"
`adb backup -f ~/Desktop/data.ab -noapk #{package_name}`
puts "press enter once once the 'Backup finished' toast has appeared"
gets.chomp
puts "extracting..."
`dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf -`

chạy -> ruby ​​your_ruby_file_name.rb

Tập lệnh này chỉ là "con đường hạnh phúc", vì vậy hãy đảm bảo rằng thiết bị của bạn được kết nối và adb đó đã được thêm vào hồ sơ của bạn.


0

Tôi đưa ra giải pháp hoàn chỉnh để "lưu" và "khôi phục" cơ sở dữ liệu ứng dụng vào / từ bộ nhớ trong (không phải cho PC có adb).

Tôi đã thực hiện hai phương pháp một để lưu và một để khôi phục cơ sở dữ liệu. Sử dụng các phương thức này ở cuối onCreate () trong MainActivity (phương thức này hoặc phương thức khác nếu bạn muốn tiết kiệm hoặc khôi phục cơ sở dữ liệu).

lưu cơ sở dữ liệu vào bộ nhớ trong:

void copyDatabase (){
        try {
            final String inFileName = "/data/data/<pakage.name>/databases/database.db";
            final String outFileName = Environment.getExternalStorageDirectory() + "database_backup.db";
            File dbFile = new File(inFileName);
            FileInputStream fis = new FileInputStream(dbFile);


            Log.d(TAG, "copyDatabase: outFile = " + outFileName);

            // Open the empty db as the output stream
            OutputStream output = new FileOutputStream(outFileName);

            // Transfer bytes from the inputfile to the outputfile
            byte[] buffer = new byte[1024];
            int length;
            while ((length = fis.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }

            // Close the streams
            output.flush();
            output.close();
            fis.close();
        }catch (Exception e){
            Log.d(TAG, "copyDatabase: backup error");
        }
    }

khôi phục cơ sở dữ liệu từ bộ nhớ trong:

void restoreDatabase (){
        try {
            final String inFileName = Environment.getExternalStorageDirectory() + "database_backup.db";
            final String outFileName = "/data/data/<package.name>/databases/database.db";
            File dbFile = new File(inFileName);
            FileInputStream fis = new FileInputStream(dbFile);

            Log.d(TAG, "copyDatabase: outFile = " + outFileName);

            // Open the empty db as the output stream
            OutputStream output = new FileOutputStream(outFileName);

            // Transfer bytes from the inputfile to the outputfile
            byte[] buffer = new byte[1024];
            int length;
            while ((length = fis.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }

            // Close the streams
            output.flush();
            output.close();
            fis.close();
        }catch (Exception e){
            Log.d(TAG, "copyDatabase: backup error");
        }
    }

0

Sẽ luôn tốt hơn nếu mọi thứ được tự động hóa. Đó là lý do tại sao tôi viết script python đơn giản để sao chép tệp db từ thiết bị bằng ADB. Nó tiết kiệm rất nhiều thời gian phát triển nếu bạn làm việc đó thường xuyên.

Chỉ hoạt động với các ứng dụng có thể gỡ lỗi nếu thiết bị chưa được root.

Đây là liên kết đến ý chính.

Chạy nó như: python copyandroiddbfile.py

import sys
import subprocess
import re

#/
# Created by @nieldeokar on 25/05/2018.
#/

# 1. Python script which will copy database file of debuggable apps from the android device to your computer using ADB.
# 2. This script ask for PackageName and DatabaseName at runtime.
# 3. You can make it static by passing -d at as command line argument while running script and setting defaults in following way.
# 4. Edit script and change the values of varialbe packageName and dbName to debuggable app package name and database name then
# run script as : python Copydbfileandroid.py -d 

useDefaults = False


def checkIfPackageInstalled(strSelectedDevice) :

    packageName = 'com.nileshdeokar.healthapp.debug'
    dbName = 'healthapp.db'


    if not useDefaults : 
        print('Please enter package name : ')
        packageName = raw_input()

    packageString = 'package:'+packageName

    try:
        adbCheckIfPackageInstalledOutput = subprocess.check_output('adb -s ' + strSelectedDevice + ' shell pm list packages | grep -x '+ packageString, shell=True)
    except subprocess.CalledProcessError as e:
                print "Package not found"
                return


    if packageString.strip() == adbCheckIfPackageInstalledOutput.strip() : 
        if not useDefaults : 
            print('Please enter db name : ')
            dbName = raw_input()

        adbCopyDbString = 'adb -s '+strSelectedDevice + ' -d shell \"run-as '+packageName+' cat /data/data/'+packageName+'/databases/'+ dbName +'\" > '+dbName

        try:
            copyDbOp = subprocess.check_output(adbCopyDbString,shell=True)
        except subprocess.CalledProcessError as e:
                return

        if "is not debuggable" in copyDbOp :
            print packageString + 'is nto debuggable'

        if copyDbOp.strip() == "":
            print 'Successfully copied '+dbName + ' in current directory'

    else :
        print 'Package is not installed on the device'



defaultString = "-d"
if len(sys.argv[1:]) > 0 and sys.argv[1] == defaultString :
        useDefaults = True

listDevicesOutput = subprocess.check_output("adb devices", shell=True)
listDevicesOutput = listDevicesOutput.replace("List of devices attached"," ").replace("\n","").replace("\t","").replace("\n\n","")

numberofDevices = len(re.findall(r'device+', listDevicesOutput))

connectedDevicesArray = listDevicesOutput.split("device")   
del connectedDevicesArray[-1] 


strSelectedDevice = ''
if(numberofDevices > 1) :
    print('Please select the device : \n'),

    for idx, device in enumerate(connectedDevicesArray):
        print idx+1,device

    selectedDevice = raw_input()

    if selectedDevice.isdigit() :
        intSelected = int(selectedDevice)
        if 1 <= intSelected <= len(connectedDevicesArray) :
            print 'Selected device is : ',connectedDevicesArray[intSelected-1]
            checkIfPackageInstalled(connectedDevicesArray[intSelected-1])
        else :
            print 'Please select in range'
    else : 
        print 'Not valid input'

elif numberofDevices == 1 :
    checkIfPackageInstalled(connectedDevicesArray[0])
elif numberofDevices == 0 :
    print("No device is attached")

0

Điều này dành cho thiết bị không được root, tôi sử dụng một giải pháp rất dễ dàng và bạn có thể xóa nó bất cứ lúc nào bạn muốn chỉ cần thêm một thư viện vào build.gradle (ứng dụng) của bạn

debugImplementation 'im.dino: dbins Inspector: 4.0.0'

https://github.com/infinum/android_dbins Inspector

kiểm tra liên kết này để biết thêm chi tiết


-1

Nếu bạn muốn tệp cơ sở dữ liệu của mình

Xem DDMS> Khám phá tệp

tìm tệp db của bạn từ tên gói của bạn

sau đó Nhấp vào kéo tệp từ thiết bị (Chỉ thiết bị đã root)


3
điều này có thể được thực hiện nhưng trên một thiết bị bắt nguồn, đó là điểm của câu hỏi của tôi, làm thế nào để làm điều đó trên một thiết bị không cắm rễ
DeX03

1
điều này không hoạt động trên thiết bị không được root. Câu trả lời của bạn phải nêu rõ điều đó.
tony9099
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.