性能优化之三——包体积优化大战

在厂商东家的时候,每个版本要求包体积增长不能超过15%,当时的包体积大该是20来M,所以,每次增长的空间在3M左右,这个还好,基本每个版本都能满足
现东家,每期版本发布,超过30K要审批,超过100K要上会特殊申请。
所以,现在每一期做完都要分析包体积增长,这次做的项目分了三期。两期一共增长如下表。所以,如果不做优化,肯定无法发布。

在这里插入图片描述
正如大家知道,只要你的业务量大,体积增长是不可避免的。之前对包体积优化不太想总结研究,原因是市面上所有的战法都是常规战法,平时在开发中,已经去规避,没有太多进阶和极致且实操性的战法。这次去做优化的时候,还是把优化给梳理一遍,做个记录,也为下次使用的便利。

1.优化意义

(1).下载时省流量,
(2).用户好的体验:下载更快,安装更快。

2.分析工具

1.APK Analys

APK Analys是AS自带的APK分析工具,使用比较简单,直接把APK文件拖拽到AS中即可。当然,也可以按照如下路径处理:
Android Studio下 ——> Build——> Analyze app
在这里插入图片描述

2.重要参数诠释

1.APK SIZE:又称(raw size)apk未压缩后的大小,也是在磁盘的大小。
2.Download SIZE:从应用商场下载的大小,就是实际消耗流量的大小,一般以这个大小作为包体积大小衡量。由此来看,应用商店还是把我们包体积给压缩挺多的!
3.和基准包对比,可以精确那些增长量,但是,是基于解压后的Size对比!Raw Size的增量和Download Size增量一致!
4.版本号
5.版本码
6.对应drawable目录
对于以上的目录都可以查看对应的文件,比如AndroidManifest.xml、查看代码和资源实体。
在这里插入图片描述

3.编包流程

在这里插入图片描述
进阶的战法都是从编包梳理处理的,所以,把编包图放出阿里。

4.优化战法

1.常规战法

1.清理无用资源

1.Lint工具

1.what is this

Android Studio 提供一个名为Lint的静态代码扫描工具,可以发现并纠正代码结构中的质量问题,而无需实际执行该应用,也不必编写测试用例。
Lint 工具可检查您的 Android 项目源文件是否包含潜在错误,以及在正确性、安全性、性能、易用性、便利性和国际化方面是否需要优化改进。

2.how to deal with it
(1).在 Android 视图中,打开您的项目,然后选择要分析的项目、文件夹或文件。
(2).从菜单栏中,依次选择 Analyze > Inspect Code。
(3).在 Specify Inspection Scope 对话框中,查看设置

Specify Inspection Scope 对话框中显示的选项组合因您选择的是项目、文件夹还是文件而异。您可以通过选中其他某个单选按钮来更改要检查的内容。您可以在 Specify Inspection Scope 对话框中查看 Specify Inspection Scope 对话框中可能显示的所有字段的说明。

(4).点击 OK 以运行检查。图 4 显示了通过运行 Inspect Code 所生成的 lint 及其他 IDE 检查结果:
在这里插入图片描述

3.operate items
1.检测没有用的布局并且删除
2.把未使用到的资源删除
3.建议String.xml有一些没有用到的字符也删除掉

2.开启shrinkResources去除无用资源

在build.gradle 里面配置shrinkResources true,在打包的时候会自动清除掉无用的资源,但经过实验发现打出的包并不会,而是会把部分无用资源用更小的东西代替掉。注意,这里的“无用”是指调用图片的所有父级函数最终是废弃代码,而shrinkResources true 只能去除没有任何父函数调用的情况.

   android {
        buildTypes {
            release {
                shrinkResources true
            }
        }
    }
3.删除无用的语言资源

大部分应用其实并不需要支持几十种语言的国际化支持。比如我们只是保存中文支持。

    android {
        defaultConfig {
            resConfigs "zh"
        }
    }
4.清理第三方库中冗余代码

对于第三方库,可能我们只是用到库中的一个功能,那么我们就可以导入源码,并且删除无关的代码,来减小体积。

2.图片资源优化

图片资源相对来说是比较占空间的,也是重点优化对象。
分为减、压、换四大杀手锏!

(减)1.只使用一套适配图

