【问题标题】:How can I test In-app updates in Android?如何在 Android 中测试应用内更新?
【发布时间】:2023-04-06 22:17:01
【问题描述】:

最近,Google 在 Google I/O 2019 中引入了“应用内更新”。

所以我正在尝试使用它。

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。 但它不起作用。

根据Developer Keynote (16:40 ~ )上的demo

他是用模拟器做的。 它看起来像调试模式。

我怎样才能做同样的事情?

【问题讨论】:

  • 你有什么解决办法吗? @yoonhok

标签: android google-play in-app-update google-play-core


【解决方案1】:

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

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

  1. 首先在these instructions 的帮助下设置您的内部应用共享。与内部测试跟踪不同,内部应用程序共享使应用程序立即可用。所以没有等待时间。
  2. 选择加入 Google Play 应用签名。这将允许 google play 签署从您提供的应用程序包为设备生成的 apk。详情here
  3. 构建您的应用程序包。通过命令行,就是./gradlew bundleRelease或者./gradlew bundle<variant>
  4. 转到https://play.google.com/apps/publish/internalappsharing/并上传生成的aab文件,该文件位于app/build/outputs/bundle/<variant>/下。取一个包含版本代码的体面名称。
  5. 这将提供一个复制链接。使用它来将此捆绑包安装到您的设备上。
  6. 在您的应用程序build.gradle 中添加版本代码并构建另一个包。注意:版本代码是整数,这是要递增的。版本名称不同,这无关紧要。
  7. 同样将此新捆绑包上传到内部应用程序共享。用版本号命名。
  8. 这将提供另一个链接。打开链接,这将打开 google play,您应该会看到“更新”选项。 不要点击更新!
  9. 打开您的应用,现在您应该会看到应用内更新提示。

如果您没有看到提示并且如果您完全按照这些步骤操作,则很可能是您的代码存在问题。添加一些日志以查看您的代码中发生了什么。

在我们的测试中,以下内容无助于测试应用内更新(在其他地方建议):

  • 重新上传相同的包/apk 而不会增加版本代码
  • 将版本代码降低到低于发布的版本

使用 Alpha 进行测试(封闭轨道)

通过内部应用共享测试成功后,我仍然发现通过发布版本测试应用内更新有些问题。经过一些试验,我能够成功通过 Alpha 轨道进行测试。我在这里添加步骤(我假设您熟悉 Google Play 控制台的 Alpha 封闭轨道并将您自己添加为 alpha 测试人员列表):

  1. 通过 Google Play 安装当前版本的应用程序。这可以来自生产轨道或 alpha 或 beta 轨道。此版本应该已经实现了应用内更新功能,因为这是预计会显示应用内更新提示的版本。
  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 有自己令人困惑的方式。祝你好运。

【讨论】:

  • 在不增加版本代码的情况下重新上传相同的包/apk - 他们本可以在 SURE 的文档中更好地说明这一点!这是我的问题!谢谢现在工作:)
  • 嘿,我使用了您的流程,但更新可用性每次都为 1(UPDATE_NOT_AVAILABLE)。我将版本代码从 2.49 更新到 2.49.1,然后上传了 apk。还有什么需要考虑的吗?
  • 版本代码只是一个整数。您要更改的是仅适用于我们人类的版本名称。
  • 它适用于内部测试跟踪,但不适用于生产,仍然得到 UPDATE_NOT_AVAILABLE
  • @Shikhar 我知道在生产的情况下获得应用内更新提示并不容易,因为在 Google Play 通知应用有关更新之前需要延迟和等待。我添加了一个用于通过 alpha、beta 或生产轨道进行测试的部分,无需太多等待。希望这会有所帮助。
【解决方案2】:

这为时已晚,但它可能会帮助其他开发人员。

截至今天,无法对调试版本进行应用内更新测试。您也不需要将您的 apk 放到 PlayStore 进行测试。测试in-app-update 的最佳方法是使用internal-app-sharing

