美文网首页
精益求精,大厂一整套 APK 瘦身手段

精益求精,大厂一整套 APK 瘦身手段

作者: 瀚海网虫 | 来源:发表于2020-10-07 09:55 被阅读0次

1. 瘦身意义

1.1 省流量

应用商店分发时,APK 大小是选择相同类型 APP 的考量点之一

1.2 性能考虑

APK 越大,通常意味着APP 启动速度越慢,内存使用越高,消耗的手机资源也越多

2. 庖丁解牛

针对一个APK , 进行详细拆分
以应用市场下载的APP 为例,比如QQ


image.png

APK 文件本质上就是一个压缩包,可以用7z之类的解压工具打开,也可以直接拖进AS 编辑器,用AS 强大的解析功能,直接分析。

主要的组成部分:
assets : 可通过AssetManager 访问的,声明不会被压缩的资源文件
r: 一般的APK 为res 目录,腾讯是做了优化,这里不做展开。这里指的是未必编译到resources.arsc 文件的资源。
lib: native so 库目录,包含各种cpu 架构类型的so库。 例如 armeabi,armeabi-v7a, arm64-v8a 等
META-INF : Android Apk 签名校验相关的文件
classxx.dex: Dalvik 或者 ART 虚拟机所能理解的dex 文件(由class 文件编译而来)
resources.arsc : 编译后的资源文件,以二进制形式写入resources.arsc,资源的路径也会写入resources.arsc。
AndroidManifest.xml : Android APP 入口配置文件,声明四大组件等等。

3. 架构层级优化

随着app 动态化技术的不断演进,基本各个互联网大厂都推出了自己的插件化方案,通过动态下发插件的形式,可以有效的减小首发APK 大小。这里不做展开。

4. 辅助工具优化

4.1 7zip 压缩神器

解压缩界的良心,免费开源,功能强大。
主要可以通过7zip 有效的压缩 resources.arsc 文件,思路是在gradle打包流程的最后阶段(assembleRelease):解压apk,然后用7zip重新压缩,再进行对齐签名,生成新apk。
核心压缩语句:

    ProcessBuilder pb = new ProcessBuilder("7za","a","-tzip",newApkFile,path,"-mx9")
    pb.start()

4.2 使用Google最新签名方式

原来的jarsign签名,改成谷歌提供的apksigner签名,客户端大概可以减小1M。
Jarsign路径:jdk1.8.0_111/bin/jarsigner
apksigner签名路径:SDK/build-tools/24.0.3/apksigner.bat

原签名方式:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore
my-release- key.keystore my_application.apk alias_name

新的签名方式:
apksigner sign --ks keystore.jks | --key key.pk8 --cert cert.x509.pem
[signer_options] app-name.apk

注:使用apksigner, 必须先执行zipalign操作;使用jarsinger,必须先签名,然后在用zipalign(压缩对齐)优化APK

该动作,自身app上验证可节省1M 以上的大小。

5. 刀口向内 APK 自身优化

5.1 资源优化

重复资源:重复资源主要是多套图的问题,有无特别必要,综合考虑包大小及屏幕适配,可以裁剪一套图放入xhdpi下。 另外因开发人员众多,迭代周期长,部分图片可能仅仅是换了个名字,图片内容完全一致,可通过MD5 比对删除。

无用资源:可通过lint静态代码扫描,github上也有一些开源工具(不过无可避免的需要避过一些坑,如区分反射调用的资源,甚至部分通过字符串拼接方式反射调用的资源)。gradle 配置文件中,设置 shrinkResources=true

Png图片压缩:pngquat 进行PNG 图片的整体压缩,可以通过gradle 插件形式统一处理。

Webp图片格式: Google出品,WebP 的优势体现在它具有更优的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量;同时具备了无损和有损的压缩模式、Alpha 透明以及动画的特性,在 JPEG 和 PNG 上的转化效果都相当优秀、稳定和统一。

4.0之后提供webp支持,但是4.2以下不支持含有alpha通道的有损压缩和无损压缩。

优化三方库中的资源文件 :如未直接使用的大图,使用1*1的纯色图替换

大背景图处理: 预置纯色图,动态后台下载原图

Lottie动画: 帧动画等复杂动画,占用资源较多。通过Lottie动画库,可直接用json文件来描述动画,然后直接加载绘制出来。

5.2 代码优化

代码混淆 : 提高混淆率,可以有效的减小APK 大小

R 文件替换: 原理是用配置的常量值替换R.xx.xx 这种长字符串,从而移除掉非常大的诸多R.class文件

5.3 渠道包移除备用字符集等备用资源

resConfigs 'zh', 'zh_CN','zh_HK','zh_TW','zh_MO'等,按需保留即可

6 参考文献

剔除R文件:
https://github.com/meili/ThinRPlugin/blob/master/README.md
Pngquat 图片压缩:
https://pngquant.org/
Webp文件压缩:
https://developers.google.com/speed/webp/docs/cwebp
压缩代码和资源:
https://developer.android.com/studio/build/shrink-code.html

相关文章

  • 精益求精,大厂一整套 APK 瘦身手段

    1. 瘦身意义 1.1 省流量 应用商店分发时,APK 大小是选择相同类型 APP 的考量点之一 1.2 性能考虑...

  • APK瘦身 减小APP体积

    APK dex瘦身 APK res瘦身 APK减小语言包 APK 重新打包 PNG转JPG tiny处理png w...

  • Drawable 着色的后向兼容方案

    Drawable 着色的后向兼容方案(APK瘦身实践APK瘦身实践)[http://www.cnblogs.com...

  • Android性能优化

    Apk瘦身实用总结 Apk瘦身 Apk的大小对于用户是否选择下载应用起着至关重要的影响下面是对于减小Apk大小的一...

  • Android性能优化:实战讲解包体积优化(上)

    一、瘦身优化及 Apk 分析方案介绍 1、瘦身优势 我们首先来介绍下,为什么我们需要做 APK 的瘦身优化? AP...

  • app性能优化

    Android冷启动时间优化 Android开发——避免内存泄露 APK瘦身实践 APK瘦身记,如何实现高达53%...

  • apk瘦身

    Android性能优化之APK瘦身详解(瘦身73%) - 简书

  • android apk瘦身

    apk瘦身会带来哪些好处,本文就不赘述了,会依照下面的目录来对apk瘦身进行总结 目录 apk都有啥? 从资源下手...

  • Android apk瘦身实践

    写在前面 最近刚做了一波apk瘦身优化,瘦身后apk大小降低了19%左右。打铁要趁热,赶紧记录一下先。 APK A...

  • ipa和apk简易瘦身

    Material Design风格apk 瘦身ipa 瘦身 一、起因 新版本发布后发现安装包apk和ipa各增加了...

网友评论

      本文标题:精益求精,大厂一整套 APK 瘦身手段

      本文链接:https://www.haomeiwen.com/subject/ymzxpktx.html