
哈Ha! 我叫Kamo Spertsyan,我在PROFI.RU从事Android开发。 我最近为我们的客户编写了一个即时启动应用程序。 如果您不熟悉该技术,我邀请您首先访问
Android Developers 。
自从在Google I / O 2016上发布Instant Apps(Google Play Instant)以来已经过去了两年多。 网上有很多关于如何通过即时启动创建应用程序的文章。 从他们的判断来看,这没有什么复杂的。 但是实际上这并非完全正确。 我将尝试描述从创建一个空项目到在Google Play上发布Instant App所经历的主要困难。 我希望本文对尚未开发的开发人员有所帮助。
方法的选择
大多数资源都描述了将整个应用程序转换为Instant App的过程。 但是,我们的应用程序丝毫没有达到4 MB的限制,并且提供了比安装前熟悉该服务所需的更多功能。 Google现在处于测试模式,通过即时启动,该应用程序的允许大小已增加到10 MB。
我可以选择两种方法来创建Instant App。 首先是制作完成的应用程序,并从中删除不必要的功能。 第二个是创建一个空项目并将所需的功能转移到其中。 考虑到第一种选择是快速的,我和我的同事们在当地的黑客马拉松比赛中对其进行了测试,与此同时,我对它的绝望深信不疑。 首先,它花费了很多时间(约40个工时)。 其次,由于过多的代码和资源,应用程序的大小非常大。 第三,多余的代码使维护变得复杂。 在黑客马拉松期间,我们疯狂地尝试将最终的应用程序适配到4 MB,最后我们仍然没有时间。
功能转移
在痛苦的经验指导下,我创建了一个空项目,并开始仅将必要的应用程序模块复制到其中。 我们支持模块化架构,因此很容易做到。 在这里,我遇到了第一个问题-您无法在Instant Apps中使用服务。 就我而言,此限制并不重要:我们使用该服务上传照片,而在Instant App中,我们拒绝了此功能,从而促使用户下载了主应用程序。 但是,如果您的应用程序还使用服务,则值得考虑这一点。
令我惊讶的是,仅通过复制必要的代码段而获得的应用程序仍然无法容纳有效的4 MB内存,其重量约为5 MB。 Google在
此文章中提供了有关此案的建议,但他们对我有所帮助。 我们唯一可以拒绝的是自定义字体,但是它们的重量不会显着影响APK的大小。
然后我想起了我们项目中的ProGuard在调试程序集上被禁用了。 简单包含
minifyEnabled true
将应用程序的大小减少了近一半。 哦,奇迹-达到了4 MB的限制!
资料迁移
接下来,要解决数据迁移的问题。 如您所知,Android操作系统从5.0版开始支持Instant Apps。 同时,自动数据迁移仅从Android 8.0开始有效。 为此,在两个应用程序中使用具有相同名称的共享首选项文件就足够了。 对于版本5.0到7.1,必须使用
Cookie API或
Storage API手动编写迁移。 我使用Cookie并没有遇到任何特殊问题-但是,这不仅需要在Instant App方面进行更改,而且还需要在已安装的应用程序中进行更改。 因此,最后我不得不发布该应用程序的新版本,并将其发布给所有受众,以发布Instant App。
侦错
通过调试,事实并非如此简单。
首先,Google Play即搜即得不支持不安全的网络连接,因此,请不要使用http,而只需使用https。 对我来说,这意味着要在生产服务器上进行测试,因为所有测试平台都在http上运行。 不是很严格,但不够愉快。
其次,启动Instant App本身:您可以暂时正常,可安装地测试该应用程序。 通过Android Studio启动时,无法将Instant App更新检查为“完整”应用程序。 例如,测试用户数据传输的正确性。 为此,请与即时应用程序一样,通过即时启动运行该应用程序。 有两种方法可以做到这一点:
- 使用Android SDK中的特殊实用程序启动应用程序;
- 将其放在控制台中进行内部测试,并在Play Market中运行。
第一种方法很方便。 该实用程序包含在Android SDK中,但默认情况下未安装。 要在Android Studio中安装,您需要执行以下步骤:
- 转到首选项 -> 外观和行为 -> 系统设置 -> Android SDK ;
- 选择“ SDK工具”标签;
- 选中Google Play即时开发SDK旁边的框,然后点击应用 。

