題:
您如何從通過“ adb備份”進行的完整備份中提取應用程序的數據?
user11553
2012-08-30 04:51:30 UTC
view on stackexchange narkive permalink

我一直在使用 adb backup 備份Nexus 7,以將所有文件備份到加密備份中。我發現您可以使用 adb restore 從備份中進行還原,但是這會擦除設備上所有現有的數據。

我將如何精確地從加密後的數據中提取一個應用程序的數據備份文件?

另請參閱:[是否有辦法查看內部並修改adb備份創建的文件?](http://android.stackexchange.com/q/23357/16575)
我相信沒有使用Java的答案都不會在加密電話上起作用。請參閱以下我的答案,總結使用nelenkov的應用程序(github.com/nelenkov/android-backup-extractor)。不幸的是,Izzy的Adebar perl腳本ab2tar不適用於加密的備份文件。相似:https://android.stackexchange.com/questions/23357/is-there-a-way-to-look-inside-and-modify-an-adb-backup-created-file
七 答案:
Ryan Conrad
2012-08-30 06:33:45 UTC
view on stackexchange narkive permalink

僅供參考,以下是.ab文件格式的一些背景。

Android備份(* .ab)文件是壓縮的 TAR文件。使用 DEFLATE算法對其進行壓縮。最重要的是,可以使用 AES加密。這是在創建備份時確定的,如果輸入密碼,則備份將被加密,否則;

文件的HEADER與普通的DEFLATE存檔略有不同。它包含有關備份的信息,如下所示:

  ANDROID BACKUP11none  

第一行是“ Magic”行。下一行是Android備份文件格式的版本。下一行是布爾值(true或false,1或0),指示文件是否已壓縮。最後一行是加密類型。本示例未使用任何加密。如果有密碼,該行將顯示為“ AES-256”。之後是加密密碼。如果沒有密碼,則將啟動DEFLATE“歸檔”。

使用 Java Deflater對其進行壓縮。從開發人員的角度來看,如果您想使用Java以外的任何方式來提取它,則會導致問題。即使我發現的所有內容(例如C#)都應該遵循“ SPEC”,我也無法使用相同的算法找到任何可以縮小它的東西。

如此說,在Apache 2.0許可下有一個開源項目,由 Nikolay Elenkov編寫,可以將.ab提取到tar文件中。

用法:

  java -jar abe.jar解壓<backup.ab> <backup.tar> <password>  

如果您不確定如何真正使用它(超出此答案的範圍),則下一版的 Droid Explorer v0.8.8.7(在此處提供),您就可以直接在Explorer中執行此操作,甚至更多。您可以在我的博客上了解更多有關功能的信息(是的,我知道,無恥的插件。我會在適合問題時這樣做)

unpack

如果我有聲譽,我會投票給你,我的上帝,謝謝!
別客氣。我只知道所有這些信息,因為這是我最近添加到Droid Explorer代碼庫中的一項功能,因此我必須對此進行一些研究。
嗨,瑞安(Ryan),嘗試使用Droid Explorer,但即使安裝了Android SDK,並且提供的路徑正確,它也未能開始抱怨Android SDK的位置。
@UmarFarooqKhawaja看看droid資源管理器的[FAQ](https://de.codeplex.com/wikipage?title=FAQ&referringTitle=Home)。最後一個問題解答解決了您的問題。
好的,已經從tar​​中提取了相關的'com.app.name'文件夾,但是我該如何使用它來恢復應用程序數據呢?只是將文件夾複製到sdcard / Android / data /似乎不起作用...
我發現,生成的`tar`歸檔文件的標題可能不正確。我得到的最新建議是在其上運行以下命令,但無濟於事。YMMV:`dd if = backup01.tar bs = 24 skip = 1 |zlib-flate -uncompress |焦油xf -`
Kari
2014-07-27 17:58:03 UTC
view on stackexchange narkive permalink

或者使用單行代碼:

 (printf“ \ x1f \ x8b \ x08 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00”; tail -c +25 backup.ab) | tar xfvz- 
真好!您是否也具有“ pack”的等同功能(以獲取未壓縮的目錄樹並創建一個.db文件)?
您能在答案中添加解釋嗎?
這是最好的答案:D可以很好地工作!立即提取。
說明:作者使用printf命令為.tar.gz文件創建一個標準的Zlib文件頭(0x1F 0x8B是簽名,0x08是壓縮方法,0x00是標誌,4 x 0x00是時間戳),然後從偏移量25d開始向此標頭附加backup.ab`文件的內容。這樣的流是有效的.tar.gz文件,而tar xfvz命令可以將其識別為流,因此可以成功解壓縮該流。
我使用adb 1.0.36(修訂版1.7.0.0 + r33-2)進行了備份,該方法從zgip中產生了一個錯誤:``無效的壓縮數據-格式違反了''
非常好。可以修改它以接受解密密碼嗎?
謝謝,這真的很有幫助!作為對類似答案的評論者之一,我收到了“意外的文件結尾”錯誤,但一切似乎正常。和@dailyglen,一樣,我很想知道這是否可逆?
出現了相同的問題,* gzip:stdin:無效的壓縮數據-違反了tar格式:孩子死於信號13 tar:錯誤無法恢復:現在退出*
@Matifou @Rache由於“無效的壓縮數據”存在相同的問題,並且在備份時設置了密碼,因此我懷疑這是問題所在。我猜因為tar和gzip都不支持密碼保護,所以現在可以通過這種方式輕鬆地調整此命令以要求輸入密碼。:(
有沒有辦法使此備份與加密備份一起使用?我最近升級了手機,並選擇對其文件系統進行加密。那給了我一個加密的備份,我不得不求助於更加複雜的`abe.jar`方法。
我嘗試了所有答案中給出的每種方法,但是我只得到了空的tar文件。我究竟做錯了什麼?
@JosefScript,全部用於未加密的AB文件。我在同一條船上。在下面嘗試使用Perl的Izzy的答案(https://android.stackexchange.com/a/42224/95893),實際上是嘗試使用他的GitHub應用程序,因為安裝腳本的需求很麻煩。我剛剛在他的GitHub上發布了一個有關如何在加密上使用他的ab2tar工具的問題。讓我知道您是否想出任何辦法,我會做同樣的事,
使用dd的速度比筆記本電腦上的tail快2倍: `(printf“ \ x1f \ x8b \ x08 \ x00 \ x00 \ x00 \ x00 \ x00” && dd if = backup.ab bs = 1M iflag = skip_bytes skip = 24)|tar ztv`
MaxChinni
2014-06-12 15:06:24 UTC
view on stackexchange narkive permalink

另一種選擇是使用 bash cat gunzip gzip )。

完整的過程可能是這樣的(具有未加密的備份):

  1. 備份一個應用程序的數據(例如“ 覆蓋DNS以KitKat“):

      $ adb備份-f net.mx17.overridedns.ab -noapk net.mx17.overridedns現在解鎖設備並確認備份操作。 
  2. 提取壓縮數據

      $ dd if = net.mx17.overridedns.ab bs = 1 skip = 24 > compression-data1285 + 0個記錄in1285 + 0個記錄輸出1285個字節(1,3 kB)已復制,0,00745877 s,172 kB / s  
  3. 解壓縮壓縮數據

      $ printf“ \ x1f \ x8b \ x08 \ x00 \ x00 \ x00 \ x00 \ x00” cat-壓縮數據| gunzip -c > decompressed-data.targzip:stdin:文件意外結束 
  4. “不保存” tar文件

      $ tar xf decompressed-data.tar  
  5. ol>
是否可以預期“文件意外結束”?
2中的提取出人意料地對加密文件起作用。這怎麼可能?然後解壓縮失敗,並顯示“ gzip:stdin:無效的壓縮數據-格式違反”。我認為提取成功,因為dd在22763821 + 0條記錄中報告了22763821 + 0條記錄。
@TomRussell提取僅從開始就修剪字節。
joe_zeroh
2016-10-19 03:31:15 UTC
view on stackexchange narkive permalink

同樣隱式的問題是,如何還原單個應用程序數據,我想提到這個漂亮的腳本,該腳本將給定的full-backup.ab拆分為single-app.ab文件:

https://sourceforge.net/projects/adb-split/

它需要jar文件:abe.jar和tar-bin-split.jar,可以在此處找到:

它至少對我的測試用例有效。

Izzy
2013-03-24 16:59:29 UTC
view on stackexchange narkive permalink

另一個選擇是使用此XDA線程的Perl AdbBackupRoutines。但是,它們有一些要求:Perl,加上 libterm-readkey-perl libcrypt-cbc-perl libcrypt-pbkdf2-perl (如果您的備份未加密,您可以通過簡單地註釋掉其中包含的 backupdecrypt.pl 的第103行來跳過最後一個依賴項-對我來說很好用)。

用法非常簡單:

  ./ backupdecrypt.pl [選項] <backupfile.ab> <outfile.tar>  

生成的 .tar 然後可以像其他任何tarball一樣對文件進行調查。它的結構在至少一個方面很有趣:它不反映文件取自的真實路徑(例如,不是 /data/data/com.app.name/databases/whatever.db ,但改為 apps / com.app.name / db / whatever.db )-表示將一個設備/ ROM 可能上備份的應用還原到任何其他設備/ ROM都不會出現問題,因為 adb restore 必須確定真實路徑本身。

還有另一個工具(維護得更好一點)可以做到這一點:https://github.com/nelenkov/android-backup-extractor
謝謝,@lid!我的工具[Adebar](https://github.com/IzzySoft/Adebar)(Android DEvice備份和報告)中還包含了一個小的shell腳本(幾乎只有一個腳本),它可以轉換ADB備份( `.ab`)到`.tar.gz`存檔:)
TWiStErRob
2016-04-27 22:37:02 UTC
view on stackexchange narkive permalink

基於其他人的信息,現在我知道備份文件只是前綴的Deflated(GZip)流,基於此信息,此簡單程序可以為您解壓縮該文件:

  import java.io。*; import java.util.zip。*; / **執行命令javac unab.java && java unab backupfile.ab * / public class unab {private static final int BACKUP_HEADER_LENGTH = 24;公共靜態無效的main(String [] args)引發IOException {InputStream in = new FileInputStream(args [0]);嘗試{OutputStream out = new FileOutputStream(args [0] +“ .tar”);嘗試{如果(in.skip(BACKUP_HEADER_LENGTH)!= BACKUP_HEADER_LENGTH){拋出新IOException(“跳過備份頭時文件意外結束。”); } byte [] buffer = new byte [100 * 1024];整數計數InputStream zip = new InflaterInputStream(in); while((count = zip.read(buffer))> 0){out.write(buffer,0,count);複製代碼}}最後{out.close(); }}最後{in.close();我之所以這樣寫是因為我沒有上面提到的任何Unix工具,並且比安裝Cygwin或其他工具更容易。 

優勢

  • 跨平台
  • 簡單(無深奧參數)
  • 不需要管道工具

缺點

  • 需要一個JDK(由於與Android SDK混淆,您可能已經有了它)
  • 不支持加密備份
  • 需要一些東西來提取生成的tar文件(我使用Total Commander)

要使其成為命令行工具,請創建 unab .bat ,其內容為: java -cp“%〜dp0”。 unab%* 和目錄 PATH

alchemy
2020-04-29 03:36:16 UTC
view on stackexchange narkive permalink

只需添加其他答案,我最終即可使用nelenkov的應用程序( https://github.com/nelenkov/android-backup-extractor)和說明進行操作此處: https://forum.xda-developers.com/showthread.php?t=2011811。我試圖避免為Java佔用額外的800mb磁盤空間。默認情況下,大多數電話都朝著加密邁進,我認為nelenkov的應用程序是唯一可與加密配合使用的解決方案。

這是nelenkov的jar發行版的直接鏈接。檢查其是否為最新版本: https://github.com/nelenkov/android-backup-extractor/releases/tag/20181012025725-d750899

然後按照鏈接中的以下說明進行操作以上。它具有有關氦氣以及將ab文件拆分為單個應用程序文件的更多信息。還有一種更改未設置為不使用root的adb備份的應用程序的方法。如果使用此發行版文件,請替換 abe-all.jar

1)將原始adb備份轉換為tar格式:

java -jar abe.jar解壓縮nexus7.ab nexus7.tar <password>

2)提取tar歸檔文件的內容。這應該在保留tar內部文件權限的文件系統上完成,例如使用linux,mac或bsd。最多可能會出現兩個文件夾(應用程序和共享文件夾):

tar -xvf nexus7.tar

現在您應該擁有新的文件夾了

順便說一句,Izzy的回答很好( https://android.stackexchange.com/a/42224/95893),但是他的腳本需要安裝幾個perl模塊,我無法輕易找到第三個。他的應用程序功能齊全,但可以在Adebar-master / tools /中找到adb2tar。同樣,它不適用於加密的ab文件。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...