Android开发经验谈

如何减小安卓应用的体积!

2020-11-08  本文已影响0人  程序员面试秘籍

原文链接:https://mobile.51cto.com/android-627211.htm
作者:作者:陈峻译

在竞争激烈的市场上,我们的应用除了能够提供优质的功能服务,其自身的下载体积、以及在用户设备上占用的空间,也是决定其成败的关键因素之一。本文将介绍的九种减小应用体积的方法,希望能帮助您不断提高用户的使用体验。



不知您是否注意到:用户不断增长的各种业务需求,促使开发人员不断地将更多的内容整合到同一个应用程序中。因此,这直接导致了应用程序的体积与日俱增。某些大型应用程序甚至会化身成为抢占智能手机存储资源的“大户”,进而出现运行缓慢,并严重影响到用户的工作效率。根据Google的调查统计:如果应用程序的体积超过150 MB,那么它被安装的机会就会减少30%。而且,如果在体积上每增加6 MB,则该应用被安装的转换率可能会下降1%。

目前,有许多技术专家都在致力于创建体积小巧的应用程序与工具。Android App Bundle就是此类发布工具中的一种。通过它,用户无需从应用商店处重新下载那些本机应用中已有的内容。该平台号称能够将应用程序的体积减少35%。下面,让我们一起来探索一下,有哪些方法可以在应用程序的开发生命周期中减小Android应用的本身体积。

1.图像优化

我们可以在不降低分辨率的前提下,轻松地减小图像的尺寸。例如:我们可以将.jpg和.png图片转换为.webp(Web图片格式)。该格式既有针对.jpg的有损压缩,又有针对.png的透明性,因此许多工具都支持此类转换。例如:guetzli和packjpg之类的工具最适合.jpg文件的压缩;而pngcrush和zopflipng之类的工具则适合.png文件的转换。据此,设计人员可以通过矢量图形,来制作出那些既节省占用空间,又不失分辨率的简单图像。它们可以在Android中可被作为VectorDrawable对象来使用,并能够让文件生成清晰且适合屏幕尺寸的图像。其对应的Java代码如下所示:

android { 
 
defaultConfig { 
vectorDrawables.useSupportLibrary true 
} 
 
} 

众所周知,某些图像会与静态资源并不相关,程序框架能够在运行时,动态地绘制出此类图像。例如:在开发小型应用程序时,Vector Drawables对象可以仅占用APK文件里最少量的存储空间,并能创建出符合设计规格的图片。当然,复杂的对象可能会占用一定份额的CPU和RAM,进而降低整体的运行速度。

此外,作为一种所见即所得(WYSIWYG)的图像编辑器工具,Draw 9-patch也可以通过减小图像的尺寸,从而节省空间。在实际使用中,您可以通过该工具来制作能够适合各种移动设备、不同屏幕尺寸的位图。而且,图像中的选定部分也可以根据您在图像中绘制的手势指示符,进行垂直或水平方向的缩放。

再者,我们还可以使用aapt工具来处理.png图像,这些资源可以在设备目录res/drawable/中获得,以实现无损的压缩。例如:我们可以将真彩色的.png图像(并未超过256种颜色)转换为启用了8位(8-bit)图像的调色板。显然,后者在保留显示效果的同时大幅减小了图片的体积。不过,值得开发人员注意的是,aapt工具并不会压缩asset/folder中的.png文件。而且,它无法优化那些使用了超过256种颜色的图像。此外,它缺点是有可能会让已压缩的.png文件出现反弹。为此,我们需要通过在Gradle(译者注:一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具)中使用cruncherEnabled标志(见如下代码)来避免该缺点:

aaptOptions { 
cruncherEnabled = false 
} 

2.消除冗余代码(Redundant Code)

简言之,冗余的代码就是一些不必要的代码,它们可以通过重新计算而得到,或者是在执行过程中,对于应用程序的功能不起任何作用的代码。这些代码所对应的方法或类,之于应用程序而言非但无益,而且可能会造成程序上的臃肿,并浪费系统资源去产生不必要的载入和执行。

3.消除死代码(Dead Code)

APK文件的体积与应用程序的加载速度,使用到的内存,以及耗电量都是成正比的。可见,仅出于未来可能用到的目的,而保留的任何暂时无用的代码,只会占用更多的空间,而且还会让应用程序耗费更多的设备电量。因此,请不要犹豫,直接将它们找出来,果断地删除掉。此举不仅仅是为了提高源代码的质量,也能够在减少代码维护量的基础上,让应用程序能够避免出错或受到攻击。