在最后一步,请注意该实用程序的安装目录。 在此路径上,我们将对
./extras/google/instantapps/ia文件感兴趣。 使用它,您可以通过运行以下命令来模拟应用程序的即时启动
ia run < APK-, bundle- URL>
在碰到此实用程序之前,我一直使用第二种方法,并在Google Play控制台中不断发布该应用程序。 但是,由于已发布的应用程序并没有立即出现在商店中,而是经过了一段不确定的时间(花了我半个小时到一天的时间)之后,这种测试方式还是不好的。 但是,这不是为此目的。 顺便说一句,如果您在Google Play控制台上频繁发布Instant App,建议您考虑在启动后确定该应用程序的版本代码的可能性。 否则,可能很难理解是上次发布的版本还是上次发布的版本。
过帐
最后,当您的应用程序经过测试并准备发布时,请不要着急放松! 首先,Instant App的版本代码(
versionCode )不应超过已安装应用程序的版本代码。 我建议您提前留出一些创造力的空间:发布主应用程序时,请指定代码的明显重要值,以免束手无策。 从控制台删除发布的Instant App以便“发布”另一个程序集的版本代码将失败。 正式地,您有
NM
机会启动Instant App,而在Google Play上有具有
versionCode = N
的主应用程序和具有
versionCode = M
即时启动的应用程序。
另外,对于Instant App版本,请确保与主应用程序相比,它不可供更多的受众使用。 换句话说,每个Instant App用户都应该能够安装主应用程序。
受众主要受到清单文件中指定的应用程序的权限(
权限 )的影响-两个应用程序的权限必须相同(不影响受众的权限除外)。 假设,如果您的主应用程序需要权限来确定地理位置,并且在Instant App中这不是必需的,则仍需要在该位置和该位置进行指定。
而且,某些支持库可以缩小最终用户的范围。 在我们这里就是这样。 尽管两个应用程序的权限相同,但控制台抛出
“目标apk差异”错误。 为了寻求解决方案,我遇到了Stack Overflow的
问题 ,建议通过
aapt实用程序
运行应用程序的APK文件。 它将显示有关文件的详细信息,包括所有依赖项。 计算了两个文件的输出差异后,我注意到了一个线索:正在安装的应用程序的行为
uses-gl-es: '0x20000'
,这在Instant App中不存在。 短暂浏览网络使我找到了一个解决方案:这行代码表示该应用程序使用OpenGL库,而该库又用于地图中。 确实,我们的主应用程序使用了
play-services-maps
库,但Instant App没有使用。 将此依赖项添加到Instant App中,使我最终可以发布该应用程序。
总结一下
- Instant Apps无法使用服务和不安全的网络(http)。 最终APK文件的大小不应超过4 MB(也许此限制很快就会简化为10 MB)。
- 要减小APK文件的大小,可以使用优化器和代码混淆器(例如ProGuard)。
- 对于Android 8.0 +,SharedPreferences自动从Instant App转移到主应用程序,对于早期版本,您需要通过Cookie API或Storage API手动编写。 值得考虑的是,在发布Instant App之前需要发布为数据迁移准备的应用程序。
- 要调试Instant App,您可以使用Android SDK中包含的Google Play Instant Development SDK中的特殊实用程序。
- 在终端设备上的控制台中发布的Instant App的外观可能会延迟半个小时到一天。 值得一提的是,可以明确确定现在从Play市场推出了哪个版本的Instant App。
- Instant App的版本代码不得超过主应用程序的版本代码。
- Instant App将可用的设备列表不应超过主应用程序可用的设备列表。 为此,您应该在清单文件中指定相同的权限,并注意由于辅助库而可能造成的限制。
仅此而已。 我希望这些信息对您有所帮助。 我将很高兴收到任何反馈!
有用的资料:
- Android开发人员上的Google Play即时文档
- 减少Instant App APK文件大小的提示
- Google Play即时常见问题解答
- Cookie迁移
- 使用存储API进行数据迁移