意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

制作android的换肤包

来源:恒创科技 编辑:恒创科技编辑部
2022-09-16 06:04:00


1. 如何做换肤包


制作android的换肤包

1) 最简单的方法是替换源码中的资源,然后重新编译

a) 举例:修改系统公共资源——系统字体大小
修改framework/base/core/res/res/values*/style.xml其中的TexAppearance的Large,Medium,Small的textSize,它们分别对应大中小字的字号
修改后,在res目录中重新编译(使用mm命令),然后将生成的framework-res.apk拷到手机的/system/framework目录中

b) 注意:源码中的资源必须和设备中资源相对应,因在生成framework-res.apk的过程中生成了资源ID号,而各应用通过资源ID号读取系统资源,所以如果ID号不一致,整个系统的资源就乱了

2) 有时候我们只想换包中的某个图片,不想重编整个包,或者从网上下载的应用程序,得不到源码不能重编,但也想对其换肤。
由于apk是zip格式的压缩包,最简单的方法是解包,替换图片,然后再打包
$ 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, flag,res中某些资源也会被打入resources.arsc中(如string)

4) res/drawable/中的图片仍存在,如果它是9patch图,则图片会把显式的9patch位置打成隐式的9patch信息5) 想看某个apk包的内容, 可以编其源码目录中的printapk.cpp, 用于打印某包的资源信息, 它的编法是改Android.mk为编printapk的, 注意库中要加libzipfile4. aapt工具
aapt工具用于生成查看和编辑apk包1) 打包a) 打包
$ aapt package -S res -M AndroidManifest.xml -F xxt.apk -f2) 查看a) 查看apk中包含哪些资源文件
$ aapt list xxx.apkb) 查看某个xml的内容
$ aapt dump xmltree xxx.apk res/layout/main.xml
(xml不能是values*中的,因为它已被打进resources.arsc)c) 查看resources.arsc中的资源内容
$ aapt dump --values resources xxx.apk3) 编辑
用此方法编辑与zip解压修改再压缩的方式不同,它会编译xml文件和处理9patch图a) 从包中删除某文件
$ aapt remove xxx.apk res/layout/alert_dialog.xmlb) 将某文件加入包中
$ aapt add xxx.apk res/layout/alert_dialog.xml5. 总结
换肤时,如果想替换9patch图,需要使用aapt或其它工具对图进行处理,否则如果只是简单地用zip工具解开apk包,替换一个普通图片,再打包成apk的话,是达不到你想要的拉伸效果的,这是由于普通图不包含9ptach信息
以上方法可以转换9patch图,即做好显式的9patch图,然后有以上方法产生隐式的9patch图,再将它放入包中替换原有资源

上一篇: 租用美国服务器:潜在的风险与应对策略。 下一篇: MongoDB 5.0 扩展开源文档数据库操作