这篇简单侃一侃Apk的一个瘦身,对于这个包的体积,不知道大家的公司是怎么看待的,反正我们公司,上到高层,下到开发,都是非常重视的,每次周例会,各个项目都要汇报,上个版本多大,预计这个版本,增加多少,优化多少,都是汇报的对象,所以啊老铁们,真的是和绩效挂钩,不是虚的。

Apk瘦身,做为一个Android开发者,这是多多少少都会接触到的,同样功能的App,200M和150M,给用户的第一直觉是不一样的,如果不是刚需,体积越大,用户的排斥也就越大,所以啊,铁子们,你以为瘦身,是简简单单的把体积变小,殊不知,直接影响着用户的真实体验,在开发中,是很有必要进行实施的,毕竟影响着网络数据流量和下载的等待时间。

如何针对性的做瘦身呢,不妨,我们先看一下,占用APK内存,都有哪些因素,大家可以找到apk包,双击,或者如下图进行选择一个apk打开。

打开后,如下图:

从上图中,哪些是比较占用内存的,我们一目了然,简单的分析下:

lib:

存放 aar或so 文件,针对so文件可能会有 armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips等很多不同cpu架构类型,随着时代的发展,大部分的应用市场也有了64位的安装包要求,所以以后的发展,估计只需要支持arm64-v8a这一个即可。

res

这个没什么好说的,存放编译后的资源文件,如, drawable、layout 等等。

assets

应用程序的资源,应用程序可以使用 AssetManager 来检索该资源,比如一些静态数据,图片资源可以放至此处。

META-INF

该文件夹一般存放于已经签名的 APK 中,它包含了 APK 中所有文件的签名摘要等信息。

classes.dex

classes 文件是 Java Class,被 DEX 编译后可供 Dalvik/ART 虚拟机所理解的文件格式

AndroidManifest.xml

Android 的清单文件,用于描述应用程序的名称、版本、所需权限、注册的四大组件

从以上的查看apk的内存占用大小,我们就可以有针对性的进行瘦身, 一般而言,无非就是两个方面,一个是资源入手,另一个就是代码入手。

资源入手

图片的使用

说到资源,就不得不提到图片,图片可以说是资源里占用内存最多的,那么如何合理的使用图片呢,首先就是解决多套图的问题,我们知道,在开发中,针对图片,有hdpi,xhdpi,xxhdpi,xxxhdpi等不同倍数的文件夹,如果让UI每个倍数都设计一套图,虽然在适配上满足了不同分辨率的展示,但无形当中,会增加数倍的体积;相对于当下的市场而言,低分辨率的手机越来越少,其实也不用准备很多套图,特别针对国内市场而言,一般xxhdpi就可以满足实际的需求了。

除了多套图的问题,还有就是图片格式的问题,大家可以发现,相对png,jpg而言,webp格式的图片在同分辨率下,要小25%以上,不仅可以提高加载速度,而且还节省内存,使用webp格式的图片,何乐而不为。

在实际的开发中,针对图片除了以上的措施,还有就是点9图的使用,特别是一些背景图片,我们就可以让UI设计一个特别小的图片,转换点9后再进行拉伸,这也是节约内存的一种方式。

如果项目中有很多体积比较大的图片,建议放到服务端,改本地加载为远程加载,如果没有这个条件,或者产品有规定必须要加载本地的,那么不妨我们可以走一步程序,那就是图片压缩,压缩后再进行加载;当然了压缩平台是有很多的,比如Tinypng。

layout的使用

关于layout,无非就是复用了,比如很多页面有着共同的布局,我们就可以单独的抽出来,使用include,在每个页面引用即可了,再比如,大部分的页面都是列表,其实layout文件也没必要多创建,使用一个共用的即可。

color,dimens,string,style等

对于这些资源文件,我们能复用就复用,一般有一套即可。

移除未使用资源

随着项目的迭代开发,可能有很多的历史资源,已经用不到了,针对这些文件,我们就可以进行剔除,当然了,有一些难以发掘的,我们可以在build.gradle文件里,开启shrinkResources 的属性,这个属性可以帮助我们移除那些在程序中使用不到的资源文件。

android {buildTypes {release {shrinkResources true}}}

代码入手

so库使用

前边我们针对apk进行分析过,so绝对是占体积的一个大头,所以说,针对so,我们需要制定出一套合适的方案,既能减少体积,也能够平稳运行使用。我们都知道,cpu架构有很多类型,每支持一种,就要有对应的so文件,像目前我们公司开发的应用,增加一种,可能至少会增加三四十兆的体积,所以,这个是很恐怖的。

但还好,以后主流的大方向是64位, 也就是我们在应用中,只支持一种arm64_v8a即可,但是,主流是主流,目前还是不能支持一种,这个,在实际的开发中已经验证,如果只支持arm64_v8a,发现在部分手机如红米手机,就会找不到对应的so文件,就会发生崩溃,所以,还是要进行多cpu架构类型适配。

那么怎么解决这个问题呢?分开打包,也就是64位打64位的,32位打32位的,出不同的包进行上传,各个应用市场也都是支持的。唯一需要解决的就是,应用内的一个更新问题,这个就需要在多加一层判断,就是判断当前手机的cpu架构,然后更新下载对应的apk,这样就可以解决因so导致的体积增大问题。

当然了,以上的解决方式属于静态加载的解决,并没有根本上解决so占用内存的问题,如果想彻底的解决,那么就需要动态加载了,也就是本地不放置任何so库,全从服务端,进行下发,然后动态加载,这个网上也有很多案例,这里就不细说了。

代码复用

