Android: Aucune version de NDK ne correspond à la version demandée

56

Après la mise à jour du plugin Android Gradle 3.6.0 (publié le 24 février 2020), plusieurs projets ont commencé à échouer indépendamment avec:

No version of NDK matched the requested version 20.0.5594570. Versions available locally: 21.0.6113669

Il est assez simple de "corriger" cela localement en installant l'ancienne version attendue de ndk:

sdkmanager 'ndk;20.0.5594570'

Cependant, ma question est: où et comment cette ancienne version est-elle spécifiée? Et comment le mettre à jour pour qu'il corresponde à la dernière version 21.0.6113669?

friederbluemle
la source
10
ET la construction échoue également sur Github CI.
KYHSGeekCode
pareil pour moi. Et si j'installe ce ndk ou que je spécifie son emplacement, je fais planter mon application en raison de UnsatisfiedLinkError -_-
ildar ishalin
1
Actuellement, github ci fonctionne à nouveau pour mon projet: github.com/KYHSGeekCode/Android-Disassembler/blob/…
KYHSGeekCode
ET cela échoue également dans Circle CI.
HX_unbanned
c'est la même chose que: stackoverflow.com/questions/61157024/…
Gerry

Réponses:

29

Option 1:

Vous pouvez simplement sélectionner votre NDK installé localement dans la boîte de dialogue Structure du projet

Vous pouvez ouvrir la boîte de dialogue Structure du projet en cliquant File > Project Structure...ou en appuyant sur les touches de raccourci CTRL + ALT + SHIFT + S(sous Windows)

Une fois la boîte de dialogue Structure du projet ouverte, accédez à Emplacement du SDK et sélectionnez votre version localement installée de NDK sous Emplacement NDK Android . Généralement, cela est installé quelque part dans votre dossier utilisateur, puis \AppData\Local\Android\Sdk\ndk\%ndk version%au moins pour Windows.

Capture d'écran de la boîte de dialogue Structure du projet - à partir d'Android Studio 3.6 Build # AI-192.7142.36.36.6200805, construit le 12 février 2020

Option 2:

Faire l'option 1 modifiera votre local.propertiesfichier pour vous et fonctionnera dans la plupart des cas. Mais si vous souhaitez utiliser une version NDK cohérente sur toutes les machines avec lesquelles vous construisez le projet, selon ce guide officiel , vous pouvez le configurer à partir de votre script gradle de module. Ajoutez simplement le ndkVersiondans le bloc de votre script gradle de module android{}comme ceci.

android {
    ndkVersion "major.minor.build"
}

remplacer la chaîne entre les guillemets doubles par la version NDK que vous souhaitez utiliser

Option 3:

Si vous souhaitez que tous les projets construits sur une machine particulière utilisent la même version NDK, vous pouvez également définir ANDROID_NDK_HOMEune variable d'environnement avec le chemin d'accès au dossier NDK.

