2010-01-16 31 views
31

Bất cứ ai có thể cho tôi biết, có thể sử dụng ADB để kéo và đẩy một cơ sở dữ liệu từ một ứng dụng mà không có phần mềm gốc trên điện thoại không?Android ADB truy cập vào cơ sở dữ liệu ứng dụng mà không có gốc

Ví dụ, tôi biết vị trí trên ma thuật bắt nguồn của tôi và giấc mơ là:

/data/data/com.xxxx.xxxx/databases/xxxx 

Tôi biết rằng bạn có thể sử dụng ADB mà không có gốc, nhưng khi cố gắng sử dụng vỏ - bạn không thể xem đó vị trí không có privaliges gốc. Nhưng tôi đã được thông báo rằng bạn có thể sử dụng push và pull nếu bạn biết tệp mình muốn?

Về cơ bản, tôi muốn kéo cơ sở dữ liệu từ ứng dụng MY trên điện thoại không bắt nguồn, sửa đổi và đẩy nó trở lại.

Chỉ có sự cố mà tôi gặp phải là hai điện thoại tôi có cả gốc và tôi không có quyền truy cập vào máy chủ gốc để dùng thử.

+0

vui lòng xem xét thay đổi chấp nhận của bạn thành câu trả lời của Pilot_51. –

Trả lời

72

Trong khi câu trả lời của Nilhcem không hiệu quả đối với tôi, nó dẫn tôi đi đúng hướng (để tôi upvoted) và bây giờ tôi có một giải pháp làm việc.

Cũ câu trả lời có thể không hoạt động với các phiên bản mới hơn của Android:

#Transfer file from app databases directory to PC 
adb shell 
$ run-as package.name 
$ cd ./databases/ 
$ ls -l #Find the current permissions - r=4, w=2, x=1 
$ chmod 666 ./dbname.db 
$ exit 
$ exit 
adb pull /data/data/package.name/databases/dbname.db ~/Desktop/ 

#Transfer file from PC to app databases directory (requires the above permission change) 
adb push ~/Desktop/dbname.db /data/data/package.name/databases/dbname.db 
adb shell 
$ run-as package.name 
$ chmod 660 ./databases/dbname.db #Restore original permissions 
$ exit 
$ exit 

phương pháp thay thế sử dụng lưu trữ bên ngoài (xác nhận để làm việc với 6.0.1):

#Transfer file from app databases directory to external storage 
adb shell 
$ run-as package.name 
$ cp ./databases/dbname.db /sdcard/ 
$ exit 
$ exit 

#Transfer file from external storage to app databases directory 
adb shell 
$ run-as package.name 
$ cp /sdcard/dbname.db ./databases/ 
$ exit 
$ exit 
+1

Đây là câu trả lời đúng cho câu hỏi được hỏi, nơi người muốn làm điều này là nhà phát triển ứng dụng và có thể cài đặt phiên bản gỡ lỗi của nó (phiên bản gỡ lỗi là điều kiện tiên quyết để chạy). Các tùy chọn khác bao gồm việc bản thân ứng dụng thay đổi quyền hoặc sao chép tệp vào/từ bộ nhớ ngoài. –

+0

adb return with message run-as: Gói 'com.instagram.android' không biết tôi nên làm gì? Tôi cũng cố gắng sử dụng su sau đó adb pull /data/data/package.name/databases/dbname.db ~/Desktop/nhưng nó trả về lỗi: không tìm thấy thiết bị? – UmAnusorn

+1

@ um.anusorn Có sự cố trong 4.3 xảy ra lỗi chạy và phải được khắc phục ở 4.4. Xem: https://code.google.com/p/android/issues/detail?id=58373 Nếu bạn có root, bạn có thể sửa nó bằng cách kích hoạt quyền UID của/system/bin/run-as, nhưng đánh bại mục đích. –

13

Một cách giải quyết nhanh chóng là sử dụng lệnh run-as để sao chép cơ sở dữ liệu trong một thư mục nơi bạn có thể có quyền truy cập, chẳng hạn như /sdcard và sau đó, làm một adb pull

adb shell 
$ run-as package.name cp /data/data/package.name/dbname.db /sdcard/ 
$ exit 
adb pull /sdcard/dbname.db 

biết thêm thông tin bình thường trên đường chạy trốn-như lệnh here

Lưu ý rằng lệnh run-as khả dụng vì API cấp 8 (Android 2.2) và chỉ có thể được sử dụng nếu ứng dụng là debbugable.

+0

trên phiên bản của tôi (có thể một cái gì đó để làm với 4.4, hoặc một số cập nhật trong năm qua?) Tôi không thể 'cp' vào/sdcard khi sử dụng' run-as'. Tôi cần phải sử dụng giải pháp 'chmod' từ @ Pilot_51 –

+0

Điều này đúng - thẻ sd không còn có thể ghi khi sử dụng vỏ adb – slott

0

Chúng tôi thiết lập cho phép tập tin để có thể đọc được cho tất cả người dùng từ bên trong ứng dụng.

if (BuildConfig.DEBUG) 
{ 
    new File(mDB.getPath()).setReadable(true, false); 
} 

Sau đó, chỉ cần kéo .db ra bằng adb bình thường.

adb -d pull //data/data/xxxxx/databases/xxxxx.db . 

LƯU Ý: Tôi đã phát hiện ra rằng điều này cần phải được thực hiện mỗi lần tập tin cơ sở dữ liệu được mở ra, ví dụ như trong onCreate cũng như các nhà xây dựng của wrapper SQLiteOpenHelper của bạn (khi cơ sở dữ liệu của bạn không phải là null) hoặc có lẽ trênOpen. Nếu chỉ trong onCreate, thì lần sau khi bạn chạy ứng dụng của mình và .db đã tồn tại, vì lý do nào đó các quyền đã bị thay đổi trở lại. Điều này có thể liên quan đến cách Android quản lý dữ liệu của nó.

1

Trên OxygenOS (dựa trên Android 5.2) Tôi đã trộn lẫn hai giải pháp được cung cấp bởi Pilot_51.

Trước tiên tôi đã sử dụng run-as để truy cập trên /data/data/package.name/databases từ đây tôi không thể sao chép trực tiếp trên /sdcard/ do đó tôi đã thay đổi quyền của tệp. Sau đó tôi đã thoát khỏi chế độ run-as và sử dụng cp để sao chép tệp trong /sdcard/ bộ nhớ.Cuối cùng, tôi đã có thể sử dụng adb pull

$ adb -s <DEVICE_ID> shell 
$ run-as package.name 
$ chmod 666 databases/dbname.db 
$ exit 
$ cp /data/data/package.name/databases/dbname.db /sdcard/dbname.db 
$ exit 
$ adb pull /sdcard/dbname.db ./dbname.db 
Các vấn đề liên quan