मैंने इस पर काम करना शुरू कर दिया। मैं अपने परिणामों को यहां दो कारणों से "समुदाय विकि" उत्तर के रूप में पोस्ट कर रहा हूं: पहला, यदि कोई और व्यक्ति इसमें शामिल होना चाहता है, तो बात करने के लिए एक जगह है; दूसरा, अगर मैं इस परियोजना से दूर हो जाता हूं, तो किसी और के लिए काम शुरू करने के संकेत मिलेंगे।
होस्ट पर बैकअप लॉजिक पूरी तरह से https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp नाम के फ़ंक्शन में निहित है backup
। फ़ंक्शन बहुत सरल है: यह कमांड लाइन विकल्पों को मान्य करता है, कमांड को ज्यादातर फोन पर एडीबी डेमन को भेजता है, और फोन के आउटपुट को फाइल पर लिखता है। यहां तक कि त्रुटि-जाँच भी नहीं है: यदि, उदाहरण के लिए, आप फोन पर बैकअप से इनकार करते adb
हैं , तो बस एक खाली फ़ाइल लिखता है।
फोन पर, बैकअप तर्क https://github.com/android/platform_system_core/blob/master/adb/services.cppservice_to_fd()
में शुरू होता है । फ़ंक्शन यह पहचानता है कि होस्ट से कमांड है , और अनपर्सड कमांड को पास करता है , जो कि एक नई एंड्रॉइड ऐप प्रक्रिया के मुख्य-वर्ग के रूप में लॉन्च करने के लिए एक तुच्छ शेल स्क्रिप्ट है । वह कॉल को बैकअप सेवा के रूप में प्राप्त करता है , और कॉल करता है , इसे अभी भी अप्रयुक्त फ़ाइल डिस्क्रिप्टर (बहुत अप्रत्यक्ष रूप से) होस्ट पर फ़ाइल से जुड़ा हुआ है ।"backup"
/system/bin/bu
com.android.commands.bu.Backup
ServiceManager.getService("backup")
IBackupManager
IBackupManager.fullBackup()
backup.ab
Com.android.server.backup.BackupManagerServicefullBackup()
में नियंत्रण पास होता है , जो GUI को पॉपअप करता है जो उपयोगकर्ता को बैकअप की पुष्टि / अस्वीकार करने के लिए कहता है। जब उपयोगकर्ता ऐसा करता है, acknowledgeFullBackupOrRestore()
(उसी फ़ाइल को) कहा जाता है। यदि उपयोगकर्ता ने अनुरोध को मंजूरी दे दी है, acknowledgeFullBackupOrRestore()
यदि बैकअप एन्क्रिप्ट किया गया है, तो आंकड़े बताए जाते हैं और BackupHandler
(उसी फ़ाइल पर) संदेश BackupHandler
भेजते हैं, फिर एक ही समय में एक ही फ़ाइलPerformAdbBackupTask
( 400 फ़ाइल, लाइन 4004 ) को बंद कर देते हैं और लिखते हैं)
हम अंत में PerformAdbBackupTask.run()
लाइन 4151 और लाइन 4330 के बीच, वहां आउटपुट जेनरेट करना शुरू करते हैं ।
सबसे पहले, run()
एक हेडर लिखता है, जिसमें 4 या 9 ASCII लाइनें होती हैं:
"ANDROID BACKUP"
- बैकअप प्रारूप संस्करण: वर्तमान में
"4"
- या
"0"
तो बैकअप असम्पीडित है या "1"
यदि यह है
- एन्क्रिप्शन विधि: वर्तमान में या तो
"none"
या"AES-256"
- (यदि एन्क्रिप्ट किया गया है), "उपयोगकर्ता पासवर्ड नमक" हेक्स में एन्कोडेड है, सभी कैप्स
- (यदि एन्क्रिप्ट किया गया है), "मास्टर कुंजी चेकसम नमक" हेक्स में एन्कोडेड है, सभी कैप
- (यदि एन्क्रिप्ट किया गया है), "पीकेकेडीएफ 2 राउंड की संख्या" का उपयोग दशमलव संख्या के रूप में किया जाता है: वर्तमान में
"10000"
- (अगर एन्क्रिप्ट किया गया है), "उपयोगकर्ता कुंजी का IV" हेक्स में एन्कोडेड है, सभी कैप्स
- (यदि एन्क्रिप्ट किया गया है), "मास्टर IV + कुंजी बूँद, उपयोगकर्ता कुंजी द्वारा एन्क्रिप्ट किया गया" हेक्स में एन्कोडेड, सभी कैप्स
वास्तविक बैकअप डेटा के रूप में (संपीड़न और एन्क्रिप्शन के आधार पर), इस प्रकार या तो tar
, deflate(tar)
, encrypt(tar)
, या encrypt(deflate(tar))
।
TODO : वह कोड पथ लिखें जो टार आउटपुट उत्पन्न करता है - आप केवल टार का उपयोग कर सकते हैं जब तक कि प्रविष्टियाँ उचित क्रम में हैं (नीचे देखें)।
टार संग्रह प्रारूप
ऐप डेटा को ऐप / निर्देशिका के तहत संग्रहीत किया जाता है, एक _manifest फ़ाइल, एपीके (यदि अनुरोध किया गया है) के साथ शुरू होता है, / में ऐप फाइलें, डीबी में डेटाबेस / और / में साझा प्राथमिकताएं। यदि आपने बाह्य संग्रहण बैकअप (-sared विकल्प का उपयोग करके) का अनुरोध किया है, तो संग्रह में एक साझा / निर्देशिका भी होगी जिसमें बाह्य संग्रहण फ़ाइलें होंगी।
$ tar tvf mybackup.tar
-rw------- 1000/1000 1019 2012-06-04 16:44 apps/org.myapp/_manifest
-rw-r--r-- 1000/1000 1412208 2012-06-02 23:53 apps/org.myapp/a/org.myapp-1.apk
-rw-rw---- 10091/10091 231 2012-06-02 23:41 apps/org.myapp/f/share_history.xml
-rw-rw---- 10091/10091 0 2012-06-02 23:41 apps/org.myapp/db/myapp.db-journal
-rw-rw---- 10091/10091 5120 2012-06-02 23:41 apps/org.myapp/db/myapp.db
-rw-rw---- 10091/10091 1110 2012-06-03 01:29 apps/org.myapp/sp/org.myapp_preferences.xml
एन्क्रिप्शन विवरण
- एक एईएस 256 कुंजी बैकअप एन्क्रिप्शन पासवर्ड से उत्पन्न होती है जो पीबीकेडीएफ 2 के 10000 राउंड का उपयोग करके यादृच्छिक रूप से उत्पन्न 512 बिट नमक के साथ होता है।
- एईएस 256 मास्टर कुंजी यादृच्छिक रूप से उत्पन्न होती है
- एक मास्टर कुंजी 'चेकसम' को PBKDF2 के 10000 राउंड के माध्यम से मास्टर कुंजी को चलाकर एक नया बेतरतीब ढंग से उत्पन्न 512% नमक के साथ बनाया जाता है।
- एक यादृच्छिक बैकअप एन्क्रिप्शन IV उत्पन्न होता है।
- IV, मास्टर कुंजी, और चेकसम को 1. में व्युत्पन्न कुंजी के साथ समाहित और एन्क्रिप्ट किया गया है। परिणामी बूँद को हेक्स स्ट्रिंग के रूप में हेडर में सहेजा जाता है।
- वास्तविक बैकअप डेटा मास्टर कुंजी के साथ एन्क्रिप्ट किया गया है और फ़ाइल के अंत में संलग्न है।
नमूना पैक / अनपैक कोड कार्यान्वयन (निर्माण / उपयोग करता है) टार अभिलेखागार: https://github.com/nelenkov/android-backup-extractor
कुछ और विवरण यहां: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html
पैकिंग / अनपैकिंग और टूटे हुए अभिलेखों को ठीक करने के लिए पर्ल स्क्रिप्ट:
http://forum.xda-developers.com/showthread.php?p=27840175#post27840175