性能优化之APK瘦身

作者: WangGavin | 来源:发表于2017-09-10 22:20 被阅读98次

参考:

为什么瘦身?

  • 省流量
  • 给用户一个好印象

为什么APP会变胖?

  • Android系统碎片化严重,为了适配,每个APP要支持的主流dpi分类会很多,dpi越多,那么就相当于资源文件变多,也许一个图标,我们要给它对应的ldpi,mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi等都要弄一张图标文件
  • Android生态系统的不断发展成熟,出现了许多方便开发者的函数库和SDK,库或SDK引入过多,不可避免的引入很多重复功能代码和资源文件。

APK文件结构

apk解压后的目录
  • AndroidManifest.xml:系统清单文件
  • assets:存放用来需要打包到Android应用程序的静态资源文件,例如图片资源文件,json配置文件,渠道配置文件,二进制数据文件
  • classes.dex:应用程序的可执行文件,可以通过反编译工具反编译后进行查看,如果APP的方法数超过65K的限制,需要进行分包,这样就会存在多个dex文件。
  • lib:存放程序依赖的不同ABI类型的.so文件
  • res:存放应用的资源文件,包括图片资源,字符串资源,颜色资源,尺寸资源等,这些资源都会出现在资源清单文件R.java的索引中
res目录g
  • resources.arsc:资源索引表,用来描述具有ID值的资源的配置信息
  • META-INF:存放签名相关的信息,用于验证APK包的完整性以及保证系统的安全,主要包含三个文件
    • MANIFEST.MF:主要存放APK包中每个文件的名字及每个文件的SHA1哈希值
MANIFEST.MF
  • CERT.SF:通常每个APP会有一个特定的名字,例如BDMOBILE.SF,NETDISK_.SF等,它保存的是MANIFEST.MF的哈希值以及MANIFEST.MF文件中每一个哈希项的哈希值
  • CERT.RSA:保存了apk包的签名和证书的公钥信息

从中可以分析出,一个APK包中的组成中,对APK大小影响较大的文件分别是

  • Java代码文件:classs*.dex
  • Native代码文件:.so文件
  • 资源文件:包括assets文件,res目录以及resources.arsc索引文件

优化图片资源占用的空间

  • 使用一套设计图,建议取720p的资源,放到xhdpi目录
  • 使用webp格式的图片,webp支持有损与无损压缩,在既保证图片质量有要限制图片大小的需求下,webp应该是首选。
  • 有损压缩tinypng https://tinypng.com/
  • 无损压缩ImageOptim
  • 有损压缩ImageAlpha
  • 使用jpg格式,jpg将会比png的大小有显著的优势,在启动页,活动页等之类的大图展示区采用jpg将是非常明智的选择。
  • 尽量使用NinePatch格式的PNG图
  • 使用shape背景,背景或图标用代码实现,特别是在扁平化盛行的当下,很多纯色的渐变的圆角的图片都可以用shape实现,代码灵活可控,省去了大量的背景图片。
  • 使用着色方案:相信你的工程里也有很多selector文件,也有很多相似的图片只是颜色不同,通过着色方案我们能大大减轻这样的工作量,减少这样的文件。借助于android support库可实现一个全版本兼容的着色方案
  • 使用LInt删除无用资源,Proguard只会对Java代码起作用,Lint会分析res目录下面的资源文件,分析后给给出哪些资源没用,但不会分析assets目录下面的资源文件。
  • 在线加载素材,不过不是很常用

使用Android Gradle配置

  • minifyEnable:是否开启Proguard混淆,设置为true时同时设置Proguard配置文件名和规则,Proguard的作用不仅仅是混淆,它还具有压缩,优化等功能,他会遍历所有代码并找出没有引用到的代码,这些无用代码字啊生成最终的APL文件之前会被剔除掉,同时Proguard会使用简洁的字符组合替换原来的类名,属性名等,在一定程度上减少APP的大小。
  • shrinkResource:表示是否去除无用的resource文件,但是它依赖minifyEnable,需要nimifyEnabe为true时才生效
  • resConfigs 通过resConfig的取值设置要剔除的资源
defaultConfig{
  resConfigs "en" , "fr"
  resConfigs "nodpi","hdpi","xhdpi"
}

减少库的使用

  • 在工程的build.gradle文件增加ndk.abiFilters配置,指定我们需要的ABI类型,建议实际工作的配置是只保留armable、armable-x86下的so文件,算是一个折中的方案。
  • 避免重复库
  • 使用更小的库

资源混淆 方案有美团和微信两种

精简功能业务

重构和优化代码

支持插件化

把APP分割开来,实现动态加载代码

相关文章

  • apk瘦身

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

  • Android--App优化

    App的优化分为: 1. 性能优化 2. apk瘦身优化 3. 项目代码优化 ---- 1. 性能优化 a. 内存...

  • Android中关于APK瘦身的方案

    APK瘦身的价值   APK瘦身严格上来讲不算是对应用性能的优化,应该算是对应用程序体验的优化,瘦身的价值主要有一...

  • 「性能优化系列」APP内存优化理论与实践

    性能优化系列: 启动优化 内存优化 布局优化 卡顿优化 apk瘦身优化 电量优化项目地址: fuusy/F...

  • 性能优化之APK瘦身

    参考: 《Android高级进阶》第24章 [Android技术专题]APK瘦身看这一篇文章就够了 Android...

  • Android 性能优化

    app性能优化 android优化分为: 内存优化 UI优化 电量优化 apk瘦身优化 启动优化 下面通过各种百度...

  • 关于一些Android开发有用的网址 (搬砖)

    说明:本人收集代码网址只是爱好代码而已,绝无侵权之一,愿广大读友理解,谢谢 Android性能优化之APK瘦身详解...

  • 安卓中常用的一些知识功能框架

    说明:本人收集代码网址只是爱好代码而已,绝无侵权之一,愿广大读友理解,谢谢Android性能优化之APK瘦身详解(...

  • 网址(重要)

    说明:本人收集代码网址只是爱好代码而已,绝无侵权之一,愿广大读友理解,谢谢 Android性能优化之APK瘦身详解...

  • 15 性能优化-Apk瘦身-综述

    Android 性能优化-Apk瘦身(一):去除R.class[https://www.jianshu.com/p...

网友评论

    本文标题:性能优化之APK瘦身

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