51CTO|如何减小安卓应用的体积


51CTO|如何减小安卓应用的体积
文章图片
不知您是否注意到:用户不断增长的各种业务需求 , 促使开发人员不断地将更多的内容整合到同一个应用程序中 。 因此 , 这直接导致了应用程序的体积与日俱增 。 某些大型应用程序甚至会化身成为抢占智能手机存储资源的“大户” , 进而出现运行缓慢 , 并严重影响到用户的工作效率 。 根据Google的调查统计:如果应用程序的体积超过150MB , 那么它被安装的机会就会减少30% 。 而且 , 如果在体积上每增加6MB , 则该应用被安装的转换率可能会下降1% 。
目前 , 有许多技术专家都在致力于创建体积小巧的应用程序与工具 。 AndroidAppBundle就是此类发布工具中的一种 。 通过它 , 用户无需从应用商店处重新下载那些本机应用中已有的内容 。 该平台号称能够将应用程序的体积减少35% 。 下面 , 让我们一起来探索一下 , 有哪些方法可以在应用程序的开发生命周期中减小Android应用的本身体积 。
1.图像优化
我们可以在不降低分辨率的前提下 , 轻松地减小图像的尺寸 。 例如:我们可以将.jpg和.png图片转换为.webp(Web图片格式) 。 该格式既有针对.jpg的有损压缩 , 又有针对.png的透明性 , 因此许多工具都支持此类转换 。 例如:guetzli和packjpg之类的工具最适合.jpg文件的压缩;而pngcrush和zopflipng之类的工具则适合.png文件的转换 。 据此 , 设计人员可以通过矢量图形 , 来制作出那些既节省占用空间 , 又不失分辨率的简单图像 。 它们可以在Android中可被作为VectorDrawable对象来使用 , 并能够让文件生成清晰且适合屏幕尺寸的图像 。 其对应的Java代码如下所示:android{defaultConfig{vectorDrawables.useSupportLibrarytrue}}
众所周知 , 某些图像会与静态资源并不相关 , 程序框架能够在运行时 , 动态地绘制出此类图像 。 例如:在开发小型应用程序时 , VectorDrawables对象可以仅占用APK文件里最少量的存储空间 , 并能创建出符合设计规格的图片 。 当然 , 复杂的对象可能会占用一定份额的CPU和RAM , 进而降低整体的运行速度 。
此外 , 作为一种所见即所得(WYSIWYG)的图像编辑器工具 , Draw9-patch也可以通过减小图像的尺寸 , 从而节省空间 。 在实际使用中 , 您可以通过该工具来制作能够适合各种移动设备、不同屏幕尺寸的位图 。 而且 , 图像中的选定部分也可以根据您在图像中绘制的手势指示符 , 进行垂直或水平方向的缩放 。
再者 , 我们还可以使用aapt工具来处理.png图像 , 这些资源可以在设备目录res/drawable/中获得 , 以实现无损的压缩 。 例如:我们可以将真彩色的.png图像(并未超过256种颜色)转换为启用了8位(8-bit)图像的调色板 。 显然 , 后者在保留显示效果的同时大幅减小了图片的体积 。 不过 , 值得开发人员注意的是 , aapt工具并不会压缩asset/folder中的.png文件 。 而且 , 它无法优化那些使用了超过256种颜色的图像 。 此外 , 它缺点是有可能会让已压缩的.png文件出现反弹 。 为此 , 我们需要通过在Gradle(译者注:一个基于ApacheAnt和ApacheMaven概念的项目自动化构建开源工具)中使用cruncherEnabled标志(见如下代码)来避免该缺点:aaptOptions{cruncherEnabled=false}
2.消除冗余代码(RedundantCode)
简言之 , 冗余的代码就是一些不必要的代码 , 它们可以通过重新计算而得到 , 或者是在执行过程中 , 对于应用程序的功能不起任何作用的代码 。 这些代码所对应的方法或类 , 之于应用程序而言非但无益 , 而且可能会造成程序上的臃肿 , 并浪费系统资源去产生不必要的载入和执行 。
3.消除死代码(DeadCode)
APK文件的体积与应用程序的加载速度 , 使用到的内存 , 以及耗电量都是成正比的 。 可见 , 仅出于未来可能用到的目的 , 而保留的任何暂时无用的代码 , 只会占用更多的空间 , 而且还会让应用程序耗费更多的设备电量 。 因此 , 请不要犹豫 , 直接将它们找出来 , 果断地删除掉 。 此举不仅仅是为了提高源代码的质量 , 也能够在减少代码维护量的基础上 , 让应用程序能够避免出错或受到攻击 。


推荐阅读