APK减减肥之瘦成一道光

2020-04-03  本文已影响0人  卡路fly

背景

脸书的产品经理和攻城狮们曾经为了检测自家Android客户端在发展中国家的性能去了一趟非洲。在当地使用Facebook的最新版本的Android客户端,测试的结果的确让他们印象深刻,总结起来就是网络又差又贵的同时手机还坑:)

所以说,除去对性能、数据处理效率以及网络方面的优化,对于APK大小的处理也是刻不容缓的啊哈哈哈。在省流量的同时可以提升下载安装速度,最重要的是减少了占据的存贮空间。


<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_arrow_expand"
android:fromDegrees="180"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="180" />
```


apk解压之后

文件/目录 作用
Androidmanifest.xml 清单文件
assets 配置文件,放置一些本地资源,如html,可使用<code>AssetManager</code>检索
classes.dex 编译后字节码文件
lib 存放特定平台使用的编译后的.so文件,每个子文件夹对应一个特定平台
META-INF 包含<code>CERT.RSA</code>,<code>CERT.SF</code>,<code>MANIFEST.MF</code>,存放的签名信息,用于保证系统安全和APK文件完整性
res 存放没有编译到<code>resources.arsc</code>文件中的资源文件
resources.arsc 编译后的二进制资源文件。res/values/目录下所有XML内容。打包工具对XML内容进行提取,编译为二进制,并进行分类。XML内容包含不同语言的strings和styles,同时包含没有被直接打包至<code>resources.arsc</code>文件的其他文件路径,如布局文件和图片文件。

classes.dex 源码

  • 代码混淆
    • 混淆后的代码将较长的文件名、实例、变量、方法名等进行简化,实现字节长度上的优化
    • 但混淆较耗时,需找到不能混淆的代码在配置文件中注明,不方便调试
  • 开启shrinkResources去除无用资源

resources.arsc资源文件

涉及资源id,可借助Inspect Code删除不必要资源


res资源文件夹

图片、音视频、多媒体资源主要放在res和assets之下

图片:

  • 从内存占用和适配的角度考虑,尽量使用同一套图片

  • 使用tinypng(有损压缩)、pngquantImageOptimmozjpeg等图片压缩工具

  • 代码替代图片

  • 如压缩后图片质量不符合预期,可使用图片格式转换工具iSparta。PS:对于非透明的大图,jpg将会比png的大小有显著的优势.

  • 使用webp格式图片

    webp作为一种新的图片格式,支持透明度,压缩比比jpg更高但显示效果却不输于jpg,官方评测quality参数为75均衡最佳。(从Android 4.0+开始原生支持,但是不支持包含透明度,直到Android 4.2.1+才支持显示含透明度的webp。如果应用需要兼容Android 2.3,那么需要额外的引入 .so 文件,apk的体积自然也会增加……)

  • 使用.9图减少资源大小,易于长期维护

  • 引进VectorDrawable(矢量图)和svg(Scalable Vector Graphics可缩放矢量图)
    VectorDrawable的颜色是单一的颜色,如果是颜色比较复杂,那么vector很明显就不合适了。

对于图片的使用,Google的建议,简单来说就是:VD->WebP->Png->JPG

音视频:

如果raw文件夹下有音频文件,尽量不要使用无损的音频格式,比如wav。可以考虑相比于mp3同等质量但文件更小的opus音频格式

  • 无损格式:WAV,PCM,ALS,ALAC,TAK,FLAC,APE,WavPack(WV)
  • 有损格式:MP3,AAC,WMA,Ogg Vorbis
    PS: 实际开发中需要使用音频文件尽量采用 MP3、Ogg 这种有损格式,尽量不要用 WAV、PCM 这种无损音频。

assets文件夹

assets文件夹还有可能放字体文件、预置数据和web页面等

  • 使用文中提供的字体压缩工具对字体文件进行压缩FontZip

  • web页面可以使用7zip压缩工具对该文件夹进行压缩,在正式使用的时候解压

  • 尽量不要在APK中打包预置数据,做到程序和数据分离(如必须可以考虑用7z压缩工具对该文件进行压缩,在程序运行时解压)


lib库文件夹

只提供对主流架构的支持,比如arm,对于mips和x86架构可以考虑不支持,这样可以大大减小APK的体积。如果是特别大的原生库,我们还可以通过网络,从云端获取,而不直接打包在APK中。native libraries weight reduction


资源混淆方案

AndResGuard是一个帮助你缩小APK大小的工具,他的原理类似Java Proguard,但是只针对资源。他会将原本冗长的资源路径变短,例如将res/drawable/wechat变为r/d/a。

AndResGuard不涉及编译过程,只需输入一个apk(无论签名与否,debug版,release版均可,在处理过程中会直接将原签名删除),可得到一个实现资源混淆后的apk(若在配置文件中输入签名信息,可自动重签名并对齐,得到可直接发布的apk)以及对应资源ID的mapping文件。

让安装包立减1M


美团通过修改aapt来实现资源文件命名的混淆,aapt位于 /sdk/build-tools/{android_version}/ 目录。


上一篇 下一篇

猜你喜欢

热点阅读