如何做換膚包

1.          如何做換膚包

1)         最簡單的方法是替換源碼中的資源,然後重新編譯

a)          舉例:修改系統公共資源——系統字體大小
修改framework/base/core/res/res/values*/style.xml其中的TexAppearanceLarge,Medium,SmalltextSize,它們分別對應大中小字的字號
修改後,在res目錄中重新編譯(使用mm命令),然後將生成的framework-res.apk拷到手機的/system/framework目錄中

b)         注意:源碼中的資源必須和設備中資源相對應,因在生成framework-res.apk的過程中生成了資源ID號,而各應用通過資源ID號讀取系統資源,所以如果ID號不一致,整個系統的資源就亂了

2)         有時候我們只想換包中的某個圖片,不想重編整個包,或者從網上下載的應用程序,得不到源碼不能重編,但也想對其換膚。
由於apkzip格式的壓縮包,最簡單的方法是解包,替換圖片,然後再打包
$ mkdir tmp; cd tmp
$ unzip ../xxx.apk
$ cp xxx.png res/drawable/    
替換圖片
$ zip -r ../xxx_new.apk *

然後安裝到系統中,或替換原有包,即可。

3)         有時會遇到圖片不能以原有方式被拉伸的問題,這是由於某些9patch格式圖片丟失了其格式信息,下面通過了解apk打包工具可以解決此問題
(
直接修改apk包和使用metaporgh皮膚的原理是一樣的)

2.          9 patch
9patch
是一種特殊的文件格式,它以”.9.png”爲擴展名,它的上下左右各有一象素留邊,用以標識圖片以何種方式拉伸,一般做圖時留邊中以黑色標識其拉伸區域,此爲顯式的9patch信息,用以方便做圖者編輯(android提供工具draw9patch來編輯9patch圖),程序打包時aapt工具把該圖留邊去掉,並將信息其寫入png文件內部,使之變爲隱顯9patch信息

3.          apk如何打包
瞭解打包的目的在於瞭解對9patch圖及其它資源的處理過程

1)         編譯某應用(以計算器爲例)
$ cd packages/apps/Calculator
$ mm showcommands

使用參數showcommands可以看到編譯用到的具體命令,其中最核心的是aapt

2)         使用aapt命令打包 (aapt源碼見framework/base/tools/aapt)
爲了解原理,我們建立一個最簡單的只含有圖片的包,用此方式,可以把圖片從顯式的9patch圖變成隱式的9patch圖,建立目錄及文件如下

$ mkdir test; cd test
$ vi AndroidManifest.xml 
編輯內容如下
<?xml version=”1.0” encoding=”utf8?>
<manifest xmlns:android=“
http://schemas.android.com/apk/res/android
      package=“com.android.test“
</manifest>
$ mkdir res/drawable -p
$ cp xxxx.png res/darwable/
$ aapt package -S res -M AndroidManifest.xml -F test.apk -f

3)         瀏覽apk包中內容
$ mkdir tmp; cd tmp
$ unzip ../test.apk
$ ls

此時看到xml文件補轉換成不可讀的了,產生了resources.arsc,其中包含資源列表(ResTable),它說明了每個資源的resourceid(不同字段標明包名類型和編號), pac, type, name, flagres中某些資源也會被打入resources.arsc中(如string

4)         res/drawable/中的圖片仍存在,如果它是9patch圖,則圖片會把顯式的9patch位置打成隱式的9patch信息

5)         想看某個apk包的內容可以編其源碼目錄中的printapk.cpp, 用於打印某包的資源信息它的編法是改Android.mk爲編printapk注意庫中要加libzipfile

4.          aapt工具
aapt
工具用於生成查看和編輯apk

1)         打包

a)          打包
$ aapt package -S res -M AndroidManifest.xml -F xxt.apk -f

2)         查看

a)          查看apk中包含哪些資源文件
$ aapt list xxx.apk

b)         查看某個xml的內容
$ aapt dump xmltree xxx.apk res/layout/main.xml
xml不能是values*中的,因爲它已被打進resources.arsc

c)          查看resources.arsc中的資源內容
$ aapt dump --values resources xxx.apk

3)         編輯
用此方法編輯與zip解壓修改再壓縮的方式不同,它會編譯xml文件和處理9patch

a)          從包中刪除某文件
$ aapt remove xxx.apk res/layout/alert_dialog.xml

b)         將某文件加入包中
$ aapt add xxx.apk res/layout/alert_dialog.xml

5.          總結
換膚時,如果想替換9patch圖,需要使用aapt或其它工具對圖進行處理,否則如果只是簡單地用zip工具解開apk包,替換一個普通圖片,再打包成apk的話,是達不到你想要的拉伸效果的,這是由於普通圖不包含9ptach信息
以上方法可以轉換9patch圖,即做好顯式的9patch圖,然後有以上方法產生隱式的9patch圖,再將它放入包中替換原有資源

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章