自2012年3月启动Android Marketplace以来,平均Android应用的大小已增长了五倍。
其中一些增加是有道理的:典型Android设备可用的内存增加了,那么为什么不使用这些额外的内存来提供更好的用户体验呢?
但是, 有一点,所有的高清显卡,创新功能和丰富的多媒体内容,对用户造成负面影响的经验,没有人想要一个应用程序,需要永远下载,然后取一大块出了自己设备的内存!
甚至有证据表明,APK的大小与下载应用程序的人数之间存在负相关。 根据最近的一项研究 ,APK大小每增加6MB,您访问Google Play页面后安装您的应用的人数就会减少1%。
您可以采取的一切措施来减少APK的大小,这都会鼓励更多的用户下载您的应用,因此在本文中,我将向您展示如何创建更细,更薄的APK,并确保您的应用在尽可能多的设备上运行。
Android应用程序捆绑:在减少APK大小的同时支持更多设备
每当您开发Android应用程序时,都需要通过提供针对不同屏幕密度,CPU架构,语言和许多其他因素进行了优化的代码和资源,确保该应用程序与尽可能多的不同设备兼容。 不幸的是,这也意味着每个下载您的应用程序的人都会收到大量他们永远不会使用的代码和资源。
长期以来,支持尽可能多的设备而不显着增加APK的大小一直是Android开发人员的难题。 不过,Android团队旨在通过一种新的发布格式来改变所有这一切,该发布格式旨在帮助您支持各种Android设备,同时减小 APK的大小。 根据Android Developers官方博客的说法,通过以这种新的Android App Bundle ( .aab )格式发布您的应用程序,您应该能够将APK的大小平均减少35%。
将您的应用程序以.aab文件格式上传后,Google Play将使用该文件来生成:
- 基本APK,其中包含交付应用程序基本功能所需的所有代码和资源。 下载您的应用的每个人都会收到相同的基本APK。
- 多个配置APK,适合不同设备配置。 每次有人下载您的应用程序时,他们都会收到针对其特定设备量身定制的配置APK,并且仅包含他们实际需要的代码和资源。
要将您的应用程序构建为已签名的Android App Bundle,请首先从Android Studio工具栏中选择Build > Generate Signed Bundle / APK 。 然后选中“ Android App Bundle”复选框,然后单击“ 下一步” 。 现在,打开模块下拉列表,然后选择app作为您的基本模块。
按照屏幕上的说明完成构建过程。 Android Studio现在将生成一个.aab文件,并将其存储在计算机的AndroidAppBundle / app / release目录中。
准备好将.aab文件上传到Google Play时,只需转到Google Play控制台,然后选择创建应用程序即可 。
系统会要求您输入一些有关应用程序的基本信息,然后单击“ 创建” ,然后单击“ 保存” 。 在控制台的左侧菜单中,选择“ 应用版本” 。 确定您要将这个应用程序上传到哪个轨道,然后选择其随附的“ 管理”按钮,然后点击创建发布 。
出现提示时,请注册Google Play应用签名,这对于使用App Bundle格式是必需的。 选择浏览文件 ,然后选择要上载的.aab文件。

最后,单击“ 保存”以保存您的配置。
将应用程序上载到控制台后,您可以使用应用程序捆绑包格式查看已节省了多少空间。 为此,请从左侧菜单中选择“ 应用发布 ”。 找到您将Bundle上传到的曲目,然后选择Edit release,然后单击以展开Android App Bundle部分。
选择探索应用程序捆绑包 ,您将看到已保存空间的粗略估计,以百分比表示。

通过动态功能模块按需交付功能
对于一个项目来说,具有交付该应用程序的核心功能不必要的一项或多项功能并不罕见。 您通常可以通过将这些功能分成可选的动态功能APK来减小APK的大小,然后用户可以根据需要在需要时下载这些功能。
要创建动态功能模块,请从Android Studio工具栏中选择文件 > 新建 > 新建模块… 。 选择动态功能模块 ,然后选择下一步 。
在这里,您可以打开基本应用程序模块下拉列表,然后选择您的基本模块。 为您的模块命名,然后单击“ 下一步” 。 选中“ 启用按需”复选框。 如果您的项目支持Android 4.4或更早版本,那么您还需要启用Fusing ,因为这将使您的动态功能模块可以作为多APK使用于这些设备。