4.限制库资源的使用

通常,在开发Android应用程序时,我们会用到各种外部库,而且我们往往需要将这些库的可用性和多功能性发挥到极致。其中,最常用的莫过于Google Play Services(可用于恢复应用程序文本的自动翻译)和Android Support Library(可用于改善老旧设备上的用户体验)。当然,这些类库同时也是为服务器或台式机设计的。它们往往会带有各种无法为手机应用提供服务的方法和对象。对此,您需要在编写程序时仅保留应用所需的部分。要做到这一点,您不但需要通过修改不同的调用权限,还应当仅使用那些适合移动设备的库,来实现某些特定的功能。

5.仅支持特定的屏幕密度

不同于iPhone那样基本固定了屏幕的尺寸,由全球不同厂商生产出来的Android平台设备,可谓五花八门。它们有着不同屏幕尺寸和分辨率的产品。此外,在Android的屏幕密度方面,也存在着诸如:ldpi、tvdpi、mdpi、hdpi、xhdpi、xxhdpi和xxxhdpi等类型。因此,如果您想让自己的应用小而美的话,那么就完全没有必要支持所有的屏幕类型,只需保证自己的界面能够清晰流畅地显示在基本设备上即可。

当然,在具体实践中,您也可以通过调查,摸清具有特定屏幕密度设备在市场上的占比。如果占比的确不高,就真的没有必要让应用去适应甚至捆绑每一种密度。通过如下命令,Android系统可以采取自动扩展的方式,适应不同密度的屏幕。

android{ 
  splits { 
    density { enabled true } 
  } 
} 

6.避免枚举

通常,枚举操作会给一个应用的classes.dex文件带来1.0到1.4 KB的空间占用。而且,如果程序中的枚举多了,尤其是有各种共享库或复杂系统的情况下,它们在运行的时候也会拖慢速度,并占用更多的空间。我们可以通过使用ProGuard和@IntDef的批注(annotation)功能,将枚举型转换为整型,以实现在保留枚举所有优点的基础上,减小应用的体积。

7.使用APK体积分析器

APK分析器可以为您提供有关APK体积大小的各种数据。在其界面的上方,您可以选择查看原始文件的大小,即:APK占用的磁盘空间大小。其“下载体积”表示了:在考虑了Play Store的帐户压缩的情况下,用户将会耗费多少数据流量来下载目标应用。

APK体积分析器可以通过Android Studio的插件市场(plugin marketplace),有效地进行下载。在其分析报告中,它会以降序排列的方式展示文件夹和文件的大小。通过此功能,您可以轻松地找出占用空间的“大户”。同时,您也可以通过“比较”的功能,查看到某个应用新、旧版本之间的体积差异。

8.可下载的字体

由于Play Store中的绝大多数应用程序都采用了相同的字体。因此,大多数字体会被包含在App Bundles中。当某个用户在一台设备上运行包含了采用相同字体的不同应用时,它们就需要能够在本地进行相互复用。幸运的是,Google已经考虑到了此类情况,并在其支持库中提供了可下载的各类字体。据此,您在开发应用时,不必再用API去捆绑字体文件,只需请求相应的字体即可。

9.提供多个APK

有时候,用户可能只想用到某个应用的一部分功能。而作为一个整体,应用往往无法将既有的APK进行拆分。对此,您可以在Google Play上,通过Android App Bundles上传自己的应用,以便Google可以根据设备的配置,来启用APK的优化。在实际开发中,您也可以将其中一个APK划分为多个,以便用户根据自己的判断和实际设备的配置,选择最实用的APK。

小结

在竞争激烈的市场上,我们的应用除了能够提供优质的功能服务,其自身的下载体积、以及在用户设备上占用的空间,也是决定其成败的关键因素之一。通过上述介绍的减小应用体积的方法,我们将能不断提高用户的使用体验。

最后

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。有Android架构视频+BATJ面试专题PDF+核心笔记等资料。希望能够帮助到大家提升技术。如果大家想要获取的话,可以简信我【666】免费获取哦

高级UI,自定义View

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。

不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

如果需要PDF版本可以在群文件夹里,自行领取!

上一篇下一篇

猜你喜欢

热点阅读