Most hogy leírtam a post címét már elkövettem egy hibát: aki azért tévedt ide, hogy egy átfogó tutorial-t vár minden helyzetre azt ki kell hogy ábrándítsam: velem történt egy konkrét eset a múlt héten, ami hasznos lehet mások számára is, és amelyet most részletezni fogok, hátha más is tanul belőle – de ez nem lesz gyógyír minden helyzetre. Aki mégis ilyesmire kíváncsi, annak javaslom ezen oldal meglátogatását – nekem is tudott segíteni, legalábbis egy bizonyos pontig.
De sajnos csak addig, ugyanis egy viszonylag speciális helyzetben találtam magam: múlt hét pénteken mindenféle előjel nélkül egyszercsak megdöglött a telefonom, de durván. Azt csinálta, hogy melóban még működött, rá is küldtem két szoftverfrissítést, ámde mire hazaértem már kikapcsolt állapotban halásztam elő a zsebemből. Indítottam volna el, sikeresen bootloop-ba került (azaz csak ment körbe-körbe a betöltést jelző animáció mindenféle eredmény nélkül). Tudtam, hogy erre megoldás lehet a teljes wipe/factory reset (azaz minden adat – appok, telefonszámok, SMS-ek törlése a telefonról), de aztán rádöbbentem, hogy nincs minden kontaktom szinkronizálva a Google fiókomban. Persze joggal merülhet fel a kérdés, hogy miért vagyok ilyen hülye, erre nem is nagyon tudok válaszolni – a lényeg, hogy nem engedhettem meg magamnak azt a luxust, hogy hagyom mindet veszni. Belegondolva ha mondjuk már akkor tudom, hogy mit fogok szopni ezzel lehet hogy hagytam volna elenyészni őket a /dev/null-ban…
Annyi szerencsém azért volt, hogy – mivel pár hete cseréltem SD-kártyát, és elővigyázatos próbáltam lenni – rendelkezésemre állt az app-jaimról egy viszonylag friss Titanium Backup mentés. Legalább a programokat nem kell majd újra letöltögetnem, és bekonfigolnom – gondoltam. Összegezzük a leírtakat:
- volt egy telefonom, ami el se tudott indulni
- ez egy root-olt HTC Desire, amin Cyanogenmod 7 fut(ott)
- az app-okról volt biztonsági mentésem
- a telefonszámaim nem voltak sync-elve a Google fiókomba
- az SMS-eimről sem volt backupom, de szerettem volna visszakapni őket
Ahhoz hogy az adatvesztést nullára minimalizáljam a következőkre volt szükségem:
- SD-kártya olvasó
- MiniTool Partition Wizard (csak csekkolásra, lásd lejjebb)
- UnyAffs nevű program Windows-ra (talán kiváltható Nandroid Managerrel Android-on, nem teszteltem), fórum thread-je itt
- Titanium backup nevű app Androidra
- AppExtractor nevű app Androidra
- SQLLite Manager addon Firefoxhoz
- Opcionálisan: Excel, én Google Sheets-et használtam
- CSV to vCard konverter Windows-ra
Első körben izzítottam az SD-kártya olvasót, és ránéztem Partition Wizard-dal az app-ok számára fenntartott 4-500 megás ext3 partícióra (jobb klikk -> Surface test), hogy nem-e az sérült meg, mert az is okozhat ilyen tüneteket. Sajnos vagy szerencsére (nem tudom eldönteni) mindent rendben talált. Itt kezdtem el először vakargatni a fejem: a kártyára gyanakodtam, de úgy fest hogy nem az okozta az összeomlást. De akkor mi? Spoiler: a mai napig nem tudom, és ez kicsit aggaszt. Mindenesetre a mindenható Google segítségét kértem, és szerencsére kaptam is: Clockworkmod Recovery-be be tudtam jutni (nekem HTC Desire Bravo-m van, ott hangerő le + power gomb a módszer erre – ez a Fastboot menübe visz, de ott már kiválasztható a CWM), itt csináltam a működésképtelen ROM-omról egy nandroid backup-ot (itt van róla videó, hogy hogyan kell), majd – némi tépelődés után – ment rá a wipe. Ez a következőket jelentette:
- wipe cache partition
- advanced -> wipe dalvik cache
majd legvégül:
- wipe data/factory reset
Fontosnak tartom megjegyezni, hogy a felső két wipe-ot (amelyek nem okoznak adatvesztést a telefonban) próbáltam külön is, hátha megoldanak bármit is – természetesen nem.
Ezek után fogtam az előzőleg készített nandroid backup-ot, SD-kártya olvasó segítségével letöltöttem a gépemre, majd az UnyAffs nevű csoda segítségével kiműtöttem belőle a két file-t, ami engem érdekelt. Az egyik ez volt:
A másik pedig ez:
Elvileg ezek tárolják az SMS-eket, és a kontaktokat. Később kiderült, hogy csak az egyikre lesz szükségem, és arra sem úgy, ahogy eleinte gondoltam. A tool használata egyszerű: bemásolod a nandroid backupod könyvtárába, majd kiadod a parancsot arra a .img file-ra ami tartalmazza az áhított file-jaidat. Ezután elindul a kitömörítés az adott könyvtárba. Esetemben ez így nézett ki:
unyaffs data.img
Miután ez megvolt a telefon kapott egy restart-ot, és csodák csodájára elindult, bár sem a programjaim, sem a telefonszámaim, sem az SMS-eim nem voltak rajta. Az app-ok visszaállítása gyerekjáték volt Titanium Backup-pal, az SMS-eket pedig vissza tudtam varázsolni az AppExtractor segítségével. Utóbbi annyit csinál, hogy megnézni az SD-kártyán található nandroid backup-okat, majd egyrészt kitömöríthetünk file-okat (ez az amit én az UnyAffs-sal oldottam meg), másrészt pedig könnyedén SMS-eket és kontaktokat is visszaállíthatunk belőlük. Az SMS visszaállítás simán le is ment, de a kontaktoké már kevésbé: akárhányszor próbáltam utána mindig 0 darab (pontosabban 0 darab olyan, ami a crash előtt csak a telefonon volt elmentve) figyelt a telefonkönyvemben. Később ennek is megtudtam az okát: a contacts2.db nem engedi magát csak úgy bizergálni, csak akkor maradnak meg a módosítások, ha a telefonkönyv eszközeit (például vCard file importálása) segítségével kerültek bele. Más esetekben egész egyszerűen kinullázza a file-t az első adandó alkalommal. Erre úgy sikerült rájönnöm, hogy vagy ötször próbáltam különféle módszerekkel felülírni a nandroid backupból kinyert file-lal a telefonon levőt – sikertelenül. Végül feladtam, és rájöttem hogy más módszerhez kell folyamodnom. Ekkor fordult a figyelmem a contacts2.db file felé: megtudtam például hogy ez egy SQLLite adatbázis file, amit ráadásul lehet is konvertálgatni ide-oda (például vCard formátumba is) – igaz, hogy csak Linux shell scriptek, és Python-os megoldások segítségével. Egyikhez se fűlt a fogam, ezért kínomban feltettem egy SQLLite Manager nevű addon-t a Firefoxomhoz, amellyel utána már meg tudtam nyitni az áhított .db file-t. Innen már sétagalopp volt az egész (nem): ezzel a query-vel tudtam generálni egy olyan listát belőle (az „Execute SQL query” fülön lehet beírni), amelyben név – telefonszám formátumban szerepelt minden elveszettnek hitt kontaktom:
[code]SELECT data1 AS NAME
,(
SELECT data1
FROM data dt2
INNER JOIN mimetypes ON mimetype_id = mimetypes._id
WHERE mimetype LIKE „%phone%”
AND length(data1) > 0
AND dt1.raw_contact_id = dt2.raw_contact_id
) AS Phoneno
FROM data dt1
INNER JOIN mimetypes ON mimetype_id = mimetypes._id
WHERE mimetype LIKE „%name%”
AND length(data1) > 0
ORDER BY NAME[/code]
(Ennek a tool-nak a használatáról egy nagyon egyszerű videó itt található amúgy.)
A kapott eredményt átcopy-ztam egy .txt file-ba, így kaptam egy listát, amelyben a sorok formátuma a következő volt:
„név”,”telszám”
Ezután a separator character beállítást automatikuson hagyva mehetett be a Google Sheet-be (File -> Import-tal):
Az így kapott listát (amelyben az A oszlop a név, a B meg a telefonszám) még sajnos nem eszi meg az Android – vCard formátumot (.vcf) már annál inkább. Először is elmentettem .csv formátumban így:
Ezután pedig következhetett a CSV to vCard nevű csodaprogram letöltése és telepítése. Ez képes volt megenni a .csv-met és átkonvertálni vCard-ba valahogy így:
A képen a következő látszik: először be kell neki tallózni a .csv file-t, majd a field-eket megfeleltetni a kívánt mezőtípusnak. A fenti shoton például az látszik, hogy az A oszlopban található neveket éppen megfeleltetem a „Full name”-mel, de ugyanezt el kellett játszanom a telefonszámokkal is, csak ott a „Mobile phone”-t megadva. Ezután mehet a „Convert”. A kimenetként kapott vCard file-lal még mókoltam kicsit (a shoton is látható ékezetes karakter problémával például), végül kaptam egy file-t ilyen formátumban:
[code]BEGIN:VCARD
VERSION:2.1
FN:név1
TEL;CELL;PREF:+36telefonszám1
END:VCARD
BEGIN:VCARD
VERSION:2.1
FN:név2
TEL;CELL;PREF:+36telefonszám2
END:VCARD
BEGIN:VCARD
VERSION:2.1
FN:név3
TEL;CELL;PREF:+36telefonszám3
END:VCARD[/code]
Ésígytovábbésígytovább. Ezt a file-t már csak fel kellett pakolnom az SD-kártyára, francokat, hogy megelőzzem a következő crash-nél ezt a szopást egyből töltöttem fel a Google Contacts-ba:
Amikor ezzel végeztem még toltam rá egy „Find & merge duplicates”-t is a biztonság kedvéért ugyanebből a menüből.
Tanulságos kis élmény volt, de tényleg: konzekvenciaként levonható, hogy a Google Contacts nem hülyeség. Használjátok ti is (szerk.: vagy más biztonsági mentés/sync megoldást, biztos van még ezen kívül is) vagy megismerkedhettek a SQL query-k és vCard file-ok csodálatos világával ha nem akarjátok veszni hagyni a fontos adataitokat.