最后,为您的模块提供一个公共名称,这对于最终用户将是可见的。 点击完成 。
启用对动态功能模块的访问
创建动态功能模块后,需要为用户提供一种在运行时请求它的方法。 打开您的模块级build.gradle
文件,然后将Google Play Core库添加为项目依赖项:
dependencies {
//Add the following//
implementation 'com.google.android.play:core:1.3.6'
打开要在其中加载动态功能模块的“ Activity
或“ Fragment
,然后添加以下内容:
private void loadDyanmicFeatureOne() {
//Create an instance of SplitInstallManager//
SplitInstallManager splitInstallManager =
SplitInstallManagerFactory.create(this);
//Create the request//
SplitInstallRequest request =
SplitInstallRequest
.newBuilder()
//Specify the module that you want to download//
.addModule("dynamic-module")
.build();
SplitInstallStateUpdatedListener listener = new SplitInstallStateUpdatedListener() {
@Override
public void onStateUpdate(SplitInstallSessionState splitInstallSessionState) {
if(splitInstallSessionState.sessionId() == mySessionId) {
switch (splitInstallSessionState.status()) {
case SplitInstallSessionStatus.INSTALLED:
Toast.makeText(MainActivity.this, "The dynamic module was downloaded”, Toast.LENGTH_SHORT).show();
break;
}
}
}
};
splitInstallManager.registerListener(listener);
//Submit the request via the asynchronous startInstall//
splitInstallManager.startInstall(request)
.addOnFailureListener(new OnFailureListener() {
@Override
//If the download fails with an exception….//
public void onFailure(Exception e) {
//...then do something//
}
})
.addOnSuccessListener(new OnSuccessListener<Integer>() {
@Override
//If the module was downloaded successfully...//
public void onSuccess(Integer sessionId) {
//...then do something//
mySessionId = sessionId;
}
});
}
}
您现在可以将代码和资源添加到动态功能模块中,并且用户将能够在运行时请求该模块。
购买前先尝试:提供即时应用APK
它可能不是传统的可安装意义上的APK,但您可以提供应用程序的一部分作为轻量级的独立Instant Apps APK,然后用户可以按需加载。 对于那些在极度有限的存储或有限的数据计划中苦苦挣扎的人来说,即时应用程序可能是他们体验您的应用程序的唯一可行方法。
在由三部分组成的Instant Apps系列中,我们创建了一个多功能的Instant Apps APK ,该APK映射到唯一的URL。 URL映射使您可以从支持超链接的网络上的任何位置访问Instant App,包括论坛,推文,Facebook帖子和博客。 但是,URL映射也是一个多步骤过程,需要您拥有一个Web域,您可以在其中托管项目的assetlinks.json
文件。
在最新版本的Android Studio中,创建Instant Apps APK变得更加容易,因为现在可以创建未映射到任何 URL的Instant App,从而消除了与URL映射相关的所有复杂性。
发布无URL的即时应用程序后,用户将可以通过应用程序Google Play列表上的“ 立即尝试”按钮进行访问。

要创建此类“无URL”即时应用程序,您需要:
- Android Studio 3.2或更高版本。
- Instant Apps Development SDK 1.3.0或更高版本。
- 最新版本的Android SDK构建和平台工具。
支持Instant Apps的项目具有独特的结构。 如果您将模块化作为标准应用程序开发过程的一部分进行实践,那么您可能只需要对项目进行一些调整,但是如果您的项目没有模块化,则准备花一些时间进行重组。
要支持Instant Apps,您需要创建以下模块:
- 应用模块。 这是“标准”可安装的应用程序模块。
- 基本模块。 它包含将在项目的所有模块中使用的代码和资源,例如应用程序的启动器图标。
- 功能模块。 它包含交付独立功能所需的代码和资源。
- Instantapp模块。 这是一个容器,最终将采用您项目的每个功能模块,并将其转换为Instant App APK。

如果您要开始一个新项目,那么您很幸运:您可以创建一个已经具有Instant Apps结构的空白项目。 只需正常创建一个新项目,但是在出现提示时,选择“ 此项目将支持即时应用程序” 。

然后,您可以照常向每个模块添加代码和资源。
要测试无URL的Instant App,您需要兼容的设备,根据官方的Android文档,该设备是运行Android 5.1或更高版本的“最多”物理设备。 如果您使用的是模拟器,则需要一个使用Android 8.1或更高版本,x86体系结构并包含Google API的AVD(Android虚拟设备)。 您还需要在测试设备或AVD上登录到有效的Google帐户。
要测试您的Instant App,请从Android Studio工具栏中选择“运行” > “运行 ...”,然后选择“ 编辑配置” ...
在左侧菜单中,选择InstantApp 。 由于我们正在测试无URL的Instant App,因此找到URL字段并删除其中的所有文本。 现在选择运行 。 如果设备提示您选择加入Instant App程序,请点击“ 是,我在” 。
现在,您的Instant App应该出现在屏幕上,无需安装,也不需要URL!
在发布应用程序时,您可以完成两次签名过程以创建单独的可安装和Instant App APK,也可以将项目构建为应用程序捆绑包。
发布启用了即时应用程序的应用程序捆绑包
在Android Studio 3.3 beta 1及更高版本中,您可以将Instant Apps与App Bundles结合使用,以创建一个同时包含可安装和Instant App的.aab文件。
要将您的应用设置为发布包含Instant App的.aab文件,请打开项目的Instantapp模块。
在此模块的AndroidManifest.xml文件中,添加以下内容:
<manifest
xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:dist="http://schemas.android.com/apk/distribution"
//Set the targetSandboxVersion to 2//
android:targetSandboxVersion="2">
//Add the following//
<dist:module dist:instant="true" />
</manifest>
打开应用模块的build.gradle文件,并确保您的即时变体的versionCode
小于可安装的versionCode
:
android {
...
flavorDimensions "flavorDimension"
productFlavors {
instant {
versionCode 1
}
installed {
versionCode 2
}
}
}
从Android Studio菜单栏中选择Build > Generate Signed Bundle / APK ,然后照常构建您的App Bundle,并确保使用发布密钥对其进行签名。
删除所有未使用的方法,类,字段,属性和资源
对于未使用的代码和资源,很容易找到它们进入项目的方式,尤其是在使用库时。 由于它们会为您的应用添加零价值,因此您应始终跟踪并删除不必要的资产,并且有几种工具可以帮助您:
尝试新的R8 Code Shrinker
代码收缩可以通过删除未使用的代码和资源来帮助您减小APK的大小。
Android Studio 3.3 beta 1预览了即将到来的R8代码缩减工具,该工具还可以执行除糖和解码,并且据Google称,其代码缩减速度比ProGuard快。
要自己尝试R8,请确保您运行的是Android Studio 3.3 beta 1或更高版本,然后将以下内容添加到gradle.properties文件中:
android.enableR8=true
2.使用ProGuard缩减代码
在撰写本文时,R8仍处于预览状态,因此在稳定之前,您可能更喜欢使用ProGuard从代码中删除未使用的类,方法,字段和属性。
要启用ProGuard,请将以下内容添加到模块级build.gradle文件中:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
请注意,ProGuard可能会删除您的应用程序实际需要的代码,因此在发布ProGuard之前,应始终对其进行测试。
3.启用资源缩减
启用代码缩减后,就可以使用资源缩减来标识并删除不必要的资源:
buildTypes {
release {
//Add the following//
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
4.使用Android Lint改进代码
Lint是一个静态扫描工具,可以识别代码中未引用的资源。 但是,Lint实际上并不会删除这些资源,因此您需要检查其报告并手动删除已标识的资源。
要运行Lint,请从Android Studio工具栏中选择“ 分析” >“ 检查代码 ...”。 如果Lint检测到任何未引用的资源,那么它将在“ 检查结果”窗口中列出它们。

将您的PNG,JPEG和BMP转换为WebP
如果您的项目包含许多可绘制对象,则对其进行压缩可以显着减小APK的大小。
如果项目的minSdkVersion
为18或更高,则可以通过将PNG,JPEG和BMP转换为WebP格式来压缩它们。
首先,按住Control键并单击要转换的图形,然后选择“ 转换为WebP ... ”。在有损编码或无损编码之间进行选择。 当编码结果大于原始图像时,选择“ 跳过图像” ,然后单击“ 确定”以转换图像。
使用Android Studio的APK分析器检查您的APK
有时,您可能无法完全确定导致APK失控的原因。
您可以使用Android Studio的新APK分析器确定对APK大小最大的贡献者。 使用此工具,您可以探索不同类别文件的绝对和相对大小,甚至单个文件的大小,因此您将确切地知道应该将精力集中在什么地方。
要分析APK,只需从Android Studio的菜单栏中选择“ 构建” >“ 分析APK” 。
在随后的窗口中,选择相关的APK。 APK分析器将在新面板中打开。

对于每个文件和文件夹,APK分析器都会显示:
- 原始文件大小。 这是磁盘上此项的解压缩大小。
- 下载大小。 这是该商品的预计压缩尺寸,因为它会由Google Play交付。
- 占总下载大小的百分比。 此项目所代表的APK在总下载量中所占的百分比。
这不是APK分析器必须提供的唯一功能。
想象一下,您已经成功地削减了APK的大小,并发布了一个轻量级的应用程序,该应用程序在Google Play上获得了好评如潮的五星级评论-这并不意味着您可以不再担心APK的大小! 在某个时候,您将需要发布更新,这意味着APK大小将再次成为主要问题。
监视APK从一个发行版到另一个发行版的方式始终是一个好主意,但是,如果APK的大小有了很大的增加,那么您肯定希望仔细看看发生了什么。
您可以使用APK分析器突出显示当前APK和以前的APK之间的所有差异,这可以帮助您将可以优化甚至完全删除的区域和资产归零。
要比较APK,请首先从Android Studio的菜单栏中选择“ 构建” >“ 分析APK” 。
然后选择APK的最新版本。 在APK分析器的右上角,选择与以前的APK比较...接下来,选择您的APK的先前版本。 应该会出现一个弹出窗口,突出显示当前APK和先前APK之间的所有差异。
不要忘记Android Go!
新兴市场代表着世界上增长最快的智能手机用户,而Vivo和Oppo等品牌的崛起证明,廉价设备有可能在这个快速扩展的市场中占据主导地位。
为帮助Android吸引不断增长的全新受众,Google发布了Android Go,这是一个具有性能和存储改进功能的Android版本,旨在为预算友好型设备(包括内存不足1GB的设备)提供更好的体验。
Android Go用户可以访问整个Google Play商店,但是Google重点介绍了针对Android Go优化的应用,包括在用户设备上占用不到40MB的应用。
通过遵循本文中的建议,您应该能够为使用APK的每个人显着减小APK的大小。 但是,如果您想专门针对Android Go用户进行其他缩减,则可以使用Android的多APK功能发布针对Android Go平台优化的APK。
要创建专用的Android Go应用,您需要创建一个APK,该APK具有与“常规”应用相同的软件包名称和签名证书,但具有唯一的版本代码。
创建Android Go APK时,您还需要将以下内容添加到清单中:
<uses-feature android:name="android.hardware.ram.low" android:required="true">
结论
在本文中,我介绍了所有可以减少APK大小以创建更时尚,更苗条的应用程序的主要方法,这些应用程序可以更快地下载并占用用户设备上更少的空间。
翻译自: https://code.tutsplus.com/articles/8-ways-to-reduce-your-android-app-apk-size--cms-32508