這幾天為了整個(gè)能夠精確顯示電量的電池圖標(biāo),杯具了無(wú)數(shù)次,好在Defy刷不死。
兩三天折騰下來(lái)終于基本搞定了,中間有一些小經(jīng)驗(yàn),在此記錄一下,供需要的兄弟查閱,避免杯具重演。
1. 修改10%電量顯示圖標(biāo)(其實(shí)就是修改framework-res.apk文件,替換圖片資源和編輯XML文件的方法),這個(gè)事情有很多人寫(xiě)過(guò)教程了,但是很多帖子不是很全,setp-by-setp地做還是會(huì)杯具,所以在此記錄一下我自己驗(yàn)證過(guò)的做法;
2.PC端編輯img文件,畢竟PC端操作效率高些,而且直接刷一個(gè)精簡(jiǎn)、美化完畢的img鏡像,比刷完原版鏡像再去精簡(jiǎn)的感覺(jué)還是要好一些。
對(duì)這兩件事情沒(méi)興趣的兄弟就不用往下看了。
先說(shuō)修改電量圖標(biāo):
上張改圖標(biāo)之后的截圖:
希望將來(lái)有高人能研究出不依賴其他軟件實(shí)現(xiàn)1%電量顯示的方法,從配置文件看來(lái)既然可以自定義maxLevel,應(yīng)該不可能實(shí)現(xiàn)不了1%電量顯示,不明白限制在哪里。
APK包其實(shí)是zip算法壓縮的,這點(diǎn)和JAR一樣,所以我們可以很方便地用WinRAR之類的壓縮軟件來(lái)打開(kāi)APK,并且可以直接讀取里面的圖片資源。但是要實(shí)現(xiàn)10%電量顯示,光替換圖片是不夠的,還需要修改XML文件,而直接通過(guò)壓縮軟件查看XML文件,發(fā)現(xiàn)不是ASCII文件,不能直接編輯,所以第一步是要反編譯APK文件。
這里需要用到apktool,請(qǐng)需要的兄弟自行g(shù)oogle,apktool運(yùn)行需要JRE,不明白什么是JRE的兄弟也請(qǐng)自行g(shù)oogle,然后去Oracle網(wǎng)站下載安裝。
將原機(jī)的framework-res.apk拷貝到apktool目錄下,命令行執(zhí)行:
apktool.bat d framework-res.apk
在apktool目錄下生成了一個(gè)叫做framework-res的文件夾,里面就是反編譯出來(lái)的可讀的東西。
將framework-res.apk重命名為framework-res.apk.zip,等下會(huì)用到。
stat_sys_battery.xml文件就是控制特定電量下調(diào)用特定圖標(biāo)的文件了,一共兩個(gè),一個(gè)在framework-res\res\drawable,一個(gè)在framework-res\res\drawable-hdpi,不知道真正起作用的是哪個(gè),反正我兩個(gè)都編輯了。編輯結(jié)果如下:
紅色部分的maxLevel是指,電量下降到這個(gè)百分比的時(shí)候,去調(diào)用前面的這個(gè)圖標(biāo)文件。
圖標(biāo)文件是png格式的,大家可以自己去網(wǎng)上找,去解包美化過(guò)的frameworks-res.apk也行,反正stat_sys_battery_0、5、10、15、20、30、40、50、60、70、80、90、100都要有,放在framework-res\res\drawable-hdpi下面就行了。
然后重新用apktool打包,命令如下:
apktool b frameworks-res frameworks-res.apk
apktool就會(huì)重新把反編譯出來(lái)的東西編譯回去。但請(qǐng)千萬(wàn)注意,這個(gè)apk的包是不能替換到機(jī)器上去的,里面沒(méi)有證書(shū)信息,直接替換上去包你陷入無(wú)盡重啟的杯具。很多帖子這里都不交代清楚,我因此杯具了很多次。
用WinRAR打開(kāi)frameworks-res.apk和frameworks-res.apk.zip(注意后者才是原版),將前者的stat_sys_battery.xml(兩個(gè))拖放到后者的同路徑下,并將stat_sys_battery_*.png的13個(gè)圖片文件也拖過(guò)去(圖片文件直接從外面拖進(jìn)壓縮包也行,但xml文件必須從編譯好的apk文件拖),最后很重要:把前者第一層目錄下的resources.arsc拖到后者的同路徑下覆蓋原文件,不然在手機(jī)上進(jìn)行frameworks-res.apk替換后,電池圖標(biāo)將消失不見(jiàn)。
總結(jié)一下:
從新打包出來(lái)的文件拖放
res/drawable/stat_sys_battery.xml
res/drawable-hdpi/stat_sys_battery.xml
res/drawable-hdpi/stat_sys_battery_*.png
resources.arsc
到原apk文件的相同路徑下即可。
然后把framework-res.apk.zip傳到SD卡上,重命名回framework-res.apk;
用RE管理器將framework-res.apk復(fù)制到/system,更改權(quán)限為0777或至少0644(重要);
然后把更改好權(quán)限的文件剪切到/system/framework,覆蓋原文件;
手機(jī)自動(dòng)重啟(萬(wàn)一沒(méi)自啟就手工重啟下),就看到新的電池圖標(biāo)了。
以上步驟請(qǐng)勿顛倒,否則容易出現(xiàn)無(wú)限重啟的杯具。
先說(shuō)說(shuō)img文件從何而來(lái):
1. 高人解包sbf文件的來(lái)原版的system.img;
2. Defy Recovery軟件備份系統(tǒng)得來(lái)的img文件,一般我們要編輯的也是system.img文件。
用到的軟件是這個(gè):
過(guò)程很簡(jiǎn)單,用YAFFS2IMG瀏覽器打開(kāi)system.img文件,該刪的刪,該替換的替換,當(dāng)然這東西還有個(gè)很重要的用處:刪錯(cuò)了什么系統(tǒng)服務(wù)需要恢復(fù)apk包的話,可用這種方法到img文件里頭提取。
新替換進(jìn)去的文件注意要修改一下權(quán)限,右鍵需要改權(quán)限的文件,選“權(quán)限”即可:
參考其他文件的權(quán)限,有些鏡像里頭是0644的,有些是0777的,其實(shí)兩種都行,主要是給所有用戶讀權(quán)限,但跟其他文件改成一樣的心里舒服點(diǎn)。
精簡(jiǎn)系統(tǒng)服務(wù)、替換字體、替換frmaeworks-res.apk都可以在這里面完成。完成之后點(diǎn)擊“整理另存”,生成新的鏡像,存的時(shí)候接受默認(rèn)設(shè)置即可,如圖:
下面有一點(diǎn)很重要,用新生成文件替換原system.img文件后,需要編輯與之同一路徑的nandroid.md5文件。該文件記錄了每個(gè)img文件的md5碼,不修改的話,Defy Recovery恢復(fù)的時(shí)候會(huì)md5 checksum error,恢復(fù)不了。
用WinMD5、Hash之類的軟件得到新生成的system.img文件的md5碼,然后用UltraEdit之類的支持Linux格式文本的編輯器打開(kāi)nandroid.md5,替換system.img項(xiàng)的md5碼,注意小寫(xiě),不然比對(duì)的時(shí)候,Defy Recovery不認(rèn)為大寫(xiě)和小寫(xiě)是一碼事。這里用UltraEdit等比較專業(yè)的編輯器是因?yàn)閃indows下的換行符和Linux下是不一樣的(Android源于Linux),Windows自帶的編輯器會(huì)破壞Linux換行符,但我沒(méi)有測(cè)試Defy Recovery是否支持Win的換行符。另外,UltraEdit中將大寫(xiě)轉(zhuǎn)化為小寫(xiě)也很方便,選中要轉(zhuǎn)換的內(nèi)容,Ctrl F5就行了。
然后用正常的方法去恢復(fù)鏡像就行了,恢復(fù)之后你會(huì)發(fā)現(xiàn)該精簡(jiǎn)的精簡(jiǎn)了,該替換的也替換了。不過(guò)如果因?yàn)檫^(guò)度精簡(jiǎn)造成系統(tǒng)進(jìn)不去啥的請(qǐng)別找我,自己重新刷底包,再來(lái)過(guò)好了。
另:本文檔中提及的所有軟件都沒(méi)法提供下載(因?yàn)闆](méi)有空間,網(wǎng)盤(pán)又只能是臨時(shí)的),請(qǐng)需要的兄弟自行使用萬(wàn)能的google查找。
搞完收工,謝謝觀賞。
現(xiàn)在的效果是可以顯示13檔電量,分別為:
0 5% 10% 15% 20% 30% 40% 50% 60% 70% 80% 90% 100%
本來(lái)想做到1%精度的,無(wú)奈經(jīng)過(guò)簡(jiǎn)單測(cè)試以及查閱資料,發(fā)現(xiàn)Defy最多就只能支持到這13檔。
但比原生的7檔還是要精確一些的,有原XML配置文件為證: