制作android的换肤包

来源:互联网 发布:视力测试软件 编辑:程序博客网 时间:2024/05/16 10:37

 

 

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
编辑内容如下

http://schemas.android.com/apk/res/android
      package=“com.android.test“

$ 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图,再将它放入包中替换原有资源

原创粉丝点击