为什么apk越来越大?

1.项目不断发展,功能越多,代码量增加的同时,资源文件也在不断的增多
2.app支持的主流dpi越来越多,如ldpi、mdpi、hdpi、xh xxh xxxh等等,间接导致资源增多
3.引入的第三方sdk或开源库越来越多,增加了很多重复的资源或方法以及无效代码
4.用于体验要求高,图片资源为保证清晰度会使用分辨率更高的图片

apk瘦身的切入点

解压一个没有加固过的apk文件我们会看到下边的内容,相信你对这些文件或目录的含义都已经清楚,接下来我们将会从三个方面进行apk的瘦身操作:
1.Java代码,对应classes.dex文件,我们要剔除无效代码,减小dex文件大小
2.资源文件,对应res文件夹,assets目录
3.减小lib中引入的so大小

开始瘦身

接下来我们将分别针对上边的三个切入点进行apk瘦身

1.减小Java代码的体积

有人认为这个方面的处理很鸡肋,因为每一行代码都对应相应的功能,这里能有多大的精简空间,其实并非完全如此,随着项目的不断推进,编码过程中会产生很多的冗余代码,比如该删掉的没有删掉,过多的重复性功能的工具类,无效的引用等,这还是其次,比较大的一个问题是,随着你引入的开源库不断增多,无效代码的出现几乎是必然事件,过多的重复方法还会导致64k方法数的问题。接下来进入正题。

1.开启minifyEnable

它的作用不仅仅是混淆代码,还有压缩优化的功能,他会遍历所有代码并找出没有引用到的代码,这些代码不会生成在apk中;另外混淆的效果是使用简短的字母替代原来的类名属性名等,一定程度上也可以减小代码体积

2.定期review重构代码

对代码的不断优化是提升个人能力的有效手段,同时优化的结果也会间接的对apk进行精简

3.慎重选择你使用的开源库

很多开源库针对不同平台提供了精简版,目的就是移除在本平台上不需要的代码,例如fastJson,我们选择精简版就可以使开源代码缩小一倍左右,另外针对没有精简版的开源库,需要根据场景考虑是否使用源码依赖,手动移除不必要的文件资源。

2.资源文件瘦身

1.优先采用WebP图片

资源文件是apk中体积占用较大的一部分,尤其是图片资源,所以我们首要以图片的瘦身为主。首先要对图片编码格式有简单了解。Android平台支持的格式有:JPEG,PNG,GIF,BNP,WebP(4.0开始支持WebP),但是Android应用开发中,Bitmap所支持的只有三种JPEG,PNG,WebP,从Bitmap类的CompressFormat枚举可以看出(详见源码)。

JPEG:有损压缩,不支持透明通道和多帧动画(RGB)
PNG:无损压缩,支持透明通道(ARGB),PNG大小大于JPEG
WebP:支持有损和无损压缩,支持透明通道和多帧动画,4.0以上是开发首选,Google官方测试,WebP比PNG能减少45%大小,即便PNG经过压缩,也能相比PNG减小28%

2.PNG格式图片尽量使用NinePatch格式

.9图具有体积小,拉伸不变形的特点,并且Android studio可以一键转换,使用起来相当方便。

3.Lint查找无效资源

Lint可以检查res目录下的无效资源(无法检查assets),然后将其删除,但是有一点要注意,如果资源文件是通过反射机制调用的,Lint是无法知道的,所以使用lint检查出的每一个资源都需要人工进行确认,防止发生异常删除。

4.开启shrinkResources功能

shrinkResources标识是否去除无用的resource文件,它需要配合minifyEnable使用,同样存在反射机制引用的问题,这种情况会被误删

android {buildTypes {release {minifyEnable trueshrinkResources true}}
}
5.resConfigs剔除第三方库或者SDK中的资源

第三方库中包含的无效资源通常包含以下两点:
1.dpi目录,第三方库通常会提供所有的dpi目录以及对应的资源文件,因为它是针对大众使用的,而我们未必都需要,这时候需要选择性的移除。
2.很多第三方sdk是做了国际化,而我们可能用不到,此时也需要删除国际化资源

defaultConfig {。。。resConfigs "zh"  //表示只使用中文resConfigs "xxhdpi" // 表示只是用xxhdpi目录下的资源文件
}

libs目录瘦身

so文件最终会被打包到libs目录中,我们针对libs目录的瘦身主要是去除不必要的平台ABI的so文件,例如我们只保留v7a和x86平台的so