这个就无需多言了,抽取父类,抽取工具类等,大家都耳熟能详了,但还有一种情况,大家需要注意,那就是一个项目存在一种功能即可,比如网络,图片加载,数据缓存等,一个项目如果有多种的话,不能使用起来乱,不好管理,而且还会增加体积,想想看,一个项目,有Glide,Picasso还有Fresco,你的第一想法是什么?

减少 ENUM 的使用

每减少一个 ENUM 可以减少大约 1.0 到 1.4 KB 的大小。

WebView的使用

针对一些页面,可以用H5的话,就尽量用H5,H5不仅可以灵活更改,还可以大幅度减少apk的体积,毕竟当对于很多原生开发的页面,H5只需要一个webview容器。

开启混淆

在 build.gradle 文件相应的构建类型中添加 minifyEnabled  true。

打开这些编译属性之后,程序在打包的时候就不会把没有引用到的代码编译进来,以此达到减少安装包大小的目的。

android {buildTypes {release {minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'    }}}

支持插件化

插件化开发和组件化不同,插件化开发就是将整个app拆分成很多模块,每个模块都是一个apk(组件化的每个模块是一个lib),最终打包的时候将宿主apk和插件apk分开打包,插件apk通过动态下发到宿主apk,进行分解apk大小。

以上呢,简单的总结了Apk瘦身的一些方式,其实瘦身的工作呢,尽量提前,也就是说,在项目的启动之时,就应该全方位的考虑,而不是等到日后的亡羊补牢。

Android包体积过大,真的会影响绩效相关推荐

  1. Android包体积优化(常规、进阶、极致)

    前言 包大小的重要性已经不需要多说,包大小直接影响用户的下载,留存,甚至部分厂商预装强制要求必须小于一定的值.但是随着业务的迭代开发,应用会越来越大,安装包会不停的膨胀,因此包大小缩减是一个长期持续的 ...

  2. 深入探索 Android 包体积优化(匠心制作-下)

    前言 成为一名优秀的Android开发,需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~. 在 Android 性能优化的知识体系当中,包体积优化一直被排在优先级比较低的位置,从而导 ...

  3. vue性能优化之build后包体积太大(1)

    基于vue-cli3.0构建项目,npm引入多个第三方包.build之后,包体积太大导致首屏过长.----毫无体验感!!! 实践的项目喜欢捣鼓可以clone下来 只总结了亲测效果明显的几种方案,解决方 ...

  4. Android包体积优化上篇- 资源混淆优化

    导读:什么时候进行包体积优化?一般在app初创期时,由于业务代码较少,包体积也不大,相应这个时候对包体积的优化收益也较少.当业务逐渐成熟功能,迭代逐渐变多,包体积也会逐渐增加. 增加包体积主要影响如下 ...

  5. 抖音Android包体积优化探索:从Class字节码入手精简DEX体积

    前言 众所周知,应用安装包的体积会十分影响用户的应用下载速度和安装速度.据 GoolgePlay 平台对外发布相关的包大小对转化率影响的数据,我们可以看到随着包大小的增加,安装转化率总体呈下降的趋势. ...

  6. 深入理解android 包体积优化,给apk瘦身全部技巧

    前言 随着iphone13p最大内存放大到了1T,大内存手机的时代悄然降临,在android里面,三星也有,罗老师几年前说:如果我告诉你们我们在做1T的手机,你们可能以为我疯了. 看看现在,估计未来会 ...

  7. 微信小程序包体积过大解决方法

    因为微信开发者工具提交需要整个项目大小不超过2M,超过2M则不能提交,会出现下面这个报错 解决方法: 1.在Hbuilder x上面勾选上运行时压缩代码 2.分包操作 在pages.json文件中设置 ...

  8. 抖音 Android 包体积优化探索:资源二进制格式的极致精简

    动手点关注 干货不迷路 

  9. 深入探索 Android 包瘦身(上)

    码个蛋(codeegg) 第 942 次推文 作者:jsonchao 链接:https://juejin.im/post/5e7ad1c0e51d450edc0cf053 今天分享一篇匠心制作的< ...

最新文章

  1. mysqlhelper
  2. 数据结构~~~线性表复习(栈的应用)
  3. C# VS预生成事件命令行 和 生成后事件命令行
  4. 2017 9月java答案_2017年9月计算机二级JAVA试题及答案
  5. 直观理解神经网络和梯度下降
  6. java中注解的解析_全面解析Java中的注解与注释
  7. php7 nts,php7.0.24-nts配置步骤
  8. HTTP之Cookie
  9. 一份阿里员工排查程序问题的命令列表
  10. cmake安装使用(详解 )
  11. 【彩色图像直方图统计】matlab统计RGB、HSV、Lab图像灰度,以直方图形式显示
  12. libevent核心思想:epoll反应堆模型
  13. 校园水卡M1卡破解写卡
  14. 基于Jsoup的简单JAVA爬虫 人民币汇率中间价
  15. [人工智能-深度学习-38]:卷积神经网络CNN - 常见分类网络- ResNet网络架构分析与详解
  16. Web.xml 错误或异常页面配置
  17. Esac代表什么意义?
  18. 【php图片上传在网页显示】
  19. Midjourney如何给模特换衣服
  20. 你真的了解白帽、黑帽、灰帽 吗?看看这个你就懂了

热门文章

  1. pycaret实现CTG分类案例
  2. Python计算机视觉——图像内容分类
  3. RESTful风格的更新和删除遇到的问题
  4. 组图:诗情画意----配图宋词十四首
  5. 在wps中excel中无法求和
  6. android selector开发自定义样式实现唯美效果
  7. 从BI到ABI,守正创新的思迈特软件持续推进国产BI产业创新
  8. VC 多线程同步方式操作串口
  9. 房讯通:房产估价背后的混合云服务
  10. (2021.9.25)面向切面编程简述