如果您按照以下步骤逐一执行,您将能够成功测试。

  1. 要测试应用程序,测试人员必须首先在 PlayStore 中启用 Internal-App-Sharing,点击此链接,How to Enable Internal App Sharing for Android?
  2. 如果你有足够的勇气看懂官方文档,那么只需点击这个链接在你的设备中设置in-app-update测试,https://developer.android.com/guide/playcore/in-app-updates#internal-app-sharing

在这里,我将用简单的文字写下相同的内容。

Play-Store 中设置好internal-app-sharing 后,请确保您必须将2 个apk 上传到Play-Console 上的internal-app-sharing,从而生成2 个链接。两个 apk 都将使用相同的 signing-key 进行签名(不必与您用于为生产签名的那个相同,任何虚拟签名密钥都可以使用)。

  1. 首先,您将具有较低版本代码(例如 100)的应用内更新实现的 apk 上传到 Play 控制台上的内部应用共享。

要了解如何在 Play-Console 上将 apk 上传到 internal-app-sharing,请关注此 lisk,https://support.google.com/googleplay/android-developer/answer/9844679?visit_id=637437125318137239-1277036129&rd=1

注意:确保您已卸载设备中任何具有相同包名的预安装应用程序。

  1. 现在您将上传的应用的链接复制到 Play 控制台上的 internal-app-sharing 并使用此链接在您的设备上安装该应用。

注意:在安装之前,请确保您在 play-store 上使用的电子邮件 ID 已添加到 play-console 上 internal-app-sharing 的邮件列表中。

  1. 现在,一旦您使用该链接安装了该应用程序。现在,您需要再次创建一个具有更高版本代码(例如 101)的新签名 apk。并将此 apk 上传到 internal-app-sharing。

  2. 现在,从 internal-app-sharing 复制具有更高版本代码的链接。在您的设备上单击此链接,它将带您到 Play-store,但这次,update 按钮将被启用,而不是 install 按钮,因为您的设备中已经安装了较低版本代码的应用程序。

  3. 您不必单击 PlayStore 上的更新按钮。您只需单击链接,然后在 PlayStore 上打开屏幕。现在关闭 PlayStore 应用。

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

如果您的应用内更新实现正常,启动应用会出现来自 PlayStore 的更新对话框。

最后,如果它对您有任何帮助,请不要忘记点赞。保持 编码!

【讨论】:

    【解决方案3】:

    或者,您可以将此类用作 UNIT 测试以模拟应用内更新

    FakeAppUpdateManager

    这有一些预定义的方法。

    【讨论】:

    • 如何使用 FakeAppUpdateManager 类测试应用程序。请告诉我
    • 创建一个 fakeAppUpdateManger 对象并将 setAvailableUpdate 设为 1
    • FaceAppUpdateManger 仅用于单元测试,只需转到正确的 if 条件,不会启动任何更新流程或其他任何内容。
    • 但它解决了目的,让你假装它工作正常?
    【解决方案4】:

    就我而言,我已经完成了接下来的步骤:

    1. 从设备上卸载原始应用程序。
    2. 从 Google Play 商店安装应用程序(我的应用程序已经在商店中,但如果你没有,你可以创建一个 alpha 或 beta 版本,无需在商店中发布)。
    3. 再次卸载应用程序。
    4. 使用新功能生成签名 apk,versionCode 低于 Google Play 版本
    5. 安装此 apk。

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

    我不知道确切的行为......

    【讨论】:

    • apk文件的签名有什么区别? Google Play 在您上传的 apk 上应用它自己的签名,因此第 2 步中的 apk 与第 4 步中的 apk 具有不同的签名。
    • 位于 Google Play 中的 apk 应使用与您生成的新 apk 相同的签名进行编译
    • @fvaldivia 如果您使用Google Play App Signing,则无法实现:Google Play 会重新签名您上传的每个 APK,因此会出现不匹配(您无法从步骤4)
    • 如果您使用 Google Play 应用签名,请查看此答案:stackoverflow.com/a/59266778/15139
    【解决方案5】:

    查看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");
                    }
                }
            });
    

    【讨论】:

      【解决方案6】:

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

      我将签名的发布 apk 发布到内部开发者版本中。 而且效果很好。

      或者你可以在“Alpha/Beta close test publish”上发布。

      【讨论】:

      • 我已上传到内部应用共享,但 appUpdateInfo.updateAvailability() 始终返回 1,即 UPDATE_NOT_AVAILABLE。
      • 这很奇怪......现在我向公众发布了但是......它仍然是“UPDATE_NOT_AVAILABLE”。我也一样……
      • 尝试使用版本增量进行测试版上传,它将起作用。还要确保您使用的是用于产品发布的相同密钥库文件。这需要一些时间,但会奏效。
      • @MangeshKadam 减少版本代码似乎不起作用(使用 prod 密钥库)。
      • @AravindhanGs 现在我不打算使用这个解决方案作为时间问题,但我想出了另一种方法 - 制作你自己的自定义 configuration-json 文件并设置你想要的最小内部版本号支持用户,然后在每次启动启动时调用并检查您的内部版本号以配置一个并执行操作。我想根据需要强制更新用户
      【解决方案7】:

      我不知道这个时候你是否已经把它弄下来了,但经过一段时间的测试后,我发现减少 versionName 是我需要做的才能正确测试它,然后我会测试只减少versionCode... 我认为 API 应该能够在 versionNameversionCode 过时时处理,但显然它没有。

      【讨论】:

      • 正如我之前所说,我可以在将应用程序以特定版本发布到 Play Store 并在本地 build.gradle 上手动减少 versionName 并运行它时进行测试。如果不发布应用程序,我将无法正确进行测试。
      【解决方案8】:

      Google Play 控制台中的内部测试轨道是测试应用内更新时使用的绝佳工具。

      【讨论】:

      【解决方案9】:

      对我来说,docs 中的“疑难解答”部分的最后一步使它起作用了!

      基本上,在您更改应用程序的版本(版本名称和代码)后,请执行以下操作:

      确保帐户符合条件并且 Google Play 缓存最多 日期。为此,请在登录 Google Play 商店帐户时 测试设备,进行如下操作:
      确保完全关闭 Google Play 商店应用程序。
      打开 Google Play Store 应用程序并转到 我的应用和游戏标签。
      如果您正在测试的应用程序没有出现 可用的更新,请检查您是否已正确设置测试 轨道。

      【讨论】:

        【解决方案10】:
        1. 生成较低版本的单独应用包,并将其上传到 Play 控制台的内部应用共享。
        2. 使用生成的链接在您的设备上安装应用程序。
        3. 再次生成一个应用包,其版本代码和版本号比以前的更高
        4. 上传到内部应用共享
        5. 打开新生成的链接,但不要从 Play 商店更新应用。
        6. 再次打开旧应用。
        7. 现在您将成为应用程序,可以在旧安装的应用程序中看到更新弹出窗口。

        注意 - 使用内部应用共享安装的应用无法更新为实时应用,即使版本更高。

        为了简单起见,我正在使用此应用内更新library

        【讨论】:

          【解决方案11】:

          1.从设备上卸载原始应用程序。

          2.从 Google Play 商店安装应用程序(我的应用程序已经在商店中了,但如果你没有,你可以搜索任何应用程序并复制包名并添加到你的测试应用程序包名两者都是一样的)。

          3.再次卸载应用。

          4.转到您的 gradle 并设置较低的版本代码,例如 1。

          5.同步

          6.安装。

          7.现在您将成为应用程序,可以在旧安装的应用程序中看到更新弹出窗口。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-02-26
            • 2012-01-29
            • 2014-12-04
            • 2018-11-28
            • 2021-06-28
            • 2018-02-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多