Android: ни одна версия NDK не соответствует запрошенной версии

56

После обновления до плагина Android Gradle 3.6.0 (выпущенного 24 февраля 2020 г.) несколько проектов независимо друг от друга начали терпеть неудачу:

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

Это довольно просто «исправить» локально, установив старую ожидаемую версию ndk:

sdkmanager 'ndk;20.0.5594570'

Однако мой вопрос: где и как указана эта более старая версия? И как мне обновить его, чтобы он соответствовал последней версии 21.0.6113669?

friederbluemle
источник
10
И сборка не работает на Github CI тоже.
KYHSGeekCode
мне то же. И если я установлю этот ndk или укажу его местоположение, я получу сбой моего приложения из-за
UnsatisfiedLinkError
1
В настоящее время github ci теперь снова работает для моего проекта: github.com/KYHSGeekCode/Android-Disassembler/blob/…
KYHSGeekCode
И это не так в Circle CI тоже.
HX_unbanned
это так же, как: stackoverflow.com/questions/61157024/…
Джерри

Ответы:

29

Опция 1:

Вы можете просто выбрать локально установленный NDK в диалоге структуры проекта

Вы можете открыть диалоговое окно " Структура проекта", нажав File > Project Structure...или нажав горячие клавиши CTRL + ALT + SHIFT + S(в окнах)

После открытия диалогового окна «Структура проекта» перейдите в « Местоположение SDK» и выберите локально установленную версию NDK в разделе « Местоположение Android NDK» . Обычно это устанавливается где-то в вашей пользовательской папке, \AppData\Local\Android\Sdk\ndk\%ndk version%по крайней мере, для Windows.

Скриншот диалогового окна "Структура проекта" - из Android Studio 3.6 Build # AI-192.7142.36.36.6200805, построен 12 февраля 2020 г.

Вариант 2:

Выполнение опции 1 отредактирует ваш local.propertiesфайл для вас и будет работать в большинстве случаев. Но если вы хотите использовать согласованную версию NDK на всех машинах, на которых вы строите проект, в соответствии с этим официальным руководством , вы можете настроить его с помощью скрипта gradle вашего модуля. Просто добавьте ndkVersionв свой модуль блок скриптов Gradle, android{}как показано ниже .

android {
    ndkVersion "major.minor.build"
}

замена строки между двойными кавычками на версию NDK, которую вы хотите использовать

Вариант 3:

Если вы хотите, чтобы все проекты, созданные на определенной машине, использовали одну и ту же версию NDK, вы также можете установить ANDROID_NDK_HOMEпеременную среды с путем к папке NDK.

Субару Таширо
источник
1
Что если я захочу использовать последнюю версию ndkVersion с использованием Варианта 2?
KYHSGeekCode
@KYHSGeekCode вы можете заменить строку между двойными кавычками на версию NDK, которую вы хотите использовать. Убедитесь, что у вас установлена ​​именно эта версия.
Субару Таширо
5
Я имею в виду, могу ли я использовать последнюю версию (без указания вручную) ?, используя что-то вроде$NDK_LATEST_VERSION
KYHSGeekCode
Это никогда не было опцией для любого способа определения NDK. Это сделает вашу сборку невоспроизводимой, что приведет к различным головным болям отладки. Вероятно, вам нужно полагаться на версию по умолчанию, используемую плагином gradle (которая может быть не самой последней, но должна быть достаточно новой, если ваш плагин обновлен). Сейчас это неприятно, потому что версия по умолчанию не будет загружаться автоматически, но это исправлено в 4.1.
Дэн Альберт
Еще одна вещь, которая обеспечит воспроизводимость сборок при одновременном упрощении обновления, - это получение уведомлений всякий раз, когда явно установленное значение android.ndkVersionотличается от последней версии NDK. Наличие фактического «последнего» значения имеет несколько вопросов с неочевидными ответами. Должен ли последний указывать на последний стабильный выпуск или только на самую новую доступную вещь? Последняя вещь на диске, или последняя доступная из SDK? Как часто следует проверять сборку? Как сделать так, чтобы старые версии вашего проекта оставались работоспособными?
Дэн Альберт
20

Я сталкиваюсь с этим тоже

Ни одна версия NDK не соответствует запрошенной версии 20.0.5594570. Версии, доступные локально: 21.0.6113669

Опция 1:

Вы можете просто выбрать локально установленный NDK в структуре проекта Диалог работает! введите описание изображения здесь

Но действует только для локальных сборок, мне нужно решение для CI

Вариант 2:

Это работает только когда вы указываете его в каждом используемом модуле

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

Вот, кажется , не работать https://github.com/hannesa2/panoramagl/pull/17/checks с этим изменением https://github.com/hannesa2/panoramagl/pull/17/files#diff-cff4e8c294a5dc5e76308662ae1ddcacR6-R7

Вариант 3:

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

тоже работает!

Ханнес Ач
источник
что вы подразумеваете под вариантом 2, не работающим вообще? С какой проблемой вы сталкиваетесь при таком подходе? Вы смотрели внизу этой страницы? developer.android.com/studio/projects/…
Субару Таширо
@SubaruTashiro Слушай, похоже, это не работает github.com/marianmoldovan/panoramagl/pull/17/… с этим изменением github.com/marianmoldovan/panoramagl/pull/17/… или я не знаю почему
Ханнес ах
Странный. Я вижу в ваших коммитах, что вы указали, 21.0.6113669но в журналах сборки указано, что запрашиваемая версия есть 20.0.5594570. Можешь поискать ndk_locator_record.jsonфайл? Этот файл содержит информацию о том, как он решил запрашиваемую версию ndk.
Субару Таширо
@SubaruTashiro Я ищу его, и такого файла нет. Смотри, я ищу это в шаге "Поиск ndk_locator_record.json перед" github.com/hannesa2/panoramagl/pull/17/…
Ханнес ач
Вариант 3 отлично подходит для средств автоматизации, спасибо!
Фиолетовый Жираф
14

У меня такая же проблема. Я решил это с помощью менеджера SDK в разделе SDK Tools, щелкните, Show Package Detailsзатем прокрутите под NDK («Рядом») и отметьте и установите нужную версию. Смотрите изображение ниже:

Ссылка на изображение для инструментов SDK для установки версии NDK

Мой вопрос ко всем: зачем нам это нужно сейчас для проектов, которые не требуют NDK? Как оказалось, NDK - это уже существующее требование в проекте, над которым я работаю, для зависимости!

кельвин
источник
2

Измените версию вашего classpath на 3.5.0 внутри вашего build.gradle, уровня проекта.

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

У меня та же проблема, и она решена.

djalmafreestyler
источник
3
Ну, это на самом деле не решение, а обходной путь в лучшем случае. Я уже упоминал, что ошибка начала происходить при обновлении до 3.6.0(или позже). Кстати, вам не нужно понижать до 3.5.0. Версия 3.5.3отлично работает.
Friederbluemle
2

У меня была такая же проблема, через некоторое время я нашел временное решение. переименовать ndkпапку в ndk-bundle. в ваших проектах зайдите в local.propertiesфайл и добавьте эту строку раньше sdk.dir:

ndk.dir=<path to your ndk folder>

это мое:

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

я надеюсь, что это поможет вам

kam.r
источник
Ницца. Это работает. Знаете ли вы, что система сборки может сгенерировать эту строку автоматически, как это уже возможно для опции sdk.dir?
Николас Дюсарт
Вы также можете указать путь к папке ndk вместо переименования. струна ndk.dir=G\:\\...\\Sdk\\ndk\\21.0.6113669сработала для меня.
Артем Мостяев