性能优化之APK瘦身

参考:

为什么瘦身?

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

为什么APP会变胖?

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

APK文件结构

《性能优化之APK瘦身》 apk解压后的目录

  • AndroidManifest.xml:系统清单文件
  • assets:存放用来需要打包到Android应用程序的静态资源文件,例如图片资源文件,json配置文件,渠道配置文件,二进制数据文件
  • classes.dex:应用程序的可执行文件,可以通过反编译工具反编译后进行查看,如果APP的方法数超过65K的限制,需要进行分包,这样就会存在多个dex文件。
  • lib:存放程序依赖的不同ABI类型的.so文件
  • res:存放应用的资源文件,包括图片资源,字符串资源,颜色资源,尺寸资源等,这些资源都会出现在资源清单文件R.java的索引中

《性能优化之APK瘦身》 res目录g

  • resources.arsc:资源索引表,用来描述具有ID值的资源的配置信息
  • META-INF:存放签名相关的信息,用于验证APK包的完整性以及保证系统的安全,主要包含三个文件
    • MANIFEST.MF:主要存放APK包中每个文件的名字及每个文件的SHA1哈希值

《性能优化之APK瘦身》 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分割开来,实现动态加载代码

    原文作者:newtrek
    原文地址: https://www.jianshu.com/p/209573334478
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