如何在安卓系统中测试应用内更新?

43

最近,Google在2019年的Google I/O大会上推出了“应用内更新”功能。

因此,我正在尝试使用它。

val appUpdateManager = AppUpdateManagerFactory.create(this)
val appUpdateInfo = appUpdateManager.appUpdateInfo
appUpdateInfo.addOnCompleteListener {
    val result = it.result
    if (result.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
            && result.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {

        info("should show update")
        appUpdateManager.startUpdateFlowForResult(
                        result,
                        AppUpdateType.FLEXIBLE,
                        this,
                        1)
    } else {
        info("This is already latest version: ${result.updateAvailability()}")
    }
}

但是 result.updateAvailability() 总是返回 UpdateAvailability.UPDATE_NOT_AVAILABLE

为了达到这个目的,我使用之前版本代码创建了一个签名发布 apk。但是它没有起作用。

根据这个开发者主题演讲(16:40 ~)中的演示。

他是在模拟器上进行的。 看起来像是调试模式。

我如何做到同样的事情呢?

14个回答

84

使用内部应用程序共享进行测试

测试应用更新的正确方式是使用内部应用程序共享(不要与内部测试轨道混淆)。

  1. 首先,按照这些说明设置您的内部应用程序共享。与内部测试轨道不同,内部应用程序共享会立即使应用程序可用,因此无需等待时间。
  2. 选择加入 Google Play 的应用程序签名。这将允许 Google Play 对您提供的应用程序包中为设备生成的 APK 进行签名。详细信息请查看此处
  3. 构建您的应用程序包。通过命令行,只需运行 ./gradlew bundleRelease./gradlew bundle<variant>
  4. 转到https://play.google.com/apps/publish/internalappsharing/并上传存储在app/build/outputs/bundle/<variant>/下的生成的aab文件。给出包括版本代码的名称。
  5. 这将提供一个链接进行复制。使用它将此包安装到您的设备上。
  • build.gradle中增加应用程序的版本代码并构建另一个包。注意:版本代码是整数,这就是要递增的内容。版本名称不同,对此无关紧要。
  • 同样将此新的 bundle 上传到内部应用程序共享。将其命名为版本代码。
  • 这将提供另一个链接。打开链接,这将打开 Google Play 并且您应该会看到“更新”选项。 不要单击更新!
  • 打开您的应用程序,现在您应该可以看到应用内更新提示。
  • 如果您没有看到提示如果您完全遵循了这些步骤,那么很可能存在代码问题。添加一些日志以查看代码中发生了什么。

    在我们的测试中,以下操作不会帮助测试应用内更新(在其他地方建议使用):

    • 重新上传相同的 bundle/apk 而不增加版本代码
    • 将版本代码减少到低于已发布版本

    使用 Alpha (内测渠道) 进行测试

    一旦通过内部应用程序共享进行测试成功后,我仍然发现在已发布的版本中测试应用内更新时还有一些问题。经过一些尝试,我成功地通过 Alpha 渠道进行了测试。我在此添加步骤(假定您熟悉 Google Play 控制台的 Alpha 内测渠道并将自己添加到 Alpha 测试人员列表中):

    1. 通过Google Play安装应用的当前版本。可以来自生产轨道、α测试轨道或β测试轨道。这个版本应该已经实现了应用内更新功能,因为这是期望在应用内更新提示中显示的版本。
    2. 确保自动更新仅对您的应用程序禁用。您可以通过Google Play应用程序中应用程序商店列表的菜单项来完成此操作。我们禁用自动更新,因为我们真正希望通过应用内更新来更新应用程序,而不是在设备充电时Google Play更新应用程序。
    3. 将新版本(使用递增的版本代码,更改版本名称无关紧要)发布到Alpha测试轨道。
    4. 现在,在发布的版本出现在Google Play上之前需要一段时间。您可能需要等待几个小时。
    5. 一旦它出现在Google Play商店中,您可以尝试打开应用程序。如果应用内更新提示出现,您会很幸运。最有可能的情况是不会出现应用内更新提示,即使您继续等待几个小时并不断重启应用程序。通过遵循接下来的步骤,我不必等待。
    6. 完全关闭您的应用程序。
    7. 完全关闭Google Play应用程序。
    8. 清除Google Play应用程序的缓存。我发现无需清除存储,只需清除缓存即可。
    9. 打开Google Play并从导航面板转到我的应用与游戏
    10. 现在,Google Play将搜索更新。您的应用程序更新应该会显示出来。当然,不要在此处进行更新。
    11. 打开您的应用程序。应该会出现应用内更新提示。如果没有,请使用内部应用共享(在前面一节中有步骤)测试您的应用内更新,并确保您的实现没有问题。

    我想类似的过程也适用于Beta(公开轨道)和生产轨道。

    即使在通过Google Play提供更新后,要让最终用户看到应用内更新,可能需要相当长的时间(几天!)。Google Play有其自己混乱的方式。祝你好运。


    1
    重新上传相同的捆绑包/APK而不增加版本代码——他们本可以在SURE的文档中更好地说明这一点!这就是我的问题所在!谢谢,现在可以工作了 :) - Dennis Anderson
    嘿,我使用了你的流程,但每次更新可用性都显示为1(UPDATE_NOT_AVAILABLE)。我将版本代码从2.49更新到2.49.1,然后上传了apk。还有其他需要考虑的事情吗? - Shivam Pokhriyal
    1
    版本代码只是一个整数。你想要更改的是版本名称,这只是为了我们人类而设定的。 - rpattabi
    我认为可以使用内部轨道,但从未尝试过。 Alpha的说明应该有效。如果你让我知道你的结果,我会更新答案。 - rpattabi
    1
    非常感谢。内部应用程序共享是测试这个的最佳方式。我曾经认为我无法使其工作或测试。 - Amg91
    显示剩余4条评论

    13
    这已经有点晚了,但它可能会帮助其他开发人员。
    截至今天,在调试版本中无法进行应用内更新测试。您也不需要将apk放到PlayStore上进行测试。测试in-app-update的最佳方法是使用internal-app-sharing。
    如果按照下面的步骤一步一步地操作,您将能够成功测试。
    1.为了测试应用程序,测试人员必须首先在PlayStore中启用Internal-App-Sharing,请参阅以下链接:如何启用Android的内部应用程序共享? 2.如果您足够勇敢,可以理解官方文档,请按照以下链接设置in-app-update测试:https://developer.android.com/guide/playcore/in-app-updates#internal-app-sharing 3.在完成在Play商店中设置内部应用程序共享后,请确保您上传了2个apk到Play Console上的内部应用程序共享,并生成了2个链接。两个apk都将使用相同的签名密钥进行签名(不需要与您用于生产的签名密钥相同,任何虚拟的签名密钥都可以工作)。
    4.首先,您需要上传一个具有较低VersionCode(例如100)的包含in-app-update实现的apk到Play Console上的内部应用程序共享。
    5.要了解如何将apk上传到Play Console上的内部应用程序共享,请参阅以下链接:https://support.google.com/googleplay/android-developer/answer/9844679?visit_id=637437125318137239-1277036129&rd=1 注意:在您的设备中卸载任何具有相同包名称的预安装应用程序。
    6.现在,您可以复制您在Play Console上上传到internal-app-sharing的应用程序的链接,并使用此链接在您的设备上安装该应用程序。
    注意:在安装之前,请确保您在Play商店上使用的电子邮件已添加到Play Console上的内部应用程序共享邮件列表中。
    1. 现在,你已经使用链接安装了应用程序。现在,你需要再次创建一个带有更高VersionCode的新签名apk文件(例如101)。并将此apk上传到内部应用程序共享。

    2. 现在,从内部应用程序共享中复制具有更高VersionCode的链接。在设备上单击此链接,它将带您进入Play商店,但是这次,更新按钮将启用,而不是安装按钮,因为应用程序已经以较低的VersionCode安装在您的设备上。

    3. 您无需在Play商店上点击更新按钮,只需单击链接即可打开Play商店上的屏幕。现在关闭Play商店应用程序。

    4. 现在,您可以从设备上启动已安装的应用程序。

    如果您的应用内更新实现正确,则启动应用程序将显示来自Play商店的更新对话框。

    最后,如果这篇文章对您有帮助,请不要忘记点赞。继续编码!


    侧面说明:内部版本号必须大于公共应用程序的版本号,否则将安装公共版本。 - andreszs

    13

    请查看FakeAppUpdateManager文档,或者尝试下面预定义的方法来测试应用程序更新是否可用。

    FakeAppUpdateManager fakeAppUpdateManager = new FakeAppUpdateManager(this);
            fakeAppUpdateManager.setUpdateAvailable(1); // add app version code greater than current version.
            fakeAppUpdateManager.getAppUpdateInfo().addOnSuccessListener(new OnSuccessListener<AppUpdateInfo>() {
                @Override
                public void onSuccess(AppUpdateInfo appUpdateInfo) {
                    if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
                            && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
                        System.out.println("checkForAppUpdateAvailability");
                    }
                }
            });
    

    8

    或者,您可以使用这个类作为模拟应用内更新的单元测试。

    FakeAppUpdateManager

    它具有一些预定义方法。


    1
    如何使用FakeAppUpdateManager类测试应用程序。您可以告诉我吗? - Manikandan K
    创建一个fakeAppUpdateManager对象,并将setAvailableUpdate设置为1。 - Bawa
    4
    FaceAppUpdateManger 只用于单元测试,只需进入正确的条件分支,并不会启动任何更新流程或其他操作。 - AmirahmadAdibi
    但它解决了问题,让你假装它正常工作了,对吧? - Cyph3rCod3r

    7

    在我的情况下,我已经完成了以下步骤:

    1. 从设备中卸载原始应用。
    2. 从Google Play商店安装应用程序(如果您没有该应用,可以创建Alpha或Beta版本,而不将其发布到商店)。
    3. 再次卸载应用程序。
    4. 使用具有较低versionCode的新功能生成已签名的apk。
    5. 安装此apk。

    启动时,它会检查Google Play商店中的新版本,并显示用于更新的助手。如果此解决方案在一个设备上有效,但在另一个设备上无效,请尝试使用相同的Google帐户登录,并在该设备上再次尝试5个步骤。然后您可以再次使用原始帐户。由于某种疯狂的原因,似乎Google Play“激活”了版本控制,并在其他设备上返回可用版本。

    我不确定确切的行为...


    1
    apk文件签名的差异怎么办?Google Play会对您上传的apk应用进行自己的签名,因此第2步生成的apk与第4步生成的apk将具有不同的签名。 - Vadim Kotov
    位于 Google Play 的 APK 应该使用与您生成的新 APK 相同的签名进行编译。 - fvaldivia
    1
    如果您使用Google Play应用签名,那么您无法实现这一点:Google Play会重新签署您上传的每个APK,因此会存在不匹配的情况(您无法使用它来签署第4步的apk)。 - Vadim Kotov
    1
    如果您使用Google Play应用签名,请查看此答案:https://dev59.com/_1MI5IYBdhLWcg3wfrhs#59266778 - rpattabi

    4

    嗯... 我找到了解决办法。 它与 Google I/O 2019 - Developer Keynotes 上的演示不同。

    我将已签名的发布 apk 发布到内部开发者版本中。 现在它可以正常工作。

    或者你也可以将其发布到“Alpha/Beta 封闭测试发布”中。


    4
    我已经上传到内部应用程序共享,但是appUpdateInfo.updateAvailability()始终返回1,即UPDATE_NOT_AVAILABLE。 - Mangesh Kadam
    3
    很奇怪,我已经发布了,但是仍然提示“UPDATE_NOT_AVAILABLE”。这对我也是一样的情况。 - yoonhok
    2
    尝试使用版本增量进行测试版上传,这样会起作用。同时确保您使用的是与生产发布相同的密钥库文件。这可能需要一些时间,但会起作用。 - Mangesh Kadam
    1
    @MangeshKadam 减少版本代码似乎无法正常工作(使用生产密钥库)。 - w3bshark
    1
    @AravindhanGs 目前由于时间问题,我不打算采用这种解决方案,但我想出了另一种方法——制作自己的自定义配置 JSON 文件,并将最低构建号设置为您要支持的用户,然后每次启动闪屏时调用并检查您的构建号以配置一个并执行操作。我想根据我的需求强制更新用户。 - hiashutoshsingh
    显示剩余7条评论

    3

    我不知道你是否已经明白了,但在进行一些测试后,我发现降低versionName是我需要做的,才能正确地进行测试。之前我只降低了versionCode...

    我认为API应该能够处理versionNameversionCode过时的情况,但显然它不能。


    就像我之前所说的那样,我可以在将应用程序发布到Play商店时使用特定版本进行测试,并在本地的“build.gradle”中手动减少“versionName”,然后运行它。如果没有发布应用程序,我将无法正确进行测试。 - Caio Melo
    1
    versionName 不应该有任何影响,它只是一个可读的版本代码,可以是任何东西,包括一首短诗。 - Brill Pappin

    3
    1. 使用低版本生成已签名的应用捆绑包,并从Play控制台上传到内部应用程序共享。
    2. 使用生成的链接在您的设备上安装该应用程序。
    3. 再次生成一个版本号和版本号比先前版本高的应用捆绑包。
    4. 将其上传到内部应用程序共享。
    5. 打开新生成的链接,但不要从Play商店更新应用程序。
    6. 再次打开旧应用程序。
    7. 现在,您将可以在旧版本的已安装应用程序中看到更新弹出窗口。

    注意 - 使用内部应用程序共享安装的应用程序即使版本更高也无法升级为正式应用程序。

    我正在使用这个来简化应用内更新。


    2
    你可以按照以下方式使用FakeAppUpdateManager:
    val appUpdateManager : AppUpdateManager
        if (BuildConfig.DEBUG) {
          appUpdateManager = FakeAppUpdateManager(baseContext)
          appUpdateManager.setUpdateAvailable(2)
        } else {
          appUpdateManager = AppUpdateManagerFactory.create(baseContext)
        }
    

    使用这个方法,当应用程序启动时,您将使用Play Store的AppUpdateManager,而在本地测试时使用FakeAppUpdateManager。
    setUpdateAvailable中的数字2对应于应用程序版本代码。它可以是任何数字,只要它比您在build.gradle中定义的版本代码高即可。
    现在,为了模拟立即更新:
    val fakeAppUpdate = manager as FakeAppUpdateManager
      if (fakeAppUpdate.isImmediateFlowVisible) {
        fakeAppUpdate.userAcceptsUpdate()
        fakeAppUpdate.downloadStarts()
        fakeAppUpdate.downloadCompletes()
        launchRestartDialog(manager)
      }
    

    2
    在Google Play控制台中,内部测试轨道是测试应用内更新时非常实用的工具。"Original Answer"翻译成"最初的回答"。

    4
    如果您描述所需的步骤,那么这将是一个更好的答案。 - nasch
    1
    请点击以下链接 https://support.google.com/googleplay/android-developer/answer/3131213?hl=en - Gulzar Bhat
    发布到内部测试轨道需要很长时间。以前只需要几分钟,但现在似乎需要几天!所以不太实际。 - rpattabi

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接