如何向您的应用程序添加多个即时应用程序功能

在这个由三部分组成的系列文章中,我们一直在探索Android即时应用程序,这是一项新功能,它提供了一种全新的方式来吸引当前尚未在其设备上安装您的应用程序的用户。 它可以通过在支持URL的任何位置(包括电子邮件,Google搜索结果,社交媒体平台上的帖子,YouTube评论和论坛)使您的应用程序可被发现和访问。

第一篇文章中 ,我们研究了即时应用程序是什么,它们如何工作以及它们为Android开发人员 Android应用程序用户提供的主要好处。 通过使用Android Studio的项目创建向导来快速,轻松地生成一个预先配置为支持Android即时应用程序的项目,我们甚至还获得了一些即时应用程序的动手经验。

第二篇文章中 ,我使用可下载的MyLocation示例应用程序演示了如何更新现有的Android项目以支持即时应用程序功能。 如果您从一开始就一直在遵循,那么到现在为止,您将成功地重新配置MyLocation项目,使其包括可以在任何Android虚拟设备(AVD)上运行的单个功能模块, 而无需安装完整的MyLocation应用。

但是,MyLocation当前仅包含一个基本功能模块,而在现实生活中的Android项目中,您通常会希望以即时应用程序形式提供多个功能。 在这最后一部分中,我将向您展示如何向Android项目中添加多个功能模块,逐步引导您向MyLocation添加第二个功能模块,然后将该模块映射到另一个URL。

最后,为了确保您能充分利用即时应用程序,我们将通过研究一些即时应用程序最佳实践来完善本系列文章。

创建多功能即时应用程序

如果您已完成第二期,那么您的MyLocation项目版本当前应划分为以下模块:

  • mylocation-app。 项目的可安装应用程序模块,也称为APK模块。
  • mylocation-base。 基本功能模块,包含所有项目所有模块中使用的所有通用代码和资源。 该模块包含一个MapsActivity ,该MapsActivity可以独立于可安装的应用程序运行,并在用户尝试访问www.example.com/maps URL时在用户的设备上启动。
  • mylocation-instantapp。 Instant App模块,负责将项目的每个功能模块转换为Instant App APK。

如果这不是您当前的MyLocation版本的外观,则可以从GitHub下载此版本

在开始向MyLocation添加第二个功能模块的过程之前,需要注意一些事项。

首先,在撰写本文时,只能使用Android Studio 3.0预览版和Canary版本开发即时应用。 每当您使用早期访问版本时,都应该准备好遇到bug,缺少功能以及其他通常会在稳定版本发布之前(希望如此)解决的奇怪行为。 但是,在Android Studio 3.0 Canary版本中,使用多个即时应用功能模块似乎特别有气质。

为了降低遇到任何问题的风险,在尝试向MyLocation项目中添加第二个功能模块之前,应仔细检查是否已安装了最新的Canary版本 。 但是,如果您的项目确实确实突然开始引发错误或拒绝编译,那么在本文结尾处,您将找到“疑难解答”部分,其中包含解决方法和针对添加额外功能模块时可能遇到的所有问题的可能修复程序到您的项目。

还要注意,在本教程中,我们将创建一个附加功能模块,将该模块映射到唯一的URL,然后在Android虚拟设备(AVD)上测试该模块。 这已经涵盖了很多基础,因此为了避免这篇文章过长,我们将创建一个仅显示用户界面并且不包含任何实际功能的模块。 但是,如果您想获得更真实的即时应用程序体验,没有理由不能使用自己的代码和资源在此模块上进行扩展。

创建功能模块

将MyLocation转换为多功能即时应用程序的第一步是创建我们的功能模块:

  • 在Android Studio中打开MyLocation项目。
  • 从Android Studio工具栏中选择新建>新建模块…
  • 选择功能模块 ,然后单击下一步
  • 模块名称字段中,输入mylocation-directions
  • 检查minimumSDK是否与您在项目中其他地方使用的相同,然后单击Next

