制作android的换肤包
制作 android 的换肤包
#移动开发 #Android
1. 如何做换肤包
- 最简单的方法是替换源码中的资源,然后重新编译
- 举例:修改系统公共资源——系统字体大小
修改 framework/base/core/res/res/values*/style.xml 其中的 TexAppearance 的
Large,Medium,Small 的 textSize,它们分别对应大中小字的字号
修改后,在 res 目录中重新编译 (使用 mm 命令),然后将生成的
framework-res.apk 拷到手机的
/system/framework 目录中
- 注意:源码中的资源必须和设备中资源相对应,因在生成 framework-res.apk 的过程中生成了资源 ID 号,而各应用通过资源
ID 号读取系统资源,所以如果 ID 号不一致,整个系统的资源就乱了
有时候我们只想换包中的某个图片,不想重编整个包,或者从网上下载的应用程序,得不到源码不能重编,但也想对其换肤。 由于 apk 是 zip 格式的压缩包,最简单的方法是解包,替换图片,然后再打包
_ $ mkdir tmp; cd tmp
$ unzip../xxx.apk
$ cp xxx.png res/drawable/ _ _ 替换图片 _ _
$ zip -r../xxx_new.apk * _
然后安装到系统中,或替换原有包,即可。有时会遇到图片不能以原有方式被拉伸的问题,这是由于某些 9patch 格式图片丢失了其格式信息,下面通过了解 apk 打包工具可以解决此问题
(直接修改 apk 包和使用 metaporgh 皮肤的原理是一样的)
2. 9 patch
9patch 是一种特殊的文件格式,它以”.9.png”
为扩展名,它的上下左右各有一象素留边,用以标识图片以何种方式拉伸,一般做图时留边中以黑色标识其拉伸区域,此为显式的 9patch
信息,用以方便做图者编辑(android 提供工具 draw9patch 来编辑 9patch 图),程序打包时 aapt
工具把该图留边去掉,并将信息其写入 png 文件内部,使之变为隐显 9patch 信息
3. apk 如何打包
了解打包的目的在于了解对 9patch 图及其它资源的处理过程
编译某应用 (以计算器为例)
_ $ cd packages/apps/Calculator
$ mm showcommands _
使用参数 showcommands 可以看到编译用到的具体命令,其中最核心的是 aapt使用 aapt 命令打包 (aapt 源码见 framework/base/tools/aapt)
为了解原理,我们建立一个最简单的只含有图片的包,用此方式,可以把图片从显式的 9patch 图变成隐式的 9patch 图,建立目录及文件如下
_ $ mkdir test; cd test
$ vi AndroidManifest.xml _ _ 编辑内容如下 _ _
[http://schemas.android.com/apk/res/android
](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, flag,res 中某些资源也会被打入
resources.arsc 中(如 string)_
_
- res/drawable/ 中的图片仍存在,如果它是 9patch 图,则图片会把显式的 9patch 位置打成隐式的 9patch
信息
- 想看某个 apk 包的内容, 可以编其源码目录中的 printapk.cpp, 用于打印某包的资源信息, 它的编法是改
Android.mk 为编 printapk 的, 注意库中要加 libzipfile
4. aapt 工具
aapt 工具用于生成查看和编辑 apk 包
- 打包
- 打包
_ $ aapt package -S res -M AndroidManifest.xml -F xxt.apk -f _
- 查看
查看 apk 中包含哪些资源文件
_ $ aapt list xxx.apk _查看某个 xml 的内容
_ $ aapt dump xmltree xxx.apk res/layout/main.xml _
(xml 不能是 values* 中的,因为它已被打进 resources.arsc)查看 resources.arsc 中的资源内容
_ $ aapt dump --values resources xxx.apk _
- 编辑
用此方法编辑与 zip 解压修改再压缩的方式不同,它会编译 xml 文件和处理 9patch 图
从包中删除某文件
_ $ aapt remove xxx.apk res/layout/alert_dialog.xml _将某文件加入包中
_ $ aapt add xxx.apk res/layout/alert_dialog.xml _
5. 总结
换肤时,如果想替换 9patch 图,需要使用 aapt
或其它工具对图进行处理,否则如果只是简单地用 zip 工具解开 apk
包,替换一个普通图片,再打包成 apk
的话,是达不到你想要的拉伸效果的,这是由于普通图不包含 9ptach 信息
以上方法可以转换 9patch 图,即做好显式的 9patch
图,然后有以上方法产生隐式的 9patch 图,再将它放入包中替换原有资源
_