我一直用魅族的機(jī)器,并不是因?yàn)樗阅芎没蛘卟僮骱茫茸宓臋C(jī)器不便宜,但其實(shí)硬件一般般,因此性能也很一般。而且我從未對任何事情狂熱過,因此更不可能是什么“煤油”、“魅粉”。魅族手機(jī)吸引我的最大原因在于他系統(tǒng)里自帶了root功能。這很重要,我只使用安卓手機(jī),并且每一臺(tái)安卓手機(jī)都要root。如果系統(tǒng)不攜帶root功能,我就只能求助于第三方工具,這等于在自己的機(jī)器里面安裝了一個(gè)病毒,它具備比我自己還高的權(quán)限,隨時(shí)可以做任何事情,是可忍孰不可忍!
不過魅族在flyme 7之后雖然繼續(xù)給用戶root權(quán)限,但是root以后它的系統(tǒng)升級(jí)app就不給我升級(jí)系統(tǒng)了。這在以前我還可以通過手動(dòng)進(jìn)入recovery模式升級(jí),沒有什么別的問題,但到了16s的機(jī)器上,再用recovery模式升級(jí)固件,就會(huì)提示我必須清空app數(shù)據(jù)。這就把我擋在門外了,因?yàn)榫退阄易隽藗浞荩墒沁€有一些別的設(shè)置需要重新配置,挺煩的。但老的系統(tǒng)確實(shí)有各種問題(小廠就是小廠),所以中秋前的那個(gè)晚上我終于手癢,就升級(jí)了一次,結(jié)果出現(xiàn)了大問題!雖然我原來做了備份,但是升級(jí)好固件以后,系統(tǒng)居然不給我恢復(fù)app數(shù)據(jù)!
當(dāng)時(shí)我真是嚇到了,因?yàn)槲业奈⑿帕奶煊涗浺呀?jīng)持續(xù)了好多年,突然不給我恢復(fù)記錄,之前的東西就全沒有了!慌亂之中我想起之前換16s的時(shí)候,在家里的電腦里還備份了當(dāng)時(shí)的聊天記錄,于是先不管那么多,還原了微信的記錄再說:截止到5月28日,算是救回來了,但是當(dāng)天是9月12日,所以我其實(shí)丟了3個(gè)多月的數(shù)據(jù)。
挽救了微信數(shù)據(jù)之后,我開始思考用不同的打開方式,基于魅族自己的還原工具還原app,無果。最后想到,ES文件管理器不是可以備份和還原App嗎?我第一次使用這種功能是在一個(gè)叫做“鈦備份”的工具上,這個(gè)工具可以備份、還原和凍結(jié)app,一度我十分喜歡。但由于要破解,所以凍結(jié)這個(gè)功能我自己做了;備份還原因?yàn)楸容^復(fù)雜,但是ES文件管理器也有,所以我放棄了鈦備份。再后來,魅族系統(tǒng)自帶了備份還原功能,我就連ES的對應(yīng)功能也幾乎忘記了。不料如今還能江湖救急,感謝ES文件管理器團(tuán)隊(duì)!
說干就干,我解壓了魅族的備份壓縮包,拿萬科的“住這兒”試了一下,居然成功了還原出來!于是全部解壓,并都做了還原。一個(gè)一個(gè)還原是很麻煩的,而且還有一些在還原過程中崩掉了(后來才知道是ES的zip解壓插件有bug),因此當(dāng)時(shí)至少有firefox、百度地圖、outlook、qq和微信是不能恢復(fù)的。前面幾個(gè)都還好,就算是qq,本來我基本上也不使用了,所以還原不了就還原不了吧??墒呛髞戆l(fā)現(xiàn)新版本的qq,進(jìn)去后就只剩下一個(gè)“我的其他QQ賬戶”,要等很久才能顯示“群助手”和里面的新消息。如今的qq于我而言就是一個(gè)潛水盜圖的工具。早年我加入了一些動(dòng)漫群,現(xiàn)在只剩這些群還很活躍,每天都有好玩的圖片和視頻看(都很健康,勿憂),所以我經(jīng)常在里面偷一些圖片轉(zhuǎn)發(fā)到微信群。
消息丟就丟吧,但因此導(dǎo)致界面很難看,就是另一回事了。于是我想,恐怕是到了要自己動(dòng)手的時(shí)候了。便拿起手機(jī)(就是被重置了的那臺(tái))搜了一下“鈦備份實(shí)現(xiàn)原理”。出來的文章挺多,但講得好的只有一個(gè)貼吧里的文章。當(dāng)時(shí)我正陪著家人在烏鎮(zhèn)閑逛,沒時(shí)間嘗試,只得保存下來,回到上海再測試,于是今晚在公司加班的時(shí)候,就做了下試驗(yàn)。運(yùn)氣很好,游族的IM程序游信一試便靈!接著又試了下手機(jī)qq,雖然遇到了些挫折,發(fā)現(xiàn)了前文提到的ES文件管理器解壓插件的bug,不過導(dǎo)出數(shù)據(jù)文件到ubuntu上解壓又轉(zhuǎn)了tar,其它的操作就基本上一模一樣地成功了。于是我決定做3件事情:
第一,明早把微信也給還原了。比起丟了3個(gè)多月的聊天記錄,丟掉中秋這幾天的數(shù)據(jù)讓人好受一些。至于微信自己的備份還原功能具不具備“合并聊天記錄”,再說吧!
第二,寫一篇文,把備份還原的步驟寫出來。不一定是為了給別人看,甚至不是為了給自己看,純粹是為了紀(jì)念這個(gè)激動(dòng)人心的事情。
最后,基于這些步驟做一個(gè)可以批量完成備份還原功能的app。這很重要,我知道root的機(jī)器不多,root后刷了固件就不能還原的機(jī)器估計(jì)就是魅族最近的幾個(gè)機(jī)型,所以受害者更少。但我并不是為了別人,僅僅是想讓自己下次刷新固件的時(shí)候不至于這么慘。所以這個(gè)工具必須做出來!
在羅列備份還原的步驟之前,我需要先做兩個(gè)假設(shè):假定閱讀這篇文的人是安卓程序員,并且他手頭上已經(jīng)有了一臺(tái)root掉的機(jī)器,因?yàn)橄旅娴拿疃际遣籸oot無法執(zhí)行的adb命令。那么現(xiàn)在,請將手機(jī)連接電腦,打開終端或命令行,執(zhí)行adb shell,并通過su獲取root權(quán)限。
在刷固件之前需要先備份app的數(shù)據(jù):
am force-stop $PKG
tar -cvf /sdcard/backups/$PKG.tar /data/data/$PKG --exclude data/data/$PKG/lib --exclude data/data/$PKG/cache
上面的“$PKG”是打算備份的app的包名。這兩行命令的意思是:強(qiáng)殺指定app的進(jìn)程,然后把a(bǔ)pp的沙箱打成tar包放到SD卡的backups目錄下。這個(gè)應(yīng)該很好理解,畢竟在app運(yùn)行的時(shí)候去備份數(shù)據(jù),很可能導(dǎo)致還原的時(shí)候出現(xiàn)問題。
接著你可以刷機(jī)了。為了做實(shí)驗(yàn),你可以嘗試先刪除指定的app,然后再安裝。由于在安卓系統(tǒng)上,每一個(gè)app都是一個(gè)單獨(dú)的用戶空間,所以還原文件之后,需要讓這些文件屬于新的所有者。為此,可以在安裝后list一下這個(gè)app的新沙箱,找到新用戶組的ID:
ls -la /data/data/$PKG
因?yàn)槭切掳惭b的app,這個(gè)目錄下的文件會(huì)很少,不過沒關(guān)系,它們都屬于同一個(gè)“u0aXXX”的用戶和分組,記錄下來,后面有用。
接著可以選擇刪除這個(gè)沙箱目錄,或者重命名一下備份,我選擇了重命名:
mv /data/data/$PKG /data/data/.$PKG
因?yàn)橛衦oot權(quán)限,所以可以在/data/data下創(chuàng)建文件,但不論移動(dòng)在哪里,不建議移動(dòng)到sd卡,我擔(dān)心由于文件系統(tǒng)不一樣,沙箱文件移動(dòng)后,文件屬性中的所有者和訪問權(quán)限信息會(huì)丟失。
總之,現(xiàn)在你有一個(gè)“赤裸”的app環(huán)境了,將tar包還原回去吧:
tar -xvf /sdcard/backups/$PKG.tar -C /
請注意,這個(gè)命令把解壓目錄指定為根目錄,但是不用擔(dān)心,因?yàn)閠ar包剛好也是從根目錄開始打的,所以實(shí)際效果只是在/data/data下創(chuàng)建一個(gè)目錄而已。
第五步,修改文件用戶組和訪問權(quán)限:
chown -hR 10XXX:10XXX /data/data/$PKG
chmod -R u+rwx /data/data/$PKG
命令行中的“10XXX”來自前文提到的新安裝app的用戶組ID“u0aXXX”。
百度貼吧的人說,安卓5以前,完成上面的步驟就可以打開app試試看還原是否成功了,但安卓5以后還需要執(zhí)行多一個(gè)命令,重置SELinux的文件權(quán)限配置:
restorecon -R /data/data/$PKG
完成這個(gè)后,就真的可以打開app看還原效果了。一般來說沒啥問題,但如果很不幸你發(fā)現(xiàn)效果不對,可以試著再重復(fù)上面的步驟。不過說實(shí)在的,我也不知道如果真的不能還原數(shù)據(jù),還能怎么優(yōu)化。
最后的最后,別忘了刪除之前還備份在/data/data下的沙箱目錄:
rm -r /data/data/.$PKG
總的來說,這套備份還原操作的重點(diǎn)在于權(quán)限修改,所以ES文件管理器其實(shí)不是打tar包,而是直接打成zip包,盡管這樣子文件屬性中的所有者和訪問權(quán)限信息都會(huì)丟失。并且只要給了root權(quán)限,ES還能直接從魅族的備份工具打包出來的zip文件中還原出正確的app數(shù)據(jù)。唯一的缺陷就是zip文件的解壓速度很慢,并且ES的解壓插件有bug,zip文件大了就直接崩潰——真是誰寫的代碼呀!
寫在最后
寫完這篇文以后,我簡單做了個(gè)app,并把源碼發(fā)布到github,地址在這里:https://github.com/alexyuyxj/BackupRecover