Saya membuat cadangan Galaxy Nexus saya dengan adb backup
. File yang dihasilkan bernama backup.db dan entah bagaimana dienkripsi.
Saya ingin mengembalikan cadangan, tetapi berhenti ketika harus memulihkan com.android.providers.contacts
. Saya biasa adb logcat
mencari tahu apa yang terjadi dan menemukan bahwa com.android.acore
crash selama proses pemulihan.
Saya ingin mendapatkan akses ke data dalam cadangan dan menghapus basis data kontak untuk mengembalikan semuanya ke telepon saya. Apakah ada cara lain memulihkan data dari cadangan?
BackupManagerService
membaca konten file cadangan. Ini pekerjaan yang bagus, tapi saya perlu data saya kembali ...Saya mulai mengerjakan ini. Saya memposting hasil saya sejauh ini di sini sebagai jawaban "komunitas wiki" karena dua alasan: pertama, jika orang lain ingin bergabung, ada tempat untuk berbicara; kedua, jika saya ditarik dari proyek ini, akan ada petunjuk bagi orang lain untuk mulai bekerja.
Logika cadangan pada host sepenuhnya terkandung dalam https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp , dalam fungsi yang bernama
backup
. Fungsi ini sangat sederhana: memvalidasi opsi baris perintah, mengirim perintah sebagian besar apa adanya ke adb daemon di telepon, dan menulis output telepon ke file. Bahkan tidak ada pengecekan kesalahan: jika, misalnya, Anda menolak cadangan di telepon,adb
cukup tuliskan file kosong.Di telepon, logika cadangan dimulai
service_to_fd()
di https://github.com/android/platform_system_core/blob/master/adb/services.cpp . Fungsi ini mengidentifikasi bahwa perintah dari tuan rumah adalah"backup"
, dan meneruskan perintah yang tidak diuraikan ke/system/bin/bu
, yang merupakan skrip shell sepele untuk diluncurkancom.android.commands.bu.Backup
sebagai kelas utama dari proses aplikasi Android baru. Itu panggilanServiceManager.getService("backup")
untuk mendapatkan layanan cadangan sebagaiIBackupManager
, dan panggilanIBackupManager.fullBackup()
, melewati itu deskriptor file yang masih tidak digunakan (sangat tidak langsung) terhubung kebackup.ab
file di host.Kontrol berpindah ke
fullBackup()
dalam com.android.server.backup.BackupManagerService , yang muncul pada GUI yang meminta pengguna untuk mengonfirmasi / menolak cadangan. Ketika pengguna melakukannya,acknowledgeFullBackupOrRestore()
(file yang sama) dipanggil. Jika pengguna menyetujui permintaan tersebut, mencariacknowledgeFullBackupOrRestore()
tahu apakah cadangan dienkripsi, dan meneruskan pesan keBackupHandler
(file yang sama.)BackupHandler
Kemudian instantiate dan memulaiPerformAdbBackupTask
( file yang sama, baris 4004 pada saat penulisan)Kami akhirnya mulai menghasilkan output di sana, di
PerformAdbBackupTask.run()
, antara baris 4151 dan baris 4330 .Pertama,
run()
tulis header, yang terdiri dari 4 atau 9 baris ASCII:"ANDROID BACKUP"
"4"
"0"
jika cadangan tidak terkompresi atau"1"
jika itu"none"
atau"AES-256"
"10000"
Backup data aktual berikut, baik sebagai (tergantung pada kompresi dan enkripsi)
tar
,deflate(tar)
,encrypt(tar)
, atauencrypt(deflate(tar))
.TODO : tulis jalur kode yang menghasilkan keluaran tar - Anda bisa menggunakan tar selama entri berada dalam urutan yang benar (lihat di bawah).
Format arsip tar
Data aplikasi disimpan di bawah direktori app /, dimulai dengan file _manifest, APK (jika diminta) di file a, file aplikasi di f /, database di db / dan preferensi bersama di sp /. Jika Anda meminta cadangan penyimpanan eksternal (menggunakan opsi-shared), juga akan ada direktori / shared dalam arsip yang berisi file penyimpanan eksternal.
Detail enkripsi
Contoh paket / unpack implementasi kode (menghasilkan / menggunakan) arsip tar: https://github.com/nelenkov/android-backup-extractor
Beberapa detail lebih lanjut di sini: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html
Skrip Perl untuk mengemas / membongkar dan memperbaiki arsip yang rusak:
http://forum.xda-developers.com/showthread.php?p=27840175#post27840175
sumber
Jawaban yang bagus dan terperinci dari Nikolay Elenkov . Namun saya harus menambahkan bahwa seseorang sudah mengembangkan perangkat lunak yang melakukan hal itu dan mengemasnya di sini: http://sourceforge.net/projects/adbextractor/
Paket berisi alat Java dan Perl. Saya sendiri lebih suka Perl daripada Java kapan saja, jadi saya mengekstrak kode Perl, memastikan mereka dapat dieksekusi, menginstal pustaka Perl yang diperlukan, dan menjalankan
backupdecrypt.pl
file cadangan adb, dan mengubahnya menjadi file tar atau gzipped tar tanpa isu.Saya bahkan membentuk satu liner di Bash 3 yang memungkinkan saya melakukan backup adb langsung ke file tar gzipped:
Semoga ini bisa membantu.
sumber
Untuk menjelajahi file cadangan yang ada, coba halaman http://www.adb-backup.com , mudah tanpa "dd", "tar", ...
Data tidak disimpan di server ini. Saya telah mengembangkan layanan online ini untuk membuatnya lebih mudah untuk melihat cadangan tanpa memanipulasi dengan dd / tar atau menginstal perangkat lunak tambahan. Saya penulis www.adb-backup.com
sumber