性能优化-(一)缩减包体积优化方案

前言

满足了产品的功能基本需求,仅仅是一个开始,后续需要进可能提高应用性能。用户除了使用产品的基本功能外,还期望我们的应用耗电少、启动快、对用户互动响应迅速,希望是一个酷炫而且高效的应用。

APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。因此,缩减APK包大小也作为性能优化的一个方面。

一、使用Android Size Analyzer工具

Android Size Analyzer 工具可让您轻松地发现和实施多种缩减应用大小的策略。可作为Android Studio 插件或独立的JAR使用。

1.插件安装

image

2.使用方法

  1. 安装插件后,从菜单栏中依次选择 Analyze > Analyze App Size,对当前项目运行应用大小分析:如下图所示
    image
  2. 分析了项目后,系统会显示一个工具窗口,其中包含有关如何缩减应用大小的建议,如下图所示
    image

二、尽量减少库中的资源使用量

1.仅支持指定密度

项目中至少包含一个xxhdpi,其他视情况进行适配

2.使用可绘制对象

某些图片不需要静态图片资源,可在XML中定义shape。如下所示:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <corners android:radius="2dp"></corners>
    <solid android:color="#99000000" />

</shape>

3.重复使用资源

针对同一组资源图片,在运行时根据需要对其进行自定义。在Android 5.0(API 21)及更高的版本,可使用android:tint和tintMode属性,对于较低版本,则使用ColorFilter。现在的项目开发,大部分都是5.0 以上,因此我们主要考虑使用android:tint和tintMode属性

android:tint,android:tintMode:作用于ImageView,对ImageView内的mDrawable(内容图片)着色,以及着色模式设定。
对应设定方法:
void setImageTintList(@Nullable ColorStateList tint)
void setImageTintMode(@Nullable PorterDuff.Mode tintMode);

示例效果:
image

对图片进行旋转处理,将向上箭头变成向下箭头

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/learn_knowledge_arrow_up"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fromDegrees="180" />

效果如下图所示:
image

压缩PNG文件

aapt 工具可以在编译过程中通过无损压缩来优化放置在 res/drawable/ 中的图片资源。例如,aapt 工具可以通过调色板将不需要超过 256 种颜色的真彩色 PNG 转换为 8 位 PNG。这样做会生成质量相同但内存占用量更小的图片。

请记住,aapt 具有以下限制:

aapt 工具不会缩减 asset/ 文件夹中包含的 PNG 文件。
图片文件需要使用 256 种或更少的颜色才可供 aapt 工具进行优化。
aapt 工具可能会扩充已压缩的 PNG 文件。为防止出现这种情况,您可以在 Gradle 中使用 cruncherEnabled 标记为 PNG 文件停用此过程:

 aaptOptions {
        cruncherEnabled = false
    }

压缩 PNG 和 JPEG 文件

您可以使用 pngcrush、pngquant 或 zopflipng 等工具缩减 PNG 文件的大小,同时不损失画质。所有这些工具都可以缩减 PNG 文件的大小,同时保持肉眼感知的画质不变。

pngcrush 工具尤为有效:该工具会迭代 PNG 过滤器和 zlib (Deflate) 参数,使用过滤器和参数的每个组合来压缩图片。然后,它会选择可产生最小压缩输出的配置。

要压缩 JPEG 文件,您可以使用 packJPG 和 guetzli 等工具。

使用 WebP 文件格式

如果以 Android 3.2(API 级别 13)及更高版本为目标,您还可以使用 WebP 文件格式的图片(而不是使用 PNG 或 JPEG 文件)。WebP 格式提供有损压缩(如 JPEG)以及透明度(如 PNG),不过与 JPEG 或 PNG 相比,这种格式可以提供更好的压缩效果。

Note:

  • 项目中一些需要动态加载的图片,在上传到服务器上之前,可以使用上述工具进行压缩处理

您可以使用 Android Studio 将现有 BMP、JPG、PNG 或静态 GIF 图片转换为 WebP 格式。

操作方式如下:

image

有损压缩可以设置质量,可以查看压缩前以及压缩后的质量图片大小

image

Note:

  • 为了更好的保证图片展示效果一般都选择无损压缩或者质量100%
  • 可选择单独的文件夹进行一次新转换

使用矢量图形

您可以使用矢量图形创建与分辨率无关的图标和其他可伸缩媒体。使用这些图形可以极大地减少 APK 占用的空间。 矢量图片在 Android 中以 VectorDrawable 对象的形式表示。借助 VectorDrawable 对象,100 字节的文件可以生成与屏幕大小相同的清晰图片。

不过,系统渲染每个 VectorDrawable 对象需要花费大量时间,而较大的图片则需要更长的时间才能显示在屏幕上。因此,请考虑仅在显示小图片时使用这些矢量图形,建议将矢量图限制为最大200 x 200 dp

如需详细了解如何使用 VectorDrawable 对象,请参阅使用可绘制资源

Note:

[以上部分内容参考官方推荐的性能优化建议]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值