image

公司项目在不断的改版迭代中,代码在不断的累加,终于apk包不负重负了,已经到了八十多M了。可能要换种方式表达,到目前为止没有正真的往外推过,一直在内部执行7天讨论需求,5天代码实现的阶段。你在写上个版本的内容,好了,下个版本的更新内容已经定稿了。基于这种快速开发的现状,我们app优化前已经有87.1M了,包大了,运营说这样转化不高,只能好好搞一下咯。优化过后包大小为23.1M(优化了73%,不要说我标题党)。好了好了,我要阐述我的apk超级无敌魔鬼瘦身之心得了。

目录如下图:

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

文章主要内容从理论出发,再做实际操作。分为下面几个方面:
1. 结构分析, 2.具体实操
3. 总结

1. 结构分析

首先上传一张瘦身前通过Analyze app分析出来的图片(打开方式:Android Studio下 ——> Build——> Analyze app):

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

APK包结构如下:

1. lib/:包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多数情况下我们可以只用一种armeabi-v7a,后面会讲到原因。

2. assets/:包含应用可以使用AssetManager对象检索的应用资源。

3. res/:包含未编译到的资源 resources.arsc,主要有图片资源文件。

4. META-INF/:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件。

5. resources.arsc:包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的XML内容。打包工具提取此XML内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc文件中的内容路径 ,例如布局文件和图像。

6. classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类。

7. AndroidManifest.xml:包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。

通过分析图可以知道,目前app主要是so文件占比比较大,占了31.7M,占了整个应用是38.2%。其次是assets目录,整个目录占了32M,第三就是资源文件res目录了。所以接下来我们处理步骤就是按这个顺序来处理。(简单说下图中的Raw File Size(磁盘解压后的大小)和DownLoad Size(从应用商店下载的大小),如果想了解更多关于Analyaer分析的知识,可以参考这篇文章使用APK Analyzer分析你的APK),分析了包结构组成之后,我们可以开始瘦身操作了。

2.具体实操

1. 对lib目录下的文件进行瘦身处理

1. 修改lib配置:

参考资料

so文件的优化:通常我们在使用NDK开发的时候,我们经常会有如下这么一段代码:

