5

我正在发布模式下构建一个 Android 应用程序。我第一次在设备上安装它时,它工作正常。但是,如果我从相同的源重建它,用相同的密钥对其进行签名,然后重新安装,它就会失败。我在日志中收到以下错误:

W/InstallAppProgress(30456): Replacing package:com.mycompany.myapp
W/ActivityManager(26370): No content provider found for permission revoke: file:///storage/emulated/0/Download/MyApp-17.apk
W/PackageManager(26370): Can't install update of com.mycompany.myapp update version 0 is older than installed version 3

应用程序的版本代码设置为 3,我两次都构建它。它从哪里得到更新是“版本 0”的想法?

更新:我的清单文件中有这个:android:versionCode="@integer/app_version_code". 我已经<integer name="app_version_code">3</integer>res/values/strings.xml.

我很确定这曾经有效,但现在似乎无效。如果我用硬编码的“3”替换@integer 引用,它就可以工作。不应该支持@integer吗?

4

1 回答 1

2

据我所知,,你不能那样做。

有关使用 ant 构建脚本实现类似结果的一些想法,请参阅此 Google Groups 讨论此 Stack Overflow 问题。

如果您查看Android 文档,它特别指出您可以将资源用于versionName,但没有说这样的事情versionCode

android:versionCode

内部版本号。此数字仅用于确定一个版本是否比另一个版本更新,数字越大表示版本越新。这不是向用户显示的版本号;该数字由 versionName 属性设置。

该值必须设置为整数,例如“100”。您可以根据需要定义它,只要每个后续版本都有一个更高的数字。例如,它可以是内部版本号。或者,您可以通过分别在低 16 位和高 16 位中对“x”和“y”进行编码,将“xy”格式的版本号转换为整数。或者您可以在每次发布新版本时简单地将数字增加一。

android:versionName

向用户显示的版本号。此属性可以设置为原始字符串或对字符串资源的引用。该字符串除了显示给用户之外没有其他用途。versionCode 属性保存内部使用的重要版本号。

于 2013-06-29T00:01:30.620 回答