Subaru Tashiro
la source
1
Que faire si je souhaite utiliser la dernière version de ndkVersion à l'aide de l'option 2?
KYHSGeekCode
@KYHSGeekCode, vous pouvez remplacer la chaîne entre les guillemets doubles par la version NDK que vous souhaitez utiliser. Assurez-vous que cette version particulière est installée.
Subaru Tashiro
5
Je veux dire, puis-je utiliser la dernière version (ne pas spécifier manuellement)?, En utilisant quelque chose comme$NDK_LATEST_VERSION
KYHSGeekCode
Cela n'a jamais été une option pour spécifier le NDK. Cela rendrait votre build non reproductible, ce qui entraîne toutes sortes de maux de tête de débogage. Ce que vous voudriez probablement, c'est vous fier à la version par défaut utilisée par le plugin gradle (qui n'est peut-être pas la dernière, mais qui devrait être suffisamment nouvelle tant que votre plugin est à jour). Pour le moment, c'est un problème car la version par défaut ne sera pas téléchargée automatiquement, mais elle est corrigée dans 4.1.
Dan Albert il y a
Une autre chose qui garderait les builds reproductibles tout en facilitant la mise à jour serait d'avoir une notification chaque fois que le jeu explicite android.ndkVersionest autre chose que le dernier NDK. Le fait d'avoir une «dernière» valeur réelle a des questions avec des réponses non évidentes. La dernière version doit-elle indiquer la dernière version stable, ou simplement la dernière version disponible? Dernière chose sur le disque ou dernière disponible sur le SDK? À quelle fréquence la version doit-elle être vérifiée? Comment vous assurez-vous que les anciennes révisions de votre projet restent constructibles?
Dan Albert Il y a
20

Je rencontre ça aussi

Aucune version de NDK ne correspond à la version demandée 20.0.5594570. Versions disponibles localement: 21.0.6113669

Option 1:

Vous pouvez simplement sélectionner votre NDK installé localement dans la boîte de dialogue Structure de projet fonctionne! entrez la description de l'image ici

Mais n'est valable que pour les versions locales, j'ai besoin d'une solution pour CI

Option 2:

Cela ne fonctionne que lorsque vous le spécifiez dans chaque module utilisé

android {
    compileSdkVersion 28
    ndkVersion "21.0.6113669"
    ...
}

Ici, il ne semble pas fonctionner https://github.com/hannesa2/panoramagl/pull/17/checks avec ce changement https://github.com/hannesa2/panoramagl/pull/17/files#diff-cff4e8c294a5dc5e76308662ae1ddcacR6-R7

Option 3:

export ANDROID_NDK_HOME=/Users/{my-user}/Development/adt/sdk/ndk/21.0.6113669

fonctionne aussi!

hannes ach
la source
que voulez-vous dire par l'option 2 qui ne fonctionne pas du tout? Quel problème rencontrez-vous avec cette approche? Avez-vous jeté un œil au bas de cette page? developer.android.com/studio/projects/…
Subaru Tashiro
@SubaruTashiro Regardez, cela ne semble pas fonctionner github.com/marianmoldovan/panoramagl/pull/17/… avec ce changement github.com/marianmoldovan/panoramagl/pull/17/… ou je ne sais pas pourquoi
hannes ach
Étrange. Je peux voir dans vos commits que vous avez spécifié 21.0.6113669mais les journaux de build indiquent que la version demandée est 20.0.5594570. Pouvez-vous rechercher un ndk_locator_record.jsonfichier? Ce fichier contient des informations sur la façon dont il a résolu la version ndk demandée.
Subaru Tashiro
@SubaruTashiro Je le recherche et il n'y a pas un tel fichier. Regardez, je le recherche à l'étape "Rechercher ndk_locator_record.json avant" github.com/hannesa2/panoramagl/pull/17/…
hannes
L'option 3 est idéale pour les outils d'automatisation, merci!
Violet Giraffe
14

J'ai le même problème. Je l'ai résolu via le gestionnaire de SDK sous SDK Tools, cliquez sur Show Package Detailspuis faites défiler sous NDK (côte à côte) et cochez et appliquez la version dont vous avez besoin. Voir l'image ci-dessous:

Lien d'image vers les outils SDK pour l'installation de la version NDK

Ma question pour tout le monde est la suivante: pourquoi avons-nous besoin de cela maintenant pour des projets qui ne nécessitent pas le NDK? Il s'avère que le NDK est une exigence préexistante dans le projet sur lequel je travaille pour une dépendance!

Kelvin
la source
2

Changez votre version de chemin de classe en 3.5.0 dans votre build.gradle, niveau projet.

dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'
}

J'ai le même problème et il a résolu.

djalmafreestyler
la source
3
Eh bien, ce n'est pas vraiment une solution, mais une solution de contournement au mieux. J'ai déjà mentionné que l'erreur a commencé à se produire lors de la mise à jour vers 3.6.0(ou ultérieure). Btw, vous n'avez pas besoin de rétrograder 3.5.0. La version 3.5.3fonctionne également très bien.
friederbluemle
2

j'ai eu le même problème, après un certain temps, j'ai trouvé une solution temporaire. renommer le ndkdossier en ndk-bundle. dans vos projets allez dans le local.propertiesfichier et ajoutez cette ligne avant sdk.dir:

ndk.dir=<path to your ndk folder>

c'est à moi:

ndk.dir=G\:\\SDK\\ndk-bundle
sdk.dir=G\:\\SDK

j'espère que cela vous aide

kam.r
la source
Agréable. Cela marche. Savez-vous comment le système de génération pourrait générer cette ligne automatiquement comme il le fait déjà pour l'option sdk.dir?
Nicolas Dusart
vous pouvez également spécifier le chemin d'accès au dossier ndk, au lieu de renommer. la chaîne a ndk.dir=G\:\\...\\Sdk\\ndk\\21.0.6113669fonctionné pour moi.
Artem Mostyaev