2018年5月14日 星期一

android app 的資料備份

開發 app 時,常會寫入一些資料做些收集、檢測的工作,實體手機有權限的限制,寫入在 app 的 private data 時,資料的備份是一個麻煩事。
以下方式可以處理~

from:
https://stackoverflow.com/questions/15558353/how-can-one-pull-the-private-data-of-ones-own-android-app

從 android 手機要備份資料,用 adb 可能會用以下方式:
adb pull /data/data/com.corp.appName/files/myFile.txt myFile.txt
 
對於 android virtual device 可能可以,但對實體手機可能會產生錯誤,它不讓我們複製。 
 
先離題一下,連線到實體手機時,以下指令可以進入到 app 的目錄裡,可以看到相關檔案,但無法複製。 
adb shell
run-as com.example.appName 

回題,要複製 app 的資料方式,要用備份的概念來做,指令如下:
adb backup  -f myFiles com.example.appName 

這個指令執行時,為了安全考量,手機上會顯示是否允許備份的動作,所以,必須在手機上配合操作才能允許備份某個 app 的資料。 
其中,myFiles 是備份出來的檔案,這個檔案是有壓縮的。
解開的方式如下:
dd if=myFiles bs=4K iflag=skip_bytes skip=24 | openssl zlib -d > myFiles.tar
 
如果上面這個指令產生 zlib 的錯誤,我用以下方式可以解開壓縮檔,成為 tar 的檔案。
dd if=myFiles bs=4K iflag=skip_bytes skip=24 | zlib-flate -uncompress > myFiles.tar 

再用 tar xf myFiles.tar 方式解開就完成了。 
 
2020.12.02 更新
ref: https://stackoverflow.com/questions/29830981/error-zlib-is-an-invalid-command
如果出現 zlib 或 flate 錯誤,可以用底下方式,用 python 來解決~ 
dd if=myFiles bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -

========================

討論串的下方還有幾種方式,我沒試,也許簡單些~ 
 
方式1 
$ adb shell
$ run-as {app-package-name}
$ cd /data/data/{app-package-name}
$ chmod 777 {file}
$ cp {file} /mnt/sdcard/
再回到 linux 將檔案複製出來
$ adb pull /mnt/sdcard/{file}
 
方式2
adb -d shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db
直接用 print 的方式將檔案 dump 到 linux 的檔案裡。 
 
  

沒有留言: