【问题标题】:Quickly switch between beta and release在测试版和发布版之间快速切换
【发布时间】:2018-10-09 01:24:32
【问题描述】:

我正在开发一个 Android 应用程序,我希望:

  • 测试人员(不是开发人员,不一定精通计算机,但我知道他们的 Play 商店电子邮件)能够在同一应用的测试版和稳定版之间快速切换
  • 通过 Play 商店提供稳定版和测试版的更新
  • 限制访问测试版。发布版本已在 Play 商店中公开提供。

到目前为止,我主要关注如何在 android 设备上获取本质上相同的应用程序的两个版本。我已经考虑了一些选项,但我想就如何进行。我可以:

  • 创建一个“新”应用程序,在其名称后附加beta,并使用不同的图标来区分测试人员,但内部结构基本相同。它可以作为封闭的 alpha/内部测试通过 Play 商店分发。我想避免这种情况,因为这会让我更难管理版本 - 当我想将测试版推广到发布时,我必须手动更改应用程序的图标和名称
  • 创建构建风格。我不完全确定构建风味的能力如何,或者它们的支持程度如何。
  • 使用 google play 商店的封闭 alpha/内部测试程序。这不太理想,因为选择加入/退出测试程序需要付出相当大的努力。你必须去一个网址,点击一个按钮,卸载应用程序并重新安装应用程序。
  • 使用app cloner之类的应用程序克隆稳定版并重命名,然后通过Play商店分发测试版。这并不理想,因为它使得更新发布版本需要开发人员干预。

注意:当我说封闭式 Alpha 版和内部测试时,我指的是 google play 封闭式 Alpha 版和内部测试(可通过 google 开发者控制台访问),而不是它们更一般的定义。当我说 Beta 时,我指的是更一般的定义 - 预发布版本。

编辑:按照this 帖子上的建议,我成功安装了两个应用程序,但每当尝试打开一个时,我都会得到一个选择器对话框,就像这样

【问题讨论】:

标签: android android-studio gradle google-play version


【解决方案1】:

Google Play 已经为您提供了分发所需的所有内容以及 alpha/beta/internal 版本以及您的 prod 版本。

如果我理解,您的问题是您希望您的测试人员在同一台设备上同时拥有该应用的两个版本。 您无法使用您考虑过的选项来实现这一点。即使您更改名称和图标,唯一重要的是应用程序 ID。如果您不更改应用程序 ID,则不能将其安装两次。另一方面,如果您更改包名称,它会被视为一个全新的应用程序,因此您必须在 Google Play 中创建一个新应用程序。

我建议使用完全支持的构建变体(口味)。 通过这种方式,您可以轻松更改包名称(以及应用名称,以便于理解)。 当然,正如我之前提到的,您应该在 Google Play 中创建一个新应用或以其他方式分发它。

新变体的 gradle 在应用程序 gradle 中应该与此类似:

buildTypes {
    release {
    ....
    }
    qa { //your new variant name
       applicationIdSuffix ".qa" //this will append a ".qa" to your app id
       versionNameSuffix "-qa" //this will append a "-qa" to your app name
       ...
    }
}

【讨论】:

  • 您的解决方案没有正确更改我的应用在主屏幕图标下显示的名称。作为参考,我有一个带有<string name="app_name">foo</string>strings.xml 文件,在AndroidManifest.xml 中,我有android:label="@string/app_name",它确实更改了主屏幕上图标下的名称。
  • 使用 versionNameSuffix,您应该在图标下看到“foo-qa”,仅当您为该特定变体构建应用程序时。
  • 我正在更改变体,我的应用图标下的名称没有改变。我知道我正在更改变体,因为 applicationIdSuffix 确实按预期工作。有什么想法吗?
  • 这个答案基本上是对的,但versionNameSuffix 从未更改过应用的名称。我只是从问题中链接的问题中用resValue "string", "app_name", "AppName debug" 更改它。无论如何我都会接受这个作为答案。
【解决方案2】:

要解决您的最后一点和屏幕截图,请在您的应用中从使用基于字符串的 Intent 切换到使用基于类的 Intent。我所说的基于字符串的 Intent 是指使用 public Intent (String action) 构建的 Intent。例如

startActivity("com.myOrganization.NEXT_ACTIVITY");

(为了使这些字符串意图起作用,它们需要在清单中用标签声明)

用函数签名public Intent (Context packageContext, Class<?> cls) 的基于类的构造函数替换它们。像这样:

startActivity(currentActivity.this, nextActivity.class)

基于字符串的意图旨在用于外部服务,例如打开 Web 浏览器以报告错误。在这种情况下,您不知道 Web 浏览器的 java 类名是什么(即它可能是 firefox.classchrome.class)。 使用您的应用程序,您知道要启动的所有活动的类名,因此只需使用它们即可。来自androiddocumentation上的基于类的Intent构造函数

这提供了一种方便的方法来创建意图执行硬编码类名的意图,而不是依赖系统为您找到合适的类

使用基于类的构造函数还有一个额外的优势,那就是在 Android Studio 中更容易重构。

注意:您仍然可以在清单中包含意图过滤器,以允许其他应用在您的应用中执行某些操作

【讨论】:

    猜你喜欢
    • 2015-03-19
    • 2020-06-12
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2019-02-15
    相关资源
    最近更新 更多