ndk {//设置支持的so库架构abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64", "armeabi"}![Android性能优化之APK瘦身详解(瘦身73%)](https://upload-images.jianshu.io/upload_images/15217452-a164a611526fa4bc?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

image.png

最后我的修改代码如下:

ndk {//设置支持的so库架构abiFilters "armeabi-v7a"}

接下来说明这么做的依据:

看上面图分析,armeabi-v7主要不支持ARMv5(1998年诞生)和ARMv6(2001年诞生).目前这两款处理器的手机设备基本不在我公司的适配范围(市场占比太少)。

而许多基于 x86 的设备也可运行 armeabi-v7a 和 armeabi NDK 二进制文件。对于这些设备,主要 ABI 将是 x86,辅助 ABI 是 armeabi-v7a。

最后总结一点:如果适配版本高于4.1版本,可以直接像我上面这样写,当然,如果armeabi-v7a不是设备主要ABI,那么会在性能上造成一定的影响。

好了,我们再打一次包试试。

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

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

确实有点震惊,一下子包小了这么多,从87.1M到51.9M,容我好好算算少了多少M.赶快让测试帮忙测一下。基于之前的理论知识,心里还是有点底。果然,测试效果和之前是一样的。心里的石头先落下罗。

2. 重新编译so文件,用更小的库代替

相信很多开发者都有这种苦恼,很多第三方我们导入进来只用到其中很小一部分功能,大部分功能都是我们用不上的。这时候我们找到源代码,将我们需要的那部分代码提取出来,重新编译成新的so文件,再导入到我们项目中。当然,如果之前没有编译过so文件,这部分建议做最后的优化去处理。不然你会遇到很多问题。上一波处理后的效果图:

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

这里说下,因为项目中有使用到ffmpeg库,之前导入的第三方的放在assets文件夹下,重写编写后的so库文件放在lib文件夹下,所以lib文件夹反而大了。从51.9M到35.6M,效果还是蛮不错的。

对了,别问我为什么assets文件夹下为什么还有12.6M资源,因为很多.mp3都是第三方的人脸识别必备配置文件,我也很无奈。

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

2. 优化res,assets文件大小

1. 手动lint检查,手动删除无用资源

在Android Studio中打开“Analyze” 然后选择"Inspect Code...",范围选择整个项目,然后点击"OK"。配置如下:

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

2. 使用tinypng等图片压缩工具对图片进行压缩。

打开网址,将大图片导入到tinypng,替换之前的图片资源。

3. 大部分图片使用Webp格式代替。

可以给UI提要求,让他们将图片资源设置为Webp格式,这样的话图片资源会小很多。如果想了解更多关于webp,请点击这里webp,当然,如果对图片颜色通道要求不高,可以考虑转jpg,最好用webp,因为效果更佳。

4. 尽量不要在项目中使用帧动画

一个帧动画几十张图片,再怎么压缩都还是占很大内存比重的。所以建议是让UI去搞,这里可以参考使用lottie-android,如果项目中动画效果多的话效果更加明显。当然这就要辛苦我们UI设计师大大了。

5. 使用gradle开启shrinkResources

移除无用资源文件,下面是我的配置:

buildTypes {release {// 不显示LogbuildConfigField "boolean", "LOG_DEBUG", "false"//混淆minifyEnabled true// 移除无用的resource文件shrinkResources trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'signingConfig signingConfigs.release}}

通过上述步骤操作,apk效果如下:

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

3. 减少chasses.dex大小

classes.dex中包含了所有的java代码,当你打包时,gradle会将所有模板力的.class文件转换成classes.dex文件,当然,如果方法数超过64K,将要新增其他文件进行存储。可以通过multidexing分多个文件,比如我这里的chasses2.dex。换句话说,就是减少代码量。我们可以通过以下方法来实现:

  1. 尽量减少第三方库的引用,这个在上面我们已经做过优化了。
  2. 避免使用枚举,这里特别去网上查了一下,得出的结论是,可能几十个枚举的内存占有量才相当一张图片这样子,优化效果也不会特别明显。当然,如果你是个追求极致的人,我不反对你用静态常量替代枚举。
  3. 如果你的dex文件太大,检查是否引入了重复功能的第三方库(图片加载库,glide,picasso,fresco,image_loader,如果不是你一个人单独开发完成的很容易出现这种情况),尽量做到一个功能点一个库解决。

4. 其他

  1. 用7zip代替压缩资源。
  2. 删除翻译资源,只保留中英文
  3. 尝试将andorid support库彻底踢出你的项目。
  4. 尝试使用动态加载so库文件,插件化开发。
  5. 将大资源文件放到服务端,启动后自动下载使用。

3. 总结

好了,说道这里基本上就结束了,apk包从87.1M减小到了23.1M(优化了73%,不要说我标题党)已经差不多了,关于第四部其他部分的优化我是没有进行再操作的。因为公司运营觉得二三十M的包比较真实,太小了就太假了。所以我暂时就不进行优化了。如果再上面提到的部分通过所有将所有非启动页面首页之外的所有资源,so库放服务端,理论上apk包大小能在10M以内这样子。当然我们有做到就不多加评价了。

Android性能优化之APK瘦身详解(瘦身73%)相关推荐

  1. Android性能优化之APK瘦身最全总结

    Android性能优化之APK瘦身最全总结 随着业务复杂度的逐渐增加,代码.资源也在不断的增加,此时你的APP大小也在增加.从用户层面来说,面对动辄几十兆的APP来说在非WIFI情况下还是会犹豫要不要 ...

  2. Android 性能优化 (一)APK高效瘦身

    Android 性能优化 (一)APK高效瘦身 http://blog.csdn.net/whb20081815/article/details/70140063 Android 性能优化 (二)数据 ...

  3. Android性能优化——使用 APK Analyzer 分析你的 APK

    Android Studio 2.2包含了APK Analyzer,通过它我们能够直观地看到APK的组成.使用APK Analyzer不仅能够减少你花在debug上的时间,而且还能减少你的APK大小. ...

  4. Android性能优化之APK优化,内容太过真实

    开头 今天在浏览技术新闻的时候,发现腾讯就在今天开源了一套 Android 原生的 UI 框架.你们有没有发现,腾讯特别喜欢干这种事,哪一种事呢?喜欢开源 UI 框架,小程序也是这样的. 我看到这个新 ...

  5. Activity 的 36 大难点,你会几个?,Android性能优化之APK优化

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MhPkxLFA-1638250133902)(https://user-gold-cdn.xitu.io/2019/10 ...

  6. Android性能优化之APK优化,附赠课程+题库

    前言 IT行业薪水高,这是众所周知的,所以很多人大学都选择IT相关专业,即使非该专业的人,毕业了也想去一个培训机构镀镀金,进入这一行业. 但是有关这个行业35岁就退休的说法,也一直盛传. 加上这几年不 ...

  7. Android线程优化之线程池的详解

    本文授权发布公众号[刘桂林],星球[Hi Android] ThreadPoolExecutor还是有很多可讲的,但是我选择的还是着重讲解Android中的四个线程池,网上对ThreadPoolExe ...

  8. Android 性能优化(三)布局优化 秒变大神

    Android 性能优化 (一)APK高效瘦身 http://blog.csdn.net/whb20081815/article/details/70140063 Android 性能优化 (二)数据 ...

  9. Android 性能优化(五)ANR 秒变大神

    Android 性能优化 (一)APK高效瘦身 http://blog.csdn.net/whb20081815/article/details/70140063 Android 性能优化 (二)数据 ...

最新文章

  1. visual studio配置第三方库
  2. 怎么解决相位抵消_两种相位抵消法消侧音原理及其电路形式
  3. JAVA SE学习day_13 :Map 查找表
  4. Express2.X迁移至3.X注意事项
  5. vuex状态管理模式:入门demo(状态管理仓)
  6. RocketMQ事务消息及消息索引设计原理
  7. Oracle内置函数-字符/数值/日期/转换/NVL/分析函数与窗口函数/case_decode
  8. Oracle 文字排序,按照拼音,姓氏笔画等
  9. 计算机联锁与全电子执行单元,计算机联锁全电子执行单元.docx
  10. java绘制菱形平行四边形_Java实现金字塔形菱形平行四边形
  11. ubuntu桌面便签_在Deepin 20、Ubuntu 20.04中安装便签小工具Stickynotes
  12. use glyphs icons
  13. android 签名文件与sha1获取
  14. MOCTF-MISC-writeup
  15. Node.js时间戳和日期互相转换
  16. C语言函数讲义,C语言讲义——指针函数和函数指针
  17. 一套效果图适配(Android和IOS)全尺寸和标注规范-(结果)
  18. 专科计算机专业能报考南方电网,想进南方电网工作?你必须得是这些专业的学生!...
  19. project 2010
  20. 基于Cesium的卫星及空间碎片的轨迹展示

热门文章

  1. 《Spring揭秘》读书笔记 3:Spring MVC
  2. javascript之雪花特效
  3. 专业的知识图谱应用门槛正在被不断降低
  4. [windows]远程桌面用户管理
  5. 生而强悍的iQOO如何在安卓手机阵营成功跑出?
  6. Java基础语法之数组练习——循环输出数列的值并求和
  7. SpringBoot集成支付平台
  8. 人的天性是贪嗔痴和戒定慧的等量叠加态
  9. python练习题:英汉字典
  10. Redis实现在线用户列表(按登录时间排序、可查询、踢人)