Existe-t-il un moyen d'ignorer INSTALL_FAILED_VERSION_DOWNGRADE lors de l'installation d'une application avec Android Debug Bridge?

121

Il semble que le dernier Android 4.2 ait introduit cette condition d'erreur lors de l'installation lorsque l'on tente d'installer un APK avec une version inférieure. Dans les versions antérieures d'Android, on pouvait installer des APK plus anciens simplement via adb install -r <link to APK>. À des fins de débogage, j'ai fréquemment besoin de re-tester les anciens APK; et le -rdrapeau remplacerait l'ancienne version dans les anciennes versions d'Android. Y a-t-il un contournement à ignorer [INSTALL_FAILED_VERSION_DOWNGRADE]?

AaronMT
la source
Vous voulez dire, en plus de désinstaller la nouvelle version?
CommonsWare
Correct; J'ai supposé que le -rdrapeau gérerait cela.
AaronMT
5
Cette question est également valable pour les cas où vous avez (quelque peu incorrectement) des versions mal numérotées. Par exemple, peut-être que votre v1.0 d'une boîte de développement a un versionCode plus élevé que la v2.0 d'un serveur de construction.
parkerfath

Réponses:

288

Il semble que la dernière version des outils adb dispose d'un "indicateur d'autorisation de rétrogradation" qui n'est pas affiché dans l'aide adb, mais il est affiché dans l'aide "pm" sur l'appareil. Alors utilisez: adb install -r -d <link to apk>

supereee
la source
3
Essayé avec adb install -rd <apkfile>qui n'a pas fonctionné. Votre versino (avec les options séparées) fonctionne bien. Merci!
MarSoft
1
Et cela semble être documenté maintenant! Mais pas que vous deviez utiliser -r -d, -rd ne fonctionnera pas
plaisthos
Par exemple, pour désinstaller (rétrograder) Waze 4.0.0.2 et installer la version 3.9.5.3: adb install -r -d Waze_3.9.5.3.apk . De cette façon, vous ne perdrez pas les données de l'application.
Derek Gogol
12
Depuis Android 7 (Nougat), adb install -d ne fonctionne plus à moins que le paquet ne soit marqué comme déboguable. android.googlesource.com/platform/frameworks/base/+/921dd75
Darpan
20

Vous pouvez essayer d'utiliser adb uninstall -k <package>puis d'installer l'ancien apk. À partir du guide d'utilisation adb:

  adb uninstall [-k] <package> - remove this app package from the device
                                 ('-k' means keep the data and cache directories)

Je l'ai essayé moi-même avec mon apk, et cela semble fonctionner pour la plupart des données (certaines données comme RawContacts n'ont pas été enregistrées)

Talihawk
la source
Il semble que cette commande n'exécute pas réellement la désinstallation, mais génère simplement un avertissement. La commande pour exécuter cela semble être adb shell pm uninstall -k <package>.
Paul Lammertsma
Ceci est également utile pour la rétrogradation, si adb -d se plaint toujours comme il l'a fait pour moi.
Pointer Null
14

Avez-vous activé plusieurs comptes sur votre appareil (et poussez votre apk via ADB)? Si tel est le cas, vous devez supprimer l'apk dans chaque compte. Une fois la désinstallation complète, votre push sera OK.

Olivier Turpin
la source
La restauration de la sauvegarde via Titanium Backup n'a pas fonctionné. La nouvelle installation n'a pas fonctionné. L'installation via APK et / ou adb install n'a pas fonctionné. Cela m'a coûté 1,5h et votre simple conseil a fait l'affaire. Merci!
bentolor
3

Dans mon cas, il s'agissait d'une version obsolète des services Google Play inclus avec mon projet. J'utilise Android Studio. J'ai exécuté une mise à jour sur le SDK et importé la bibliothèque mise à jour, et cette erreur a disparu. Donc ma suggestion: mettez à jour les dernières bibliothèques référencées par votre projet.

IgorGanapolsky
la source
1

Essayez de désinstaller la version précédemment installée de l'application en utilisant-

adb uninstall com.package.name

puis installez / exécutez à nouveau votre application

Krishna
la source
0

Vous avez peut-être installé à partir d'une copie distincte du code où le numéro de version était supérieur à la copie avec laquelle vous travaillez actuellement. Dans les deux cas, désinstallez la copie actuellement installée ou ouvrez Paramètres> Applications pour déterminer le numéro de version de l'application installée et incrémentez votre versionCode pour qu'il soit supérieur dans le fichier AndroidManifest.

Ravindra
la source
1
Pourquoi ce vote a-t-il été rejeté? Ce n'est peut-être pas la meilleure réponse, mais cela semble être une solution viable (et peut-être la plus simple) pour quelqu'un qui est nouveau dans ce domaine! Veuillez laisser des commentaires pour des réponses comme celle-ci, car elles sont essentielles non seulement pour le répondant, mais pour les lecteurs qui visitent cette question plus tard. : - |
jedd.ahyoung
C'est bien sûr quelque chose qui peut être fait. C'est déjà évident. La question est de savoir s'il existe un moyen d'ignorer cette vérification et d'autoriser la rétrogradation. Et la réponse est oui. Cette réponse dit essentiellement non.
tasomaniac
0

J'ai également rencontré le même problème.Il peut être résolu avec les étapes ci-dessous qui sont plus faciles que de supprimer n'importe quel apk de l'appareil -

1) Exécutez la commande "adb logcat | grep -i version" sur le terminal

2) Recherchez la ligne particulière, qui sera affichée à la fin du logcat -

"Downgrade detected: Update version code 5011  is older than current 9109"

3) copiez la version actuelle (par exemple 9109) et collez-la dans AndroidManifest.xml comme indiqué ci-dessous -

android:versionCode="9109"

Maintenant, nettoyez et reconstruisez l'application et cela devrait fonctionner correctement.

Sunita
la source
0

Cela peut être un problème avec les dépendances des services Google Play.

Parfois, ce n'est PAS le cas que:

a) une version existante de l'application est installée, plus récente ou non

b) une version existante de l'application est installée sur un autre compte utilisateur sur l'appareil

Le message d'erreur est donc tout simplement faux.

Dans mon cas, j'avais:

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'

Mais quand j'ai essayé

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'

J'ai eu des erreurs liées à androidX, car je n'avais pas encore mis à niveau vers androidX et n'étais pas prêt à le faire. J'ai trouvé que l'utilisation des dernières versions 16.xy fonctionnait et je ne reçois plus le message d'erreur. De plus, je pourrais attendre plus tard quand je serai prêt pour passer à 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.+'
de bon augure99
la source
-3

Pour les personnes confrontées à des problèmes avec Xiaomi:

adb shell pm uninstall <package_name>
Vaigunth
la source
Cela n'aide en rien et doit être expliqué pourquoi cela doit être fait de cette façon.
Benyamin Limanto le