defaultConfig {ndk {abiFilters "armeabi-v7a","x86"}
}

其他的一些优化

1.不涉及透明图层的图片可以转换为jpg格式,比如欢迎页的图片
2.使用shape(Vector)替换图片
3.删除或者替换兼容包中无用的一些图(v4.v7.v13)
4.删除第三方aar库中使用的大图
5.把so文件放置在网上或者sd卡内

总结

目前我所了解的瘦身方法只有这些

1.App瘦身经验总结相关推荐

  1. App瘦身最佳实践(分析了微信、淘宝、微博图片文件的放法)

    本文会不定期更新,推荐watch下项目.如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request. 本文的示例代码主要是基于作者的经验来编写的,若你有其他 ...

  2. App 瘦身最佳实践

    原文链接:www.jianshu.com Android本文会不定期更新,推荐watch下项目.如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request. ...

  3. ios开发app瘦身

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...

  4. iOS app瘦身优化之路

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...

  5. Android App 瘦身总结 第三章 代码混淆及优化

    目录 一.代码混淆proguard 二.调整第三方库 三.环境差异依赖 四.代码习惯 五.插件化 六.总结 在前两章我们分别从图片资源和jni动态库这两个方面来分析apk瘦身的优化点 Android ...

  6. Android App 瘦身总结 第二章 jni动态库及cpu兼容

    目录 一.利弊分析,按需引用 二.平台兼容 三.动态加载 四.总结 在前一章主要分析了图片资源部分的优化(Android App 瘦身总结 第一章 图片资源的优化处理_There is a Bug!! ...

  7. Android App 瘦身总结 第一章 图片资源的优化处理

    目录 一.去除无用的资源 二.忽略占比极少的分辨率 三.优化图片 四.使用更先进的图片格式 (1)使用矢量图 (2)使用webp图片格式 五.总结 当一款App经历了大量的迭代后,apk包会越来越臃肿 ...

  8. 如何实现手游app瘦身?

    手游服务商来说,手游包体大一直是个很困扰的问题.一款手游产品而言,包体大小和更新方式对于有效用户的转化率往往起到非常关键的作用,话说手游安装包越小,用户转化率越高,那该如何实现app瘦身呢? 工具/原 ...

  9. App性能优化(布局优化,线程优化,app瘦身优化,页面切换优化,App启动优化,内存优化)

    Android APP性能优化(最新总结) 在目前Android开发中,UI布局可以说是每个App使用频率很高的,随着UI越来越多,布局的重复性.复杂度也随之增长,这样使得UI布局的优化,显得至关重要 ...

最新文章

  1. 软件架构自学笔记——非功能特性
  2. python解析库beautifulsoup_12_Python_解析库_BeautifulSoup的使用
  3. Js获取当前页面URL各种参数
  4. 够学习一辈子的生活经典
  5. mapreduce引用第三方jar
  6. linux 下各个工具使用(screen、tmux,pyenv、virtualenv,pip国内源,tree)
  7. Alibaba船新出品“Java架构核心宝典”,java教程视频百度网盘
  8. eclipse+maven远程(自动)部署web项目到tomcat
  9. 微信小程序中的列表渲染
  10. 微信小程序蓝牙打印(中文乱码已解决)-分包发送(安卓和苹果手机均兼容)
  11. miui patchrom项目开发详细教程(Being updated)
  12. 牛人自制相机全过程(附:电路图)
  13. c语言怎么返回数组,c++从函数返回数组的方法代码
  14. power-virus
  15. 看雪逆向-Security Documentation
  16. oracle账号共享
  17. 计算机与scp通讯发生故障,在两台远程计算机之间使用scp命令时权限被拒绝错误...
  18. 叶绿体基因组注释PGA篇
  19. JS基础5-流程控制语句之条件(if、switch)
  20. 专题学习Linux笔记

热门文章

  1. c++怎么输入带有空格的字符串_杭电OJ 字符串处理类部分题解
  2. python重写和装饰器_python中的装饰器
  3. python34.dll_python34.dll下载
  4. java语言_JAVA语言
  5. 生成FaceBook所需的散列哈希值
  6. 李宏毅机器学习课程12~~~半监督学习
  7. caffe 提取特征并可视化(已测试可执行)及在线可视化
  8. python超神之路:Python3 列表list合并的4种方法
  9. VS中每次改代码后运行程序不更新,只有重新编译才生效。
  10. 什么是基金净值、单位净值、累计净值