【问题标题】:Android - different behaviour in release signed build?Android - 发布签名版本中的不同行为?
【发布时间】:2011-10-16 04:55:58
【问题描述】:

我的 Android 应用程序现在有一些非常奇怪的“错误”,我从 Eclipse 运行它,它运行良好,非常完美。

它包含一个登录屏幕,当通过 Eclipse 运行时,我可以访问并进入我的主屏幕。当我按下 home 键并返回到我的应用程序时,它会返回到应用程序所在的最后一个位置(活动)。

但是,当我发布签名构建并将其部署到设备上时,它具有不同的行为,在我按下主页时进入登录屏幕然后返回应用程序时,登录屏幕总是出现。

两个版本的代码相同,唯一的区别是一个使用默认调试密钥库签名,而另一个使用我自己的发布密钥库签名。

有人遇到过这个吗?真的很混乱!

编辑:更多信息:

应用程序当前的工作方式如下:

主活动启动,然后调用登录活动,登录活动然后移动到我的应用程序核心活动。

我还发现它似乎是在安装后的第一次运行时出现问题,如果我运行该应用程序,请强制关闭它然后再次运行它然后完美运行而没有任何问题。

所以看起来真的很奇怪?

【问题讨论】:

  • 您是在模拟器还是设备本身上运行调试版本?
  • 设备,除了用于签名的密钥库之外,其他一切都完全相同
  • 你是在真机上测试发布版本吗?可能只是手机需要更多内存并自动关闭您的应用。
  • 是真实设备 - 三星充满活力,还在其他 3 台真实设备上进行了测试,结果相同
  • 导出 apk 时,Android 插件会自动对其使用 Proguard 和 zipalign。众所周知,这会在个别情况下引起问题。

标签: java android build release


【解决方案1】:

我知道这是一个老问题,但这个问题让我有些头疼,我在下面发布解决方案,以防有人遇到同样的问题。

由于 Intent 的启动模式,调试模式和发布模式之间的“奇怪”活动流程不同。当您在调试时,您按下“运行”按钮以启动主活动。当您处于发布模式时,您安装了应用程序,然后按下“打开”应用程序按钮。

一旦从不同位置打开应用程序,Intent 将发生变化并导致重新打开应用程序。最重要的是(感谢 Android 的架构),如果您有多个活动流程,例如:Splash -> Login -> Main -> 等,然后按“home”并从不同位置重新打开应用程序,整个活动流程是重新启动,但旧的活动将保留在堆栈中。对我来说,这导致了一些问题,因为 Singleton 中的一些变量初始化。

为了解决这个问题,您可以在AndroidManifest 中为您的活动设置不同的启动模式:

android:launchMode="singleTask"

另外,您可以尝试使用singleInstancesingleTop。每种启动模式都有不同的行为。

如果您在 Google Play 商店中发布了您的应用程序,则可以复制此问题。在商店中导航到您的应用程序,然后按“打开”按钮。启动应用程序后,按“主页”按钮并转到菜单屏幕并从此处打开您的应用程序。您将看到应用程序已重新创建。

【讨论】:

    【解决方案2】:

    您能否将 Eclipse 配置为使用相同的密钥库?

    我使用 Ant 脚本,它使用与我发布的版本相同的密钥安装我的“调试”应用程序,所以我没有看到这个问题。

    【讨论】:

      猜你喜欢
      • 2015-09-24
      • 1970-01-01
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多