我们可能没有在mylocation-directions模块中实现任何实际功能,但是我们仍然需要视觉确认该模块已正确加载,因此请选择您选择的模板(我选择Basic Activity ),然后单击Next 。 我将将此功能模块映射到www.example.com/directions ,因此首先在Instant App URL Host字段中输入example.com 。 打开“ 即时应用URL路由类型”下拉列表,然后选择PathpathPrefixpathPattern 。 由于我希望该模块响应www.example.com/directions ,因此我将选择Path

在“ 即时应用程序URL路由”中 ,输入/ directions 。 这为我们提供了完整的URL:example.com/directions。 将活动名称更改为DirectionsActivity 。 确保“ 布局名称”设置为activity_directions ,然后单击“ 完成”

使用Android Studios内置模块创建向导创建第二个功能模块

声明你的依赖

可能已经注意到,支持即时应用程序功能的项目不可避免地将包含多个模块。 如果这些模块将一起创建多个不同的Instant App APK, 以及您的“常规”可安装APK,则它们需要彼此了解,这意味着您需要向每个模块的build.gradle文件添加必要的依赖build.gradle

当您通过“ 新建”>“新建模块...”菜单创建功能模块时,Android Studio实际上会为您生成其中一些依赖关系,但并不会全部生成。 而且,根据情况,您需要使用不同的表达式,具体取决于要使用的模块的类型。

为了给您一个概览,每次创建功能模块时,都需要让您的项目知道:

  • 使用implementation project表达式,此功能模块取决于项目的基本功能模块。
  • 项目的基本功能模块使用feature project表达式依赖于此功能模块。
  • 项目的即时应用程序模块使用implementation project表达式依赖于此功能模块。

在本节中,我们将研究这些依赖关系中的每一个,因此,让我们从运行Android Studio会为您自动自动生成的依赖关系开始。

implementation project(':mylocation-base')

你的项目的基本功能模块包含了所有的通用代码和在你的项目中使用的资源,因此,任何额外的功能模块,创建将取决于这个单碱基功能模块。

