Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

如何在APP中添加多个即时应用功能

by
Difficulty:AdvancedLength:LongLanguages:

Chinese (Simplified) (中文(简体)) translation by Zhang Xiang Liang (you can also view the original English article)

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

第一篇文章中,我们研究了即时应用程式,他们的工作原理以及Android开发人员和 Android应用程式使用者所带来的主要优势。我们甚至通过使用Android Studio的项目创建向导快速轻松地生成一个预配置为支持Android即时应用的项目。

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

然而,MyLocation目前只包含一个单一的基础功能模块,当涉及到现实生活中的Android项目时,您通常希望在即时应用程序表单中提供多个功能。在最后一部分中,我将展示如何通过向MyLocation添加第二个功能模块,然后将该模块映射到其他URL,向Android项目添加多个功能模块。

最后,为了确保您能够充分利用即时应用程序,我们将通过查看即时应用程序最佳实践来整理这个系列。

创建多功能即时应用程序

如果您已完成本系列的第二篇,那么您的MyLocation项目版本应该分为以下模块:  

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

如果这不是您的MyLocation版本当前的结构,那么您可以从GitHub下载此版本。 

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

首先,在撰写本文时,只能使用Android Studio 3.0 Preview和Canary版本开发即时应用程序。 每当您使用早期访问构建时,您应该准备在稳定版本之前遇到错误、缺少功能以及其他一般奇怪的行为(希望!)被解决。 然而,在Android Studio 3.0 Canary版本中,使用多个即时应用程序功能模块这些问题似乎尤为显着。

为了减少遇到问题的风险,您应该在尝试将第二个功能模块添加到MyLocation项目之前仔细检查是否安装了最新的Canary build。但是,如果你的项目没有突然启动引发错误或拒绝进行编译,然后到这个文章的末尾,你会发现一个包含添加额外的功能模块时很可能会遇到问题的故障排除部分。 

另请注意,在本教程中,我们将创建一个附加功能模块,将该模块映射到唯一的URL,然后在Android虚拟设备(AVD)上测试该模块。我们将要创建一个简单地显示用户界面并且不包含任何实际功能的模块。 但是,如果您想要更真实的即时应用程序体验,则必须使用自己的代码和资源来扩展此模块。 

创建您的功能模块

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

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

我们可能没有在mylocation-directions 模块中实现任何真正的功能,但是我们仍然需要可视化确认此模块已正确加载,因此请选择所需的模板(我正在选择 Basic Activity),然后单击  下一步。 我要将此功能模块映射到  www.example.com/directions,因此首先 在  即时应用程序URL主机  字段中输入  example.com。打开“  即时应用程序URL路由类型”  下拉列表,然后选择“  路径”,“  pathPrefix ”或“  pathPattern”。因为我想让这个模块只回应  www.example.com/directions ,我要选择  路径。 

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

Create a second feature module using Android Studios built-in module creation wizard

声明你的依赖 

您可能已经注意到,支持即时应用功能的项目不可避免地将由多个模块组成。如果这些模块要共同创建多个不同的Instant App APK,  再加上 “常规”可安装的APK,那么他们需要彼此了解,这意味着您需要为每个模块的build.gradle文件添加必要的依赖关系。

当您通过新建>新建模块...菜单创建功能模块时,Android Studio实际上会为您生成一些这些依赖项,但不会生成所有这些依赖项。而且,为了进一步复杂的事情,您需要使用不同的表达式,具体取决于您正在使用的模块类型。

每当你创建一个功能模块,你需要让你的项目知道:

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

在本节中,我们将看看这些依赖关系,所以让我们先来看看Android Studio为您自动生成的依赖关系。  

implementation project(':mylocation-base')

你的项目的基本功能模块包含的所有项目中使用的通用代码和资源,那么创建的额外功能模块将依赖该基本功能模块。 

如果您打开了功能模块的(mylocation-directions)build.gradle文件,那么您将看到Android Studio已经添加了基本功能模块(mylocation-base)作为依赖关系:

无论您创建多少额外的功能模块,它们的所有build.gradle文件将包含相同的声明:implementation project(':mylocation-base')。

feature project(":mylocation-directions")

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

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

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

Android Studio不添加的内容...

Android Studio目前不会自动生成一些依赖关系,因此您需要手动添加它们。

implementation project(':mylocation-directions')

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

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

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

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

即时应用程序模块负责将每个项目的功能模块转换为Instant App APK,因此需要知道您创建的每个功能模块。 

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

额外的依赖

当我们处于项目依赖关系的时候,我们还需要添加一个重要的依赖关系。 

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

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

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

删除不需要的文件和资源

虽然这一步并不是强制性的,但是目前我们的功能模块确实包含一些不必要的文件和目录,所以让我们遵循最佳实践并简化我们的mylocation-directions模块:

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

映射URL

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

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

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

测试mylocation-directions模块

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

  • 启动一直在使用的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构建进入 haywire,并且您无法发现项目有任何错误,那么这可能是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链接失败的错误消息),那么您通常可以通过禁用AAPT来解决这些问题。

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

Error:(85) attribute 'android:splitName' not found

这很容易令人沮丧,是开发即时应用程序时可能遇到的最奇怪的问题。 

在Android Studio 3.0的一些版本中,一旦您开始向项目添加更多功能模块,使用模块名称中的 - 字符就会突然变成问题。这个错误特别奇怪,由于 - 字符在许多Google的即时应用示例中的角色特征中,包括即时应用Codelabs。 

如果Android Studio开始对该android:splitName属性报错,请仔细检查一下您运行的是最新版本的Android Studio 3.0。您也可以通过cleaning然后重建项目来解决此问题。

如果问题仍然存在,那么最后的手段是,您可能需要花费一些时间来遍历每个模块并删除 - 字符。  

如果所有其他的失败了:

  • 清理并重建项目。从Android Studio工具栏中选择Build> Clean Project,然后选择Clean> Rebuild project
  • 尝试不同的AVD。如果您尝试将即时应用程序部署到AVD时遇到错误,那么在使用具有不同规格的AVD时,您应该测试此问题是否仍然存在。虽然没有验证为什么你的项目被拒绝设备上运行就放弃AVD不是你想要的。 特别是,与运行Android较早版本的AVD相比,运行在Android O的AVD上测试即时应用程序时获得更多成功。 
  • 检查你没有遗漏更新。在撰写本文时,Android Studio团队每周发布一个新的Canary版本,因此,请务必仔细检查一下,是否安装了最新版本的Android Studio。 理论上说,每一个新版本都应该修复上一个版本中发现的所有问题,所以如果你没有运行最新的版本,那么你遇到的问题可能已经在最近的版本中被修复了。 

分发即时应用程序

完成即时应用程序测试后,下一步将安排一些Alpha和Beta测试,然后您就可以在公众场合发布应用了! 

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

  • 导航到播放控制台
  • 如果你还没有上传你的应用程序。
  • 打开播放控制台的侧面菜单,然后选择所有应用程序
  • 选择要测试或发布的应用程序。 
  • 从左侧菜单中选择Android Instant Apps。 

Setup testing and distribution for your instant app components by selecting Android Instant Apps from the Play Consoles left-hand menu

然后,您可以从以下渠道类型中进行选择,具体取决于您是要测试还是发布应用程序: 

  • 即时应用程式预发行。本部分包含将预发行候选人发送给测试人员所需的所有设置。请注意,为了使用这些设置,您需要创建至少一个测试人员列表; 如果您尚未完成此步骤,则可以通过从播放控制台的侧面菜单中选择设置>管理测试者>创建列表来创建列表。 
  • 即时应用开发。此部分允许您将应用程序部署到测试人员。同样,您需要至少创建一个测试人员列表,以便使用本节中的设置。  
  • 即时应用制作。一旦您对自己的应用感到满意,本部分将包含准备、审核并将您的应用发布到Google Play商店所需的一切。 

故障排除

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

Your site 'www.example.com” has not been linked through the Digital Assets Link protocol to your app.

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

  • 您的Digital Asset链接文件(assetlinks.json)是公开的,不受任何形式的身份验证、内部IP或防火墙的保护。 
  • 映射到功能模块的所有URL都可以从外部访问。如果您的应用程式使用任何只能在内部使用的网址,则无法将您的应用程式上传到Google Play Console。
  • 您所使用的域名尚未与另一个应用程序相关联,因为目前多个即时应用无法使用相同的域。 
  • 您的服务器具有来自公共或受信任的证书颁发机构的有效的SSL证书。 

最佳实践

即时应用程式是消费Android应用程式的全新方式,所以毫不奇怪他们有自己的最佳实践。

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

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

安装应用程序要求用户在第一个界面上创建一个帐户并不常见 - 毕竟,如果用户已经安装了应用程序,那么它们不太可能被该应用程序请求他们的邮箱地址时吓倒!

然而,即时应用是一个完全不同的故事,因为用户可以在不知道相关应用的任何内容的情况下启动即时应用模块。想象一下,一位朋友向您发送了一个无解释的链接,并点击该链接启动即时应用程序。 你不知道这个应用程序有什么提供或创建,但它立即要求你的电子邮件地址 - 你有多大的可能交出这些信息?

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

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

考虑你的入口

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

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

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

  1. 允许用户首先完成提示他们启动此模块的任务。
  2. 为可能第一次遇到您的应用的用户提供最佳的第一印象。
  3. 提供用户需要了解您的应用程序所提供的所有上下文,以防有人启动此模块时应用程序的背景信息为零。 

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

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

此外,任何即时应用程式使用者,如果离开或安装您的应用程式,应该能够准确地掌握他们离开的地方。例如,您可以使用Cookie或本地存储将存储的应用程序状态从即时应用程序传输到可安装的应用程序。 

创建小型,轻型的模块

由于即时应用程序是按需加载的,所以即时应用程序二进制文件的大小对用户可以轻松访问应用程序的方式有很大的影响。  

Android团队对每个即时应用程序组件(即功能模块的大小以及项目的基本功能模块)都规定了4 MB的限制,但是如果有可能您应该设法使模块更轻便。 

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

不要将Instant Apps作为可安装应用的广告

尽管您不应该仅仅设计一个即时应用程序来驱动可安装的应用程序的流量,但您可以在即时应用中使用两种安装提示: 

  • 隐式安装提示
  • 显式安装提示

隐式安装提示是用户与预期触发特定功能交互的UI元素,仅代替安装提示。

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

只是不要忘记,直到您的即时应用程序开始感觉像您的可安装应用程序的广告。如果您的应用程序不断使用无法访问的功能来对其进行挑逗,那么您的用户将很快就感到沮丧,因此每个即时应用程序模块最多限制三个隐式安装提示。 你也应该仔细考虑在那里你把这些安装提示,避免用户快速连续遇到多个提示。 

显式安装提示是UI元素,当用户与他们进行交互时,会显示一个安装对话框,例如一个带有“安装应用”的按钮。 

所有显式的安装提示应使用 Material Design "get app" 图标,如果您包含任何支持的文本,请仔细选择您的单词,以避免创建您的即时应用程序以任何不完整或较小版本的“真实”应用程序,所以避免说现在升级现在或安装完整的应用程序! 

考虑您要跟踪的指标

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

您可能希望衡量与用户互动水平相关的指标,例如用户投入应用的时间,完成的任务总数,或多少用户重复访问即时应用模块。 

还要记住,尽管即时应用APK和可安装的APK是从同一个项目构建的,但它们代表了两种完全不同的消费应用程序的方法。为了更准确地了解您的应用的性能,您需要一种区分从即时应用程序组件收集的指标和从可安装应用程序收集的指标之间的差异。 

结论

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

如果您想获得更多的即时应用经验,那么您可以继续为此项目添加功能模块,或者在扩展mylocation-directions模块方面进行工作,以提供一些真正的功能。 

在此期间,请查看我们在Android应用程序开发中的其他一些帖子!

关注我们的公众号
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.