其实现在基本上都是使用一套二倍图进行适配。保留xhdpi文件夹。如果还是有二倍、三倍图,去掉一个文件夹,收获很大。

(减)2.着色方案

项目中或多或少都会使用selector文件。而这种图片往往只是颜色不同,通过着色方案我们能大大减轻这种工作量,降低这种文件。

借助于android support库可实现一个全版本号兼容的着色方案。參考代码:DrawableLess.java

BitmapDrawable优化:
原始图:
在这里插入图片描述

//着色处理
ImageView imageView = (ImageView) findViewById(R.id.image_1);
final Drawable originalBitmapDrawable = getResources().getDrawable(R.drawable.icon).mutate();
imageView.setImageDrawable(tintDrawable(originalBitmapDrawable, ColorStateList.valueOf(Color.MAGENTA)));

着色效果:

在这里插入图片描述

(换)3.webp万能替换

webp是谷歌官方推荐的图片格式,空间占用优化不少。
WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间。据谷歌官方的介绍:
WebP 无损压缩的图片可以比同样大小的 PNG 小 26%;
WebP 有损压缩的图片可以比同样大小的 JPEG 小 25-34%;
WebP 支持无损的透明图层通道,代价只需增加 22% 的字节存储空间;
WebP 有损透明图像可以比同样大小的 PNG 图像小3倍。

(换)4.svg动态图

矢量图是由点与线组成,和位图不一样,它再放大也能保持清晰度,而且使用矢量图比位图设计方案能节约30~40%的空间,现在谷歌一直在强调扁平化方式,矢量图可很好的契合该设计理念。
占用存储空间小
无极拉伸不会出现锯齿,可以照顾不同尺寸的机型
Android Studio自带很多资源
webp支持动态图,所以,动态图可以使用svg或者webp动态。

(换)5.shape图

特别是在扁平化盛行的当下,很多纯色的渐变的圆角的图片都可以用shape实现,代码灵活可控,省去了大量的背景图片。

//扩大圆点画图方案
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="@color/color" />
    <size
        android:width="20dp"
        android:height="20dp" />
    <stroke
        android:width="14dp"
        android:color="@android:color/transparent" />
</shape>

3.lib库优化

只支持主流架构,比如arm,对于mips和x86架构可以考虑不支持。

4.assets/raw资源

1.对于默认必须有配置文件,使用7zip压缩,使用时解压。
2.对于非默认的动态配置下发,然后解压。

5.gradle配置

1.代码混淆

在gradle使用minifyEnabled进行Proguard混淆的配置.

  android {
        buildTypes {
            release {
                minifyEnabled true
            }
        }
    }

代码混淆减包体积原理:
1)可以删除注释和不用的代码。
2)将java文件名改成短名
3)将方法名改成短名

2.进阶战法

1.字节码优化

1.facebook-Redex

redex是facebook发布的一款android字节码的优化工具。
Facebook 通过线上及线下测试,启动速度提升 20% 以上,Dex 大小减小 25%,对于内存较小的机型启动速度的优化效果尤其明显。

redex的接入成本比较高,这个成本包括对现有打包流程和热修复流程的影响,上线后的稳定性,以及问题排查的难易程度。接入成本对比优化结果看,接入是低性价比的,所以目前是放弃直接接入到项目中使用的。
redex虽然接入到成熟的app中有很多坑,但依然是一个很好的开源项目。通过调研redex,发现其中单个的优化项可以再去发掘应用,比如Interdex优化项,就可以在项目打包编译的过程中,修改dex分包逻辑,把app冷启动时需要加载的类,放到主dex中。

3.极致战法

5.巨人肩膀