如果打开功能模块的( mylocation-directionsbuild.gradle文件,则将看到Android Studio已添加基本功能模块( mylocation-base )作为依赖项:

dependencies {
...
...
...
   implementation project(':mylocation-base')

}

无论您创建了多少个附加功能模块,它们的所有build.gradle文件都将包含以下相同声明: implementation project(':mylocation-base')

feature project(":mylocation-directions")

您的基本功能模块还需要了解所有其他功能模块。

如果打开mylocation-base模块的build.gradle文件,则会看到Android Studio再次为您完成了工作,并将mylocation-directions声明为依赖项:

dependencies {
...
...
...
   feature project(":mylocation-directions")

您创建的所有其他功能模块也将自动添加到此部分,例如:

dependencies {
...
...
...
   feature project(":mylocation-directions")
   feature project(":mylocation-share")
   feature project(":mylocation-search")
Android Studio未添加的内容…。

Android Studio当前无法自动生成一些依赖项,因此您需要手动添加它们。

implementation project(':mylocation-directions')

即时应用程序是独立的组件,可以独立于可安装的应用程序运行。 在我们的MyLocation应用程序的上下文中,这意味着mylocation-directions可以在没有mylocation-app情况下mylocation-app 。 但是,事实并非如此:没有mylocation-directions mylocation-app无法运行。

可安装APK必须包含所有的项目的模块,包括所有的即时应用功能模块。 因此,我们需要给APK模块( mylocation-app )一个有关我们新功能模块( mylocation-directions )的提示。

打开mylocation-app build.gradle文件,并将其指向mylocation-directions模块:

dependencies {
   implementation project(':mylocation-base')

//Add the following line//

   implementation project(':mylocation-directions')

}

您需要为创建的每个功能模块重复此步骤,因此,如果继续添加功能模块,则mylocation-app build.gradle文件可能看起来像这样:

dependencies {
   implementation project(':mylocation-base')
   implementation project(':mylocation-directions')
   implementation project(":mylocation-share")
   implementation project(":mylocation-search")

}

Instant App模块负责将项目的每个功能模块转换为Instant App APK,因此它需要了解您创建的每个功能模块。

打开mylocation-instantapp模块的build.gradle文件,并使用implementation project表达式将mylocation-base声明为依赖项:

dependencies {
   implementation project(':mylocation-base')
   implementation project(':mylocation-directions')

}
还有一个额外的依赖

当我们讨论项目依赖项时,我们仍然需要添加一个重要的依赖项。

支持即时应用程序的项目只需在APK(应用程序)模块中声明一次applicationId属性即可。 但是,为了确保在所有功能模块之间正确传播此单个applicationId属性,您需要添加APK模块作为基本功能模块的依赖项。

使用application project表达式打开mylocation-base模块的build.gradle文件,并将mylocation-app添加为依赖项:

dependencies {
...
...
...

//Add the following line//

application project(":mylocation-app")

与我们讨论过的所有其他依赖项不同,您只需要在每个项目中一次声明一次对APK模块的依赖项,而无需在每次创建功能模块时声明一次。

删除不需要的文件和资源

尽管此步骤不是强制性的,但当前我们的功能模块确实包含一些不必要的文件和目录,因此让我们遵循最佳实践并简化mylocation-directions模块:

  • 切换到Android Studio的“ 项目”视图。
  • 打开mylocation-directions模块。
  • 删除src/androidTest目录。
  • 删除src/test目录。

完成映射您的URL

创建此功能模块时,我们输入了一些有关我们最终希望将此模块映射到的URL的信息。 但是,当前Android Studio的模块创建向导无法创建完整的URL映射,因此您需要打开App Links Assistant并手动完成此过程:

  • 从Android Studio工具栏中选择工具>应用链接助手
  • 单击“ 打开URL映射编辑器”按钮。
  • 在出现的表格中,选择DirectionsActivity行,然后单击铅笔小图标。
在“ URL到活动”映射编辑器中,选择DirectionsActivity
  • 选择http单选按钮。
  • 确保在下拉菜单中选择了路径 ,然后在随附的文本字段中输入/ directions
  • 确保在“ 活动”下拉列表中选择了DirectionsActivity ,然后单击“ 确定”
  • 返回“ App Links Assistant”面板中,单击“ 选择活动”按钮。
  • 出现提示时,选择DirectionsActivity ,然后单击插入代码

现在,您具有两个映射到不同URL的功能模块。

测试您的mylocation-directions模块

当前,我们的运行配置设置为模拟用户点击www.example.com/maps链接,这将启动MapsActivity ,并扩展我们的mylocation-base模块。 但是,如果我们要测试其他功能模块,则需要模拟用户点击www.example.com/directions ,这将启动DirectionsActivity 。 这需要我们更新运行时配置:

  • 启动您用来测试mylocation项目的AVD,并确保您已登录到Google帐户。 如果您尚未登录帐户,请打开AVD的启动器,选择Google应用,然后输入您的Gmail地址和密码。
  • 仔细检查该设备上未安装MyLocation应用。 如果是,请通过将其拖动到设备的“ 卸载”图标上进行卸载
  • 切换回Android Studio主窗口,然后选择运行>编辑配置…
  • 在左侧菜单中,选择mylocation-instantapp
  • 在“ URL”字段中,输入要测试的URL,在本例中为http://www.example.com/directions
  • 单击“ 应用” ,然后单击“ 确定”
  • 在Android Studio工具栏中,点击运行...。
  • 选择mylocation-instantapp
  • 选择您的目标设备,然后单击确定

现在,您的DirectionsActivity应该会出现在您的AVD上。 恭喜,您已经构建了一个多功能的即时应用程序!

故障排除

必须与错误和其他奇怪行为搏斗是使用Android Studio的早期访问版本的全部乐趣。

如果您的Android Studio构建确实很麻烦,并且您无法发现项目有任何问题,那么错误可能就在于Android Studio本身。

在本节中,我将分享一些在创建多功能即时应用程序时可能遇到的所有最常见的Android Studio错误和怪癖的解决方法。

而且,以防万一您遇到此处未列出的问题,我还将分享一些常规修补程序,这些修补程序可以帮助您消除Android Studio当前遇到的任何问题。

即时应用程序部署在API级别24和25上失败

首次尝试在运行Nougat的AVD上测试即时应用程序时,该应用程序可能无法部署。 如果发生这种情况,则:

  • 从Android Studio工具栏中选择运行>运行mylocation-instantapp
  • 在Android Studio有机会完成部署应用程序之前,请选择运行>停止
  • 再次选择运行>运行mylocation-instantapp ,但这一次使操作完成。 现在,您的即时应用程序应该可以正常部署了。
即时应用程序配置缓存的可靠性问题

如果在尝试部署应用程序时遇到即时应用程序配置缓存可靠性问题错误消息,那么这意味着您需要清除缓存:

  • 从Android Studio工具栏中选择运行>编辑配置…
  • 从左侧菜单中选择mylocation-instantapp
  • 选择即时应用程序配置 (在此窗口底部)。
  • 单击铅笔小图标。
  • 选择清除预配置的设备缓存
  • 单击确定 ,然后再一次应用确定
AAPT2问题

如果Android Studio抱怨与AAPT2相关的任何问题(例如显示AAPT2链接失败错误消息),则通常可以通过禁用APT来解决这些问题。

要禁用AAPT,请打开项目的Gradle scripts/gradle.properties文件并添加以下文本:

android.enableAapt2=false
错误:找不到(85)属性'android:splitName'

开发即时应用程序时,这很容易让人感到最沮丧,也是最奇怪的问题。

在某些Android Studio 3.0版本中,一旦开始向项目中添加更多功能模块,在模块名称中使用-字符就会突然成为问题。 由于许多Google即时应用程序示例(包括即时应用程序Codelabs)中的-字符功能,此错误尤其奇怪。

如果Android Studio确实开始抱怨android:splitName属性,请再次检查您是否正在运行最新版本的Android Studio 3.0。 您可能还可以通过清理然后重新构建项目来解决此问题。

如果问题仍然存在,那么作为最后的选择,您可能必须花一些时间遍历每个模块并删除-字符。

如果其他所有方法都失败了:
  • 清理并重建您的项目。 从Android Studio工具栏中选择Build> Clean Project ,然后选择Clean> Rebuild project
  • 尝试使用其他AVD。 如果在尝试将即时应用程序部署到AVD时遇到错误,则应测试在使用具有不同规格的AVD时是否仍然存在此问题。 放弃AVD而不至少验证为什么您的项目拒绝在此设备上运行并不是您想要带入生产应用程序的东西,但是在进行实验时,通常可以略微调整规则在Android Studio的早期访问版本中具有新功能。 特别是,与运行Android早期版本的AVD相比,在运行Android O的AVD上测试即时应用程序时,您可能会获得更大的成功。
  • 检查您是否没有错过任何更新。 在撰写本文时,Android Studio团队每周都会发布一个新的Canary版本,因此始终值得仔细检查一下您是否安装了最新版本的Android Studio 。 从理论上讲,每个新发行版都应修复在先前版本中发现的所有问题,因此,如果您没有运行最新版本,则可能是您遇到的问题已在较新的版本中得到解决。

分发您的即时应用

一旦完成了对即时应用程序项目的测试,接下来的步骤就是安排一些Alpha和Beta测试,然后就可以向公众发布您的应用程序了!

您可以通过Google Play控制台完成所有这些任务,如果您曾经发布过“常规”可安装应用程序,则此过程应该非常熟悉:

  • 导航到Play控制台
  • 上载您的应用程序(如果尚未上传)。
  • 打开Play控制台的侧面菜单,然后选择所有应用程序
  • 选择您要测试或发布的应用程序。
  • 从左侧菜单中选择Android Instant Apps

通过从Play控制台的左侧菜单中选择Android Instant Apps,为您的即时应用程序组件设置测试和分发

然后,您可以根据要测试或发布您的应用程序从以下跟踪类型中进行选择:

  • 即时应用预发布。 本部分包含将预发布候选版本发送到测试人员所需的所有设置。 请注意,要使用这些设置,您需要至少创建一个测试人员列表。 如果您尚未完成此步骤,则可以通过从Play控制台的侧菜单中选择设置>管理测试人员>创建列表创建列表
  • 即时应用开发。 本部分允许您将应用程序部署到测试人员。 同样,您需要至少创建一个测试人员列表才能使用此部分中的设置。
  • 即时应用制作。 对您的应用程序满意后,此部分包含准备,查看应用程序并将其发布到Google Play商店所需的一切。

故障排除

当您尝试发布具有即时应用程序支持的项目时,可能会遇到以下错误:

您的网站“ www.example.com ”尚未通过Digital Assets Link协议链接到您的应用。

如果发生这种情况,请检查:

  • 您的数字资产链接文件( assetlinks.json )是公开可用的,不受任何形式的身份验证,内部IP或防火墙的保护。
  • 映射到功能模块的所有URL均可从外部访问。 如果您的应用使用仅在内部可用的任何URL,则您将无法将其上传到Google Play控制台。
  • 您正在使用的域尚未与其他应用程序关联,因为当前多个即时应用程序无法使用同一域。
  • 您的服务器具有来自公共或受信任证书颁发机构的有效SSL证书。

最佳实践

即时应用程序是使用Android应用程序的全新方式,因此拥有自己的最佳实践也就不足为奇了。

在本节中,我们将通过查看一些即时应用最佳实践来确保您充分利用此新功能。

在要求用户登录之前提供尽可能多的功能

可安装应用程序要求用户在第一个屏幕上创建帐户并不是很不寻常,毕竟,如果用户已经承诺安装应用程序,那么他们不太可能会被该应用程序吓跑他们的电子邮件地址!

然而,即时应用程序是一个完全不同的故事,因为它可能使用户在不知道相关的应用程序的任何启动瞬间的应用模块。 想象一个朋友给您发送了一个链接,该链接的解释为零,然后点击该链接将启动即时应用程序。 您不知道此应用程序必须提供什么或由谁创建,但它会立即询问您的电子邮件地址-您有多大可能会提供此信息?

如果您的即时应用程序包含登录体验,那么您应该尝试尽可能长时间地延迟此登录对话框。 给用户更多时间来体验您的应用程序的内容和功能,将增加他们在出现提示时创建帐户的机会。

即使您的可安装应用程序围绕着用户创建帐户,您仍应尝试设计即时应用程序模块,以便用户在要求他们创建帐户之前,可以完成提示他们启动此模块的任务。

考虑您的切入点

大多数可安装的应用程序只有几个入口点-通常,这些入口点仅限于用户在启动您的应用程序时看到的第一个Activity,以及任何可以由隐式或显式意图启动的Activity。

即时应用程序有更多的切入点,因为每个功能模块都必须至少有一个入口点,并可能有多个入口点。

当您向应用程序添加即时应用程序支持时,您需要做出的最重要的决定之一就是哪个活动(或多个活动)将作为每个模块的最佳切入点。 您应该仔细选择入口点,因为理想情况下,每个入口点应该:

  1. 允许用户完成提示他们首先启动此模块的任务。
  2. 给可能是第一次体验您的应用的用户带来最佳的第一印象。
  3. 提供用户所需的所有上下文信息,以了解您的应用程序所提供的功能,以防万一有人使用零背景信息启动该模块的情况。

为从即时迁移到可安装的用户提供无缝体验

在所有即时应用程序模块和可安装的APK中,应用程序的用户界面,导航,功能和整体外观应保持不变。 如果您将某人的设备交给您的应用程序已经在运行,那么他们应该无法判断他们是在查看应用程序的即时版本还是可安装形式。

此外,任何尝试安装并安装您的应用程序的即时应用程序用户都应该能够准确地选择离开的地方。 例如,您可以使用Cookie或本地存储将存储的应用状态从即时应用转移到可安装的应用。

创建小型轻量级模块

由于即时应用程序是按需加载的,因此即时应用程序二进制文件的大小会对用户访问您的应用程序的容易程度产生巨大影响。

Android团队已将每个即时应用程序组件的大小限制为4 MB(这是功能模块的大小加上项目的基本功能模块的大小),但您应该尽可能使模块更轻便。

如果您正在努力简化特定的模块,请仔细查看该模块中包含的内容,因为有可能将单个模块重新加工为几个较小的独立模块。

切勿将Instant Apps用作可安装应用程序的广告

尽管您绝不应该将即时应用程序设计为仅将流量吸引到可安装应用程序,但是可以在即时应用程序中使用两种安装提示:

  • 隐式安装提示
  • 明确的安装提示

隐式安装提示是用户与之交互的UI元素,希望触发某个功能,而只会遇到安装提示。

这种方法让人想起Android的运行时权限模型,因为它允许您在上下文中发出安装提示。 获得正确的上下文,您永远不必解释为什么要显示特定的安装提示。 例如,如果用户在点击“ 与其他人共享此路由”按钮后遇到安装提示,则该消息将很明确:如果要访问此功能,则需要安装该应用程序。

只是不要被带走,以至于您的即时应用开始像可安装应用的广告。 如果您的应用程序不断用他们无法访问的功能来取悦用户,您的用户将很快感到沮丧,因此,每个即时应用程序模块最多只能将三个隐式安装提示限制在您自己的位置。 你也应该仔细考虑你的地方 ,这些安装提示,避免用户快速连续遭遇多个提示。

明确的安装提示是UI元素,当用户与它们进行交互时,它们显然会显示安装对话框,例如,前面带有“ Install app”的按钮。

所有明确的安装提示均应使用Material Design的“获取应用程序”图标 ,并且如果您包含任何支持文字,请谨慎选择字词,以免给您造成印象,即您的即时应用程序在某种程度上是“真实”应用程序的不完整或更小版本应用程序-避免说诸如立即升级之类的事情或安装完整的应用程序

考虑您要跟踪的指标

传统上,查看安装总数一直是衡量应用程序成功的最有效方法之一。 但是,当您添加的即时应用程序支持的一个项目,你不需要用用户安装的应用程序,这需要你重新思考你如何衡量这个应用程序的性能。

您可能需要测量与用户参与程度相关的指标,而不是计算安装次数,例如用户在您的应用程序中投入了多少时间,他们完成的任务总数或有多少用户重复访问了您的即时应用程序模块。

同样重要的是要记住,即使即时应用程序APK和可安装的APK是在同一项目中构建的,它们也代表了两种完全不同的使用应用程序的方式。 为了最准确地了解您的应用性能,您需要一种区分从即时应用程序组件收集的指标和从可安装应用程序收集的指标的方法。

结论

在这个由三部分组成的系列文章中,我们研究了如何向Android应用程序添加即时应用程序支持。 如果您从一开始就一直遵循,那么您将成功创建一个由两个即时应用组成的项目,这些应用由不同的URL触发。

如果您想获得更多有关即时应用程序的经验,则可以继续向该项目添加功能模块,或者着手扩展mylocation-directions模块,以便它提供一些实际功能。

翻译自: https://code.tutsplus.com/tutorials/how-to-add-multiple-instant-app-features-to-your-app--cms-29394

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值