有没有办法使用Android Debug Bridge安装应用程序时忽略INSTALL_FAILED_VERSION_DOWNGRADE错误?

147
似乎最新的Android 4.2在安装低版本APK时会引发错误。在之前的Android版本中,可以通过 adb install -r <link to APK> 简单地安装旧版本的APK。出于调试目的,我经常需要重新测试旧版APK;而-r标志则会替换旧版构建在较旧的Android版本中。这里是否有一种解决方法来忽略[INSTALL_FAILED_VERSION_DOWNGRADE]错误?

1
除了卸载较新的版本,您还有其他意思吗? - CommonsWare
1
正确;我以为-r标志会处理这个。 - AaronMT
5
即使您的构建编号出现错误,也适用于此问题。例如,您在开发环境中的v1.0版本可能具有比构建服务器上的v2.0版本更高的versionCode。 - parkerfath
13个回答

337

看起来最新版本的adb工具有一个“允许降级标记”,这个标记没有显示在adb的帮助中,但它在设备上的“pm”帮助中显示。所以使用:adb install -r -d <apk链接>


6
尝试使用“adb install -rd <apkfile>”命令,但没有成功。您的版本(选项分开)可以正常工作。谢谢! - MarSoft
1
似乎现在已经有了文档记录!只是需要注意要使用-r -d选项,-rd选项不起作用。 - plaisthos
22
自Android 7(Nougat)开始,除非应用程序被标记为可调试(debuggable),否则adb install -d命令将不再起作用。详情请参考https://android.googlesource.com/platform/frameworks/base/+/921dd75。 - Darpan
8
当我执行 adb install -t -r -d app.apk 时,这个方法对我起了作用。 - arekolek
1
@Darpan 所以对于签名的 APK,无法在新版本之上安装旧版本,是吗? - android developer
显示剩余3条评论

24
你可以尝试使用 adb uninstall -k <package> 命令卸载应用,然后再安装旧版本的apk文件。 来自adb使用指南:
  adb uninstall [-k] <package> - remove this app package from the device
                                 ('-k' means keep the data and cache directories)

我已经用我的apk自己尝试了一下,似乎对大部分数据都有效(像RawContacts这样的一些数据没有被保存)。


1
看起来这个命令实际上并没有执行卸载操作,而只是发出了一个警告。实际执行卸载的命令似乎是 adb shell pm uninstall -k <package> - Paul Lammertsma
如果adb -d仍然像我一样抱怨,这也对降级很有用。 - Pointer Null

18

你在设备上启用了多个账号(并通过ADB推送了你的apk)吗? 如果是这样,你需要在每个账户中删除该apk。 完全卸载后,你的推送将正常。


通过 Titanium Backup 恢复备份没有成功。重新安装也没有成功。通过 APK 和/或 adb install 安装也没有成功。这花了我1.5小时,而您简单的提示解决了问题。谢谢! - bentolor
1
这对以下情况有所帮助:我使用钛备份卸载了一个应用程序并恢复了旧版本。在自动应用程序更新后,我尝试使用TB降级,但在还原时挂起;尝试手动安装APK>出现错误“未安装应用程序”。因此,我的结论是,TB似乎错误地为所有用户全局安装应用程序。 三星S9,Android 9。 - sir_brickalot

13

对我来说,只有这个很好,因为我的应用是一个系统应用

adb install -t -r -d myapp.apk

3

在我的情况下,是因为我使用的Android Studio项目中包含了一个过期版本的Google Play Services。我运行了SDK的更新,并导入了更新后的库,这个错误就消失了。所以我的建议是:更新你的项目所引用的最新库。


2

尝试使用以下方式卸载先前安装的应用程序版本 -

adb uninstall com.package.name

然后再次安装/运行您的应用程序。

2
我也遇到了同样的问题。以下步骤可以解决这个问题,比从设备中删除任何apk更容易:
1)在终端上运行命令“adb logcat | grep -i version”
2)查找特定的行,该行将显示在logcat的末尾 -
"Downgrade detected: Update version code 5011  is older than current 9109"

3) 复制当前版本(例如9109)并将其粘贴到AndroidManifest.xml中,如下所示 -

android:versionCode="9109"

现在清理并重新构建应用程序,它应该可以正常工作。

'grep' 不被识别为内部或外部命令,可执行程序或批处理文件。 grep 在类Unix操作系统上运行正常。 - leonidaa
这个用户只是展示了升级普通应用程序。在Windows上,你可以使用find来替代grep,但它的参数不同,例如 - find "version"。 - Tomek

2

1

我只是先在您的设备上卸载应用程序,然后安装新的应用程序就解决了我的问题。 谢谢!


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

0

这可能是与Google Play服务依赖项有关的问题。

有时,并非如下情况:

a)已安装应用程序的版本较新或不是

b)设备上另一个用户帐户中已安装应用程序的版本

因此,错误消息只是虚假的。

在我的情况下,我有:

implementation 'com.google.android.gms:play-services-maps:16.0.0'
implementation 'com.google.android.gms:play-services-location:16.0.0'
implementation 'com.google.android.gms:play-services-gcm:16.0.0'

但是当我尝试时

implementation 'com.google.android.gms:play-services-maps:17.0.0'
implementation 'com.google.android.gms:play-services-location:17.0.0'
implementation 'com.google.android.gms:play-services-gcm:17.0.0'

我遇到了与androidX相关的错误,因为我还没有升级到androidX并且也没有准备好这样做。我发现使用最新的16.x.y版本可以解决问题,不再出现错误信息。此外,我可以等到以后准备好时再升级到androidX。

implementation 'com.google.android.gms:play-services-maps:16.+'
implementation 'com.google.android.gms:play-services-location:16.+'
implementation 'com.google.android.gms:play-services-gcm:16.+'

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