這幾天為了整個(gè)能夠精確顯示電量的電池圖標(biāo),杯具了無數(shù)次,好在Defy刷不死。
兩三天折騰下來終于基本搞定了,中間有一些小經(jīng)驗(yàn),在此記錄一下,供需要的兄弟查閱,避免杯具重演。
1. 修改10%電量顯示圖標(biāo)(其實(shí)就是修改framework-res.apk文件,替換圖片資源和編輯XML文件的方法),這個(gè)事情有很多人寫過教程了,但是很多帖子不是很全,setp-by-setp地做還是會(huì)杯具,所以在此記錄一下我自己驗(yàn)證過的做法;
2.PC端編輯img文件,畢竟PC端操作效率高些,而且直接刷一個(gè)精簡、美化完畢的img鏡像,比刷完原版鏡像再去精簡的感覺還是要好一些。
對(duì)這兩件事情沒興趣的兄弟就不用往下看了。
先說修改電量圖標(biāo):
上張改圖標(biāo)之后的截圖:
希望將來有高人能研究出不依賴其他軟件實(shí)現(xiàn)1%電量顯示的方法,從配置文件看來既然可以自定義maxLevel,應(yīng)該不可能實(shí)現(xiàn)不了1%電量顯示,不明白限制在哪里。
APK包其實(shí)是zip算法壓縮的,這點(diǎn)和JAR一樣,所以我們可以很方便地用WinRAR之類的壓縮軟件來打開APK,并且可以直接讀取里面的圖片資源。但是要實(shí)現(xiàn)10%電量顯示,光替換圖片是不夠的,還需要修改XML文件,而直接通過壓縮軟件查看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的文件夾,里面就是反編譯出來的可讀的東西。
將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)上找,去解包美化過的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ì)重新把反編譯出來的東西編譯回去。但請(qǐng)千萬注意,這個(gè)apk的包是不能替換到機(jī)器上去的,里面沒有證書信息,直接替換上去包你陷入無盡重啟的杯具。很多帖子這里都不交代清楚,我因此杯具了很多次。
用WinRAR打開frameworks-res.apk和frameworks-res.apk.zip(注意后者才是原版),將前者的stat_sys_battery.xml(兩個(gè))拖放到后者的同路徑下,并將stat_sys_battery_*.png的13個(gè)圖片文件也拖過去(圖片文件直接從外面拖進(jìn)壓縮包也行,但xml文件必須從編譯好的apk文件拖),最后很重要:把前者第一層目錄下的resources.arsc拖到后者的同路徑下覆蓋原文件,不然在手機(jī)上進(jìn)行frameworks-res.apk替換后,電池圖標(biāo)將消失不見。
總結(jié)一下:
從新打包出來的文件拖放
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)重啟(萬一沒自啟就手工重啟下),就看到新的電池圖標(biāo)了。
以上步驟請(qǐng)勿顛倒,否則容易出現(xiàn)無限重啟的杯具。
先說說img文件從何而來:
1. 高人解包sbf文件的來原版的system.img;
2. Defy Recovery軟件備份系統(tǒng)得來的img文件,一般我們要編輯的也是system.img文件。
用到的軟件是這個(gè):
過程很簡單,用YAFFS2IMG瀏覽器打開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)。
精簡系統(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格式文本的編輯器打開nandroid.md5,替換system.img項(xiàng)的md5碼,注意小寫,不然比對(duì)的時(shí)候,Defy Recovery不認(rèn)為大寫和小寫是一碼事。這里用UltraEdit等比較專業(yè)的編輯器是因?yàn)閃indows下的換行符和Linux下是不一樣的(Android源于Linux),Windows自帶的編輯器會(huì)破壞Linux換行符,但我沒有測(cè)試Defy Recovery是否支持Win的換行符。另外,UltraEdit中將大寫轉(zhuǎn)化為小寫也很方便,選中要轉(zhuǎn)換的內(nèi)容,Ctrl F5就行了。
然后用正常的方法去恢復(fù)鏡像就行了,恢復(fù)之后你會(huì)發(fā)現(xiàn)該精簡的精簡了,該替換的也替換了。不過如果因?yàn)檫^度精簡造成系統(tǒng)進(jìn)不去啥的請(qǐng)別找我,自己重新刷底包,再來過好了。
另:本文檔中提及的所有軟件都沒法提供下載(因?yàn)闆]有空間,網(wǎng)盤又只能是臨時(shí)的),請(qǐng)需要的兄弟自行使用萬能的google查找。
搞完收工,謝謝觀賞。
現(xiàn)在的效果是可以顯示13檔電量,分別為:
0 5% 10% 15% 20% 30% 40% 50% 60% 70% 80% 90% 100%
本來想做到1%精度的,無奈經(jīng)過簡單測(cè)試以及查閱資料,發(fā)現(xiàn)Defy最多就只能支持到這13檔。
但比原生的7檔還是要精確一些的,有原XML配置文件為證: