制作 android 的换肤包

#移动开发 #Android

1. 如何做换肤包

  1. 最简单的方法是替换源码中的资源,然后重新编译
  1. 举例:修改系统公共资源——系统字体大小
    修改 framework/base/core/res/res/values*/style.xml 其中的 TexAppearance 的

Large,Medium,Small 的 textSize,它们分别对应大中小字的字号
修改后,在 res 目录中重新编译 (使用 mm 命令),然后将生成的 framework-res.apk 拷到手机的

/system/framework 目录中

  1. 注意:源码中的资源必须和设备中资源相对应,因在生成 framework-res.apk 的过程中生成了资源 ID 号,而各应用通过资源

ID 号读取系统资源,所以如果 ID 号不一致,整个系统的资源就乱了

  1. 有时候我们只想换包中的某个图片,不想重编整个包,或者从网上下载的应用程序,得不到源码不能重编,但也想对其换肤。 由于 apk 是 zip 格式的压缩包,最简单的方法是解包,替换图片,然后再打包
    _ $ mkdir tmp; cd tmp
    $ unzip../xxx.apk
    $ cp xxx.png res/drawable/ _ _ 替换图片 _ _
    $ zip -r../xxx_new.apk * _
    然后安装到系统中,或替换原有包,即可。

  2. 有时会遇到图片不能以原有方式被拉伸的问题,这是由于某些 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

](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)_

_

  1. res/drawable/ 中的图片仍存在,如果它是 9patch 图,则图片会把显式的 9patch 位置打成隐式的 9patch

信息

  1. 想看某个 apk 包的内容, 可以编其源码目录中的 printapk.cpp, 用于打印某包的资源信息, 它的编法是改

Android.mk 为编 printapk 的, 注意库中要加 libzipfile

4. aapt 工具
aapt 工具用于生成查看和编辑 apk 包

  1. 打包
  1. 打包
    _ $ aapt package -S res -M AndroidManifest.xml -F xxt.apk -f _
  1. 查看
  1. 查看 apk 中包含哪些资源文件
    _ $ aapt list xxx.apk _

  2. 查看某个 xml 的内容
    _ $ aapt dump xmltree xxx.apk res/layout/main.xml _
    (xml 不能是 values* 中的,因为它已被打进 resources.arsc)

  3. 查看 resources.arsc 中的资源内容
    _ $ aapt dump --values resources xxx.apk _

  1. 编辑
    用此方法编辑与 zip 解压修改再压缩的方式不同,它会编译 xml 文件和处理 9patch 图
  1. 从包中删除某文件
    _ $ aapt remove xxx.apk res/layout/alert_dialog.xml _

  2. 将某文件加入包中
    _ $ aapt add xxx.apk res/layout/alert_dialog.xml _

5. 总结
换肤时,如果想替换 9patch 图,需要使用 aapt 或其它工具对图进行处理,否则如果只是简单地用 zip 工具解开 apk

包,替换一个普通图片,再打包成 apk 的话,是达不到你想要的拉伸效果的,这是由于普通图不包含 9ptach 信息
以上方法可以转换 9patch 图,即做好显式的 9patch 图,然后有以上方法产生隐式的 9patch 图,再将它放入包中替换原有资源

_