1、背景
又是一个灾难一年,2020发生了很多事,也一直没有在猿类的世界,仗剑漂流,留下痕迹,2021,为了生活还是要努力的活着。
2、App大小优化
在这个互联网时代, 一个app的下载量,最直观的因素是app的大小,虽然不是绝对因素,但是也有一定的影响;
- 文件大,所占设备内存空间也相应大;
- 文件大,下载/升级消耗资源;
针对上面的问题,这里要说的是解决这些痛点;
1. 缩减Apk本身大小
- 图片内存缩减策略
png类型图片:是一个无损压缩高质量的图片
压缩工具:Tinypng - 有大小和数量限制超过需要付费。
.9.png类型图片:使用有限制,在Android碎片化严重的情况下,可自适应调节,长,宽,内容区域的大小。
jpg类型图片:占用内存较小,适用于无透明度的图片。
webp类型图片:谷歌推荐。支持无损和有损压缩,支持透明度,适用于API17以上,开发工具,自带转换工具,可调节转换率。
矢量图:适用于导航Icon 图标,控制着色器,更换Icon颜色,可减少文件个数,减少APK大小。
源码api方面:针对shap 等定义的Android提供的有api支持,满足一些特殊场景,对apk大小压缩也有帮助。
GradientDrawable 简单的使用可以代替shap
GradientDrawable shapDrawable = new GradientDrawable();
shapDrawable.setShape(GradientDrawable.OVAL);
shapDrawable.setCornerRadius(5f);
shapDrawable.setColor(Color.argb(00, 255, 0, 255));
shapDrawable.setStroke(5, Color.argb(255, 0, 0, 255));
shapDrawable.setSize(80, 80);
- gradle 配置缩减
minifyEnabled :资源缩减(代码混淆),主要是删除无用代码
shrinkResources: 资源优化,在编译期间针对layout布局文件/图片文件,置空内容,保留文件,对于反射所需加载的文件,需要特殊配置。
在res->raw目录下创建keep.xnl文件进行过滤如下
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/activity_four"
tools:discard="@layout/unused2" />
说明:
tools:discard :舍弃资源
tools:keep : 保留资源
shrinkResources开启必须要开启 minifyEnabled
- gradle 配置加载
配置ndk项,按需配置,现在主流设备都是arm的cpu架构,因此,NDK支持’armeabi-v7a’,就可以支持80%设备的运行,x86架构,大多数搭载在平板上,所以,根据业务需求进行选择。
ndk {
abiFilters 'armeabi', 'x86', 'armeabi-v7a'
}
配置多语言保留模块
resConfigs "zh","en"
- gradle 分包缩减APK大小
根据业务需求选择编译对应的Apk
flavorDimensions "default"
productFlavors {
arm32 {
dimension "default"
ndk {
abiFilters 'armeabi-v7a'
}
}
x86 {
dimension "default"
ndk {
abiFilters 'x86'
}
}
}
2. 更新优化
apk在迭代更新的过程,渐渐地会使apk越来越大,因为apk太大,导致更新频率降低,apk很多新增功能,无法跟上同行步伐,用户无法体验,因此,会导致客户的流逝。
当前只提供技术选型方案,不提供具体实现:
- 增量更新
实现原理就是通过新旧文件包,进行对比,生成一个差分包,以打补丁的方式,升级软件。 - 热修复
适用于紧急修复线上软件包,避免重复发包
阿里 - AndFix
微信- Tinker 目前start 达到15.7k,位居榜首。
美团- Robust - 插件化
实现原理就是将app拆分多个模块,而且每个模块可以独立运行,可根据用户的适用范围,下载更新对应模块。
. …未完待续