1.Android性能优化篇之安装包优化
2.Android性能优化之APK瘦身详解(瘦身73%)
3.Android包体积优化上篇- 资源混淆优化
4.Drawable 着色的后向兼容方案
5.Android字节码优化工具redex初探
6.redex 官方文档
7.Android App包瘦身优化实践
8.使用 lint 检查改进您的代码
9.Android Studio Lint 工具看完这一篇还不够
10.ANDROID日常开发(15)给ICON着色 IMAGEVIEW 的TINT属性解析
11.基于 Facebook Redex 实现 Android APK 的压缩和优化

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. 采用随机分区:通过将数据随机分布到不同的分区中,可以避免数据倾斜的问题。 2. 采用哈希分区:通过将数据按照哈希函数的结果分配到不同的分区中,可以有效地解决数据倾斜的问题。 3. 采用聚合操作:通过对数据进行聚合操作,可以将数据分散到不同的分区中,从而避免数据倾斜的问题。 4. 采用重分区:通过将数据重新分区,可以使数据更加均匀地分布到不同的分区中,从而避免数据倾斜的问题。 5. 采用广播变量:通过将小数据集广播到所有的节点上,可以避免数据倾斜的问题。 6. 采用随机抽样:通过对数据进行随机抽样,可以避免数据倾斜的问题。 7. 采用数据倾斜检测:通过对数据进行倾斜检测,可以及时发现数据倾斜的问题,并采取相应的措施进行优化。 ### 回答2: Spark是当前最为热门的数据处理框架之一,但是随着数据量的增大,数据倾斜问题也随之出现,影响了Spark的性能。数据倾斜指的是某些数据片段比其他数据片段要大很多,从而导致Spark中的任务无法平衡地处理这些数据片段,导致一些节点的处理时间变长,性能下降。 解决Spark数据倾斜可以通过以下n种姿势: 1. 使用repartition操作:通过对数据重新分片来平衡数据倾斜。可以通过设置合适的分片数来避免数据倾斜问题,并提高Spark的性能。 2. 使用broadcast操作:可以减少数据的传输量并减轻网络负载,从而提高Spark的性能。同时,也可以通过对不平衡的数据进行broadcast操作来减少数据倾斜。 3. 使用map-side join操作:对于数据量较小的表,可使用Map-side join将这些小表广播到所有的节点上进行join操作,从而减少join操作中的数据倾斜。 4. 使用groupByKey和reduceByKey操作时,避免出现大量相同的键:在键的数量很大的情况下,可把数据划分为多个小表。同样,在使用groupByKey和reduceByKey操作时,应该尽量避免相同的键出现,从而减少数据倾斜。 5. 使用自定义分区操作:在对数据进行分区时,可以定义自己的分区方式,根据不同的分区策略来分配数据。从而避免数据倾斜问题的出现。 总之,解决Spark数据倾斜问题需要综合考虑多种解决方案,需要在具体的业务场景下进行分析和选择合适的解决方案。同时,也需要了解Spark基础知识,熟练使用相关API和工具,才能解决数据倾斜问题,并提高Spark的处理性能。 ### 回答3: Apache Spark作为一种通用的大数据处理框架,性能一直是其关注的重点。其中,数据倾斜(data skew)是影响Spark性能和可靠性的一大问题,它会导致某些节点的处理任务时间过长,影响整个作业的完成时间。 针对Spark数据倾斜问题,可以采取以下n种解决方法: 1. 均衡数据:将数据划分为更小、更均衡的数据块,提高数据分配的粒度,尽量减少数据分发时的数据倾斜。通过使用Spark默认的哈希分区方式,将数据均匀分配到各个节点上。 2. 重分区:在数据倾斜的情况下,可以通过采用重分区的方式,进一步将数据细分为更多分区,以期达到更好的负载均衡效果。使用repartition或coalesce方法,将数据按照需要的分区数进行调整。 3. 增加并行度:Spark的并行度是关键的性能指标之一,可以适当增加并行度来提高作业的处理效率。通过对Spark的配置参数进行调整,如调整spark.default.parallelism参数,增加RDD的分区数量,从而提高Spark并行处理的能力。 4. 聚合操作:数据倾斜可能是由于聚合操作出现了极值,导致操作的瓶颈出现在某一个分区,可以使用更复杂的聚合操作,如扩散聚合(broadcast join)和累加器(aggregators)等来避免数据倾斜。 5. 分桶:Spark SQL提供的分桶操作可以在数据分析过程中更好地利用Spark的并行处理。将数据分成多个桶(bucket)存储,在执行聚合计算时,可以通过对每个桶中的数据单独执行计算操作,从而有效避免数据倾斜的问题。 总的来说,解决Spark数据倾斜问题需要同时考虑数据本身的特点,调整Spark的配置参数和操作方式等多个方面。只有综合考虑到多个因素,才能有效地提高Spark大数据处理的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值