2010-01-16 45 views
31

誰能告訴我,是有可能使用亞行拉從一個應用程序發送數據庫,無需在手機上根本privaliges?的Android ADB訪問應用程序數據庫,而根

例如,我知道我的根魔術和夢想的位置是:

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

我知道,你可以使用ADB無根,而是試圖使用shell時 - 你無法查看沒有根特權的位置。但是我被告知如果你知道你想要的文件,你可以使用push和pull。

基本上我想從我的非植根手機上的應用程序拉數據庫中修改它,並將它推回。

唯一的麻煩我是,兩款手機我是根和我沒有訪問到非根一個嘗試一下。

+0

請考慮將您的接受改爲Pilot_51的回答。我的版本上的 – 2013-06-18 19:25:10

回答

72

雖然Nilhcem的回答並沒有爲我工作,這導致我在正確的方向(即我upvoted),我現在有一個可行的解決方案。

舊的答案,可能無法與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 
使用外部存儲(證實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

對於所問的問題,這是一個正確的答案,其中想要這樣做的人是開發人員該應用程序並可以安裝它的調試版本(調試版本是run-as的先決條件)。其他選項包括讓應用程序本身更改權限或將文件複製到外部存儲器或從外部存儲器複製文件。 – 2013-06-18 19:26:33

+0

adb return with message run-as:Package'com.instagram.android'不知道該怎麼辦?我也嘗試使用su然後adb拉/data/data/package.name/databases/dbname.db〜/ Desktop /但它返回錯誤:找不到設備? – UmAnusorn 2013-10-09 15:37:58

+1

@ um.anusorn在4.3中有一個問題打破了運行方式,應該在4.4中進行修正。請參閱:https://code.google.com/p/android/issues/detail?id=58373如果您擁有root用戶,您可以通過啓用/ system/bin/run-as的Set UID權限來解決此問題,但是有種失敗的目的。 – 2014-02-04 16:25:49

13

一個快速的解決方法是使用run-as命令將數據庫文件夾中複製,你可以訪問,如/sdcard,然後執行上運行作爲一個正常的adb pull

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

更多信息命令here

注意,run-as命令是因爲API級別8(的Android 2.2)可用並且只能用於如果應用程序是debbugable

+0

(可能與4.4有關,或者去年有些更新?)當使用'run-as'時,我不能'cp'到/ sdcard。我需要使用來自@ Pilot_51的'chmod'解決方案 – 2014-02-06 09:22:53

+0

這是事實 - 使用adb外殼時sd卡不再可寫入 – slott 2015-01-13 13:21:36

0

我們設置文件權限從應用內的所有用戶可讀。

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

然後只需用adb將.db關閉即可。

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

注:我發現,這需要在每個的onCreate數據庫文件被打開的時間完成,例如,以及你SQLiteOpenHelper包裝的構造函數(當你的數據庫不爲空)或者可能打開。如果僅在onCreate中,那麼下次運行應用程序並且.db已存在時,出於某種原因,權限已被更改。這可能與Android管理其數據的方式有關。

1

OxygenOS(基於Android 5.2),我已經混了由Pilot_51提供了兩種解決方案。我用run-as從這裏獲得關於/data/data/package.name/databases訪問我無法直接複製/sdcard/

首先所以我改變了文件的權限。從那以後,我已經從run-as模式退出,並使用cp將文件複製/sdcard/存儲。最終我能夠使用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 
相關問題