堪称保姆级别整理的Android 包体积优化方案~

作者:yechaoa
转载地址:https://juejin.cn/post/7116089040264232967

1、背景

  • 提升下载转化率
  • 提升更新率,这个是鲜有人提到的,二次下载同样重要,它能推动业务快速落地。

具体可以参考前置必读里面的

2、现状

  • 最新版本?MB,突破80大关?100大关?竞对?
  • 近6个月平均每个月增速?MB
  • 近6个月平均每个版本更新周期(7天?10天?)

横向对比、纵向对比

输出报表

3、目标

减少30MB & 降低30%

树立目标

4、现状具体分析

  1. 图片占比15%
  2. 代码占比25%
  3. so文件50%
  4. 其他10%

结合项目分析,输出每项占比背后的具体因素(设计花哨?业务复杂?架构合理?)

输出饼图

5、优化思路

  1. 压缩参与打包的文件
  2. 减少参与打包的文件

从哪入手,怎么做

6、规划思考

  1. 如何保证稳定性?
  2. 如何长效治理?

站在更高的角度去思考问题

如果不能保证稳定性,那宁愿不做

做完就反弹,那就是白做

7、里程碑

  1. 信息公示
  2. 确保进度稳中推进
  3. 有风险及时寻求资源支持

8、抓手

  • Android Studio
  • ApkChecker
  • ClassShark
  • 产出具有项目特色的工具

切入点

9、技术大图

PPT汇报示例

9、图片优化

由手动模式向工具模式进化

10、代码优化

11、远程so

需要熟悉打包流程,知道Gradle的各种Task执行在干什么事。

大致流程图:

打包阶段,在合并apk之前,把需要远程的so文件上传至远端,然后剔除掉。

Flutter的so远程这方面没啥资料,提一下,源码搜一下FlutterLoader,继承FlutterLoader重写startInitialization,原理就是干预原有的so文件加载路径。

11.1、下载流程

沉淀通用的下载SDK

  1. 网络状态管理
  2. 下载任务优先级调度
  3. 断点续传

11.1.1、启动下载(闲时)

闲时下载:用户是无感知的,即使失败,也不需要交互形式表现。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W3fzuw51-1658151108368)(https://upload-images.jianshu.io/upload_images/16900214-5af2848c2946245d.png1112_119">11.1.2、按需下载

按需下载:下载流程与闲时下载一样,但交互表现形式不一样,需要让用户感知你在干什么、什么进度,提供一个loading页承载。

自检:不一定是我们代码的问题,可能是用户网络不可用、存储不够等,针对不同的情况,给予不同的指导操作。

12、测试

  1. 兼容性:android 5.0-12.0
  2. 是否重复下载、是否可用(32/64)
  3. 断网、弱网
  4. 覆盖安装
  5. 前台退后台

13、监控告警

13.1、埋点

  1. success
  2. error code/message
  3. so name
  4. retry
  5. demotion
  6. storage size
  7. download type
  8. download time
  9. 设备信息
  10. 网络信息
  11. 用户信息

埋点的信息其实就是排障需要的信息

13.2、监控

  1. 下载成功率
  2. load成功率
  3. loading页打开成功率

13.3、告警

  1. x分钟x次失败
  2. 根据历史趋势

告警形式包括但不限于钉钉群、微信群、短信、电话等。

13.4、排障

  1. 沉淀排障指南
  2. 数据库底表查询sql

14、长效治理

给打包增加一个后置卡口,既可以感知每次的增长因素,也可以避免疯狂反弹。

后置卡口的设计原理:

  1. 打包过程中会对资源文件、代码文件、jar/aar等文件进行合并,既然知道有哪些文件,就可以知道这些文件的大小,就可以输出一个file size的文件作为当前版本的基线。
  2. 阈值配置信息可写死,可远程配置。

15、结果

  • 优化前、优化后对比
  • 竞对 对比
  • 下载时间对比
  • 安装时间对比

输出报表,列出各项数据的对比

16、未来规划

  1. 增加白名单机制,比如logo是不需要压缩的
  2. 沉淀方法论
  3. 流程工具化、智能化
  4. 月度报告
  5. 数据大盘

没有完美的方案,一定是有可以优化改进的地方

17、价值&意义

  1. 技术:沉淀通用组件、技术创新(flutter)
  2. 团队:个人影响力
  3. 公司:减少带宽,全年节省x经费
  4. 用户:下载时间减少x、安装时间减少x、
  5. 社会:每次下载减少x流量,全年节省流量x亿

18、思考

  1. 需要做到极致吗?理论上启动非必须的图片、文件、so都是可以远程的,可是 减肥是要越瘦越好吗?
  2. 是否考虑极简包方案?

避免做个工具人

19、面试问题

  1. 为什么选用tinypng,原理是什么,还有其他方案吗?
  2. 远程so的选定标准是什么?
  3. 支持断点续传吗?
  4. 会重复下载吗?
  5. 下载可以根据网络选择吗?
  6. 有文件完整性校验吗?
  7. 有下载优先级吗?
  8. 怎么避免64位设备下到32位so文件?
  9. so文件更新之后会在设备上与老的版本共存吗?
  10. 兜底方案是什么?
  11. 还有哪些可以优化的地方?

20、最后

  1. 顶级厨师在线烹饪,做好了自己吃,不负责喂

    原文地址:https://blog.csdn.net/weixin_61845324

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


更新Android SDK到3.0版本时,遇到Failed to rename directory E:\android\tools to E:\android\temp\ToolPackage.old01问题,导致无法更新,出现该问题的原因是由于3.0版本与较早的sdk版本之间文件结构有冲突,解决
Android 如何解决dialog弹出时无法捕捉Activity的back事件 在一些情况下,我们需要捕捉back键事件,然后在捕捉到的事件里写入我们需要进行的处理,通常可以采用下面三种办法捕捉到back事件: 1)重写onKeyDown或者onKeyUp方法 2)重写onBackPressed方
Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法。一.用系统自带的Button实现 最简单的一种办法就是利用系统自带的Button来实现,这种方式代码量最小。在Button的属性中有一个是drawable
Android中的"Unable to start activity ComponentInfo"的错误 最近在做一款音乐播放器的时候,然后在调试的过程中发现一直报这个错误"Unable to start activity ComponentInfo",从字面
Android 关于长按back键退出应用程序的实现最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序。在网上查找了很多资料,发现几乎没有这样的实现,大部分在处理时是双击back键来退出应用程序。参考了一下双击back键退出应用程序的代码,网上主流的一种方法是下面
android自带的时间选择器只能精确到分,但是对于某些应用要求选择的时间精确到秒级,此时只有自定义去实现这样的时间选择器了。下面介绍一个可以精确到秒级的时间选择器。 先上效果图: 下面是工程目录: 这个控件我也是用的别人的,好像是一个老外写的,com.wheel中的WheelView是滑动控件的主
Android平台下利用zxing实现二维码开发 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平台上应用比较成熟,而在Android平台上主流还是用zxing库,因此这里主要讲述如何利用zxing
Android ListView的item背景色设置以及item点击无响应等相关问题 在Android开发中,listview控件是非常常用的控件,在大多数情况下,大家都会改掉listview的item默认的外观,下面讲解以下在使用listview时最常见的几个问题。1.如何改变item的背景色和按
如何向Android模拟器中导入含有中文名称的文件在进行Android开发的时候,如果需要向Android模拟器中导入文件进行测试,通过DDMS下手动导入或者在命令行下通过adb push命令是无法导入含有中文文件名的文件的。后来发现借用其他工具可以向模拟器中导入中文名称的文件,这个工具就是Ultr
Windows 下搭建Android开发环境一.下载并安装JDK版本要求JDK1.6+,下载JDK成功后进行安装,安装好后进行环境变量的配置【我的电脑】-——>【属性】——>【高级】 ——>【环境变量】——>【系统变量】中点击【新建】:变量名:CLASSPATH变量值:……
如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题 在android中有时候可能要实现一个底部弹出菜单,此时可以考虑用PopupWindow来实现。下面就来介绍一下如何使用PopupWindow实现一个弹出窗。 主Activity代码:public void onCreat
解决Android中的ERROR: the user data image is used by another emulator. aborting的方法 今天调试代码的时候,突然出现这个错误,折腾了很久没有解决。最后在google上找到了大家给出的两种解决方案,下面给出这两种方法的链接博客:ht
AdvserView.java package com.earen.viewflipper; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory;
ImageView的scaleType的属性有好几种,分别是matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY。 |值|说明| |:--:|:--| |center|保持原图的大小,显示在ImageVie
文章浏览阅读8.8k次,点赞9次,收藏20次。本文操作环境:win10/Android studio 3.21.环境配置 在SDK Tools里选择 CMAKE/LLDB/NDK点击OK 安装这些插件. 2.创建CMakeLists.txt文件 在Project 目录下,右键app,点击新建File文件,命名为CMakeLists.txt点击OK,创建完毕! 3.配置文件 在CMa..._link c++ project with gradle
文章浏览阅读1.2w次,点赞15次,收藏69次。实现目的:由mainActivity界面跳转到otherActivity界面1.写好两个layout文件,activity_main.xml和otherxml.xmlactivity_main.xml<?xml version="1.0" encoding="utf-8"?><RelativeLayout ="http://schemas..._android studio 界面跳转
文章浏览阅读3.8w次。前言:最近在找Android上的全局代理软件来用,然后发现了这两款神作,都是外国的软件,而且都是开源的软件,因此把源码下载了下来,给有需要研究代理这方面的童鞋看看。不得不说,国外的开源精神十分浓,大家相互使用当前基础的开源软件,然后组合成一个更大更强的大开源软件。好吧,废话不多说,下面简单介绍一下这两款开源项目。一、ProxyDroid:ProxyDroid功能比较强大,用到的技术也比较多,源码也_proxydroid
文章浏览阅读2.5w次,点赞17次,收藏6次。创建项目后,运行项目时Gradle Build 窗口却显示错误:程序包R不存在通常情况下是不会出现这个错误的。我是怎么遇到这个错误的呢?第一次创建项目,company Domain我使用的是:aven.com,但是创建过程在卡在了Building 'Calculator' Gradle Project info这个过程中,于是我选择了“Cancel”第二次创建项目,我还是使用相同的项目名称和项目路_r不存在
文章浏览阅读8.9w次,点赞4次,收藏43次。前言:在Android上使用系统自带的代理,限制灰常大,仅支持系统自带的浏览器。这样像QQ、飞信、微博等这些单独的App都不能使用系统的代理。如何让所有软件都能正常代理呢?ProxyDroid这个软件能帮你解决!使用方法及步骤如下:一、推荐从Google Play下载ProxyDroid,目前最新版本是v2.6.6。二、对ProxyDroid进行配置(基本配置:) (1) Auto S_proxydroid使用教程
文章浏览阅读1.1w次,点赞4次,收藏17次。Android Studio提供了一个很实用的工具Android设备监视器(Android device monitor),该监视器中最常用的一个工具就是DDMS(Dalvik Debug Monitor Service),是 Android 开发环境中的Dalvik虚拟机调试监控服务。可以进行的操作有:为测试设备截屏,查看特定进程中正在运行的线程以及堆栈信息、Logcat、广播状态信息、模拟电话_安卓摄像头调试工具