Отказ от ответственности: все, что описано ниже, не является хорошей практикой.
Этот текст не следует читать как руководство к действию – его роль скорее развлекательная.
По этой же причине нет смысла советовать автору (мне) менять язык, инструменты, ОС, железо, пол и страну проживания.
У меня есть один проект. Для сборки он использует CMake, а также менеджер пакетов для C++ под названием Охотник , хорошо с интегрированным CMake. Проект необходимо собрать для нескольких платформ, одна из которых — Android. Hunter без проблем собирает зависимости для Android — но ему нужна версия CMake > =3.7, так как именно в 3.7 добавлена улучшенная поддержка этой платформы.
Это очень важная деталь.
CMake поддерживает создание проектов для Android под Windows/Visual Studio с помощью плагина.
К сожалению, этот плагин не установлен на Visual Studio 2017, а ставить 2015 ради одного проекта мне не хотелось.
С другой стороны, в VS2017 есть поддержка сборки под Android — но генерации таких проектов из CMake нет. Точнее, он существует, но требует самодельной версии CMake от Майкрософт , от разработки которого отказались примерно до версии 3.4, то есть он меня не устраивает. Ну а если не Visual Studio, то Android Studio! CMake его, конечно, не поддерживает, но он поддерживает это, уже с версии 2.х.
Вы указываете путь к CMakeLists.txt в build.gradle, запускаете синхронизацию и все должно работать.
Но не работает, пишет «У вас не установлен CMake».
Почему — потому что он также работает со своим форком CMake, который необходимо скачать из репозитория Android и который заморожен на версии 3.6. Это казалось тупиком.
Но на самом деле нет, потому что начиная с версии 3.0 Android Studio знает, как работать с внешними версиями CMake старше 3.6 из-за той самой «улучшенной поддержки Android».
Просто добавьте поле cmake.dir в local.properties, и все должно работать.
Но не работает, а говорит. Хм, если честно, я уже забыл, что он там сказал, но суть в том, что текст ошибки, введенный в гугл, привел меня к разговору в багтрекере, где это и было упоминал, что в версиях 3.7 и 3.8 CMake каким-то образом некорректно взаимодействует с Android Studio, и все это должно быть исправлено в версии 3.9. А у меня как раз стоит CMake 3.8. Ну нет проблем, зайдите на сайт и скачайте последний CMake, имеющий версию 3.10 (ну неужели 3.10 должна быть лучше 3.9 или хотя бы не хуже?).
Установите его и все должно работать.
Но не работает, пишет «Ошибка связи с сервером CMake — см.
логи».
В журналах кратко указано:
Как видите, ошибок абсолютно нет. Кстати, да, что такое CMake Server? Первый раз слышу.CMAKE SERVER: [== "CMake Server" ==[ CMAKE SERVER: {"supportedProtocolVersions":[{"isExperimental":true,"major":1,"minor":1}],"type":"hello"} CMAKE SERVER: ]== "CMake Server" ==]
Пойдем документация , и читаем, что это новый режим работы CMake, позволяющий внешним программам получать информацию о проекте CMake в машиночитаемой форме, что упрощает интеграцию с разными IDE и дополнительными инструментами.
Здесь начинается детективная история.
Первая подсказка — это поля «основной» и «второстепенный» в ответе сервера.
Поскольку версия протокола есть, кто-то может ее проверить и не работать с «неправильными» версиями.
Предположение весьма вероятное, но только предположение – хотелось бы получить его подтверждение.
Собственно, в этот момент я решил сделать перерыв и передать дело в полицию и зафиксировать ошибку в баг-трекере Android Studio, как они сами предполагают в своей документации.
К сожалению, реакции на баг не последовало, и через несколько дней он исчез с трекера - его не закрыли даже с помощью WONTFIX, а наоборот, он исчез бесследно.
Разозлившись, я решил завершить собственное расследование.
Возможно, среди читателей есть люди, активно работающие с Android Open Source Project или хотя бы просто знакомые с его структурой.
Пусть посмеются над моими дальнейшими приключениями.
Мне нужно было найти исходный код Android-плагина для Gradle, отвечающего за интеграцию с CMake. Как обычный порядочный гражданин, я набрал в Google фразу «исходный код плагина android gradle», и получил ответ страница репозитория .
Однако быстрый поиск по нему с помощью веб-интерфейса показал, что последний коммит в мастер был 2 года назад. Где свежие сорта? Не понятно! Вторая ссылка из того же поиска привела меня к инструкции «как скачать исходный код AOSP» .
Надо сказать, что сделать это непросто: Google, как всегда, не похож на людей, и просто скачать конкретный проект с Git не получится.
Вам нужно взять собственный инструмент под названием репо и использовать его.
Редактировать: в комментариях предполагают, что это возможно, а проекты пока в отдельном Git — но я был слеп и просто не увидел большую надпись «Клонировать этот репо:» вверху страницы.
Прошу прощения за дезинформацию! Берем репо, убеждаемся, что это обычный Python-скрипт, запускаем его и получаем ошибку — fcntl import not Found. Да, этот скрипт не работает в Windows. Приветствую, я люблю тебя, Google. Запускаем случайно валявшуюся в углу виртуальную машину с Ubuntu, скачиваем туда репо, запускаем и, видя, что что-то происходит, уходим на обед. По возвращении меня встретила ошибка «на устройстве не осталось места».
Ну да, там было 5Гб, но нужный мне проект не может весить столько, даже со всеми зависимостями! Однако небольшое расследование показало, что репо загружает весь или почти весь AOSP-репозиторий, и указать его в отдельный проект совершенно невозможно.
Отчасти, насколько я понимаю, в этом виноват Git, а точнее то, как его использует Google. Вместо того, чтобы помещать каждый проект в отдельный репозиторий, они поместили все в один.
А Git, в отличие от SVN, не умеет загружать подкаталоги репозитория от слова «вообще».
«Нет, — решил я, — я не хочу скачивать весь Андроид с цирком и лошадьми ради одного-двух файлов, которые мне нужно посмотреть».
Моя интуиция подсказывала, что где-то еще должен быть исходный код нужной мне версии плагина.
Но разум зашёл в тупик.
Поэтому я решил обратиться за помощью к официальные ресурсы для Android-разработчиков.
Группу Google+ сразу отвергаем — это не площадка для серьезных разговоров.
Но старые добрые списки рассылки групп Google — это то, что нам нужно! Их два — «просто Android (android-developers)» и «для тех, кто NDK (android-ndk)».
Моя проблема, похоже, мало связана с NDK, поэтому открываем первую ссылку.
И получаем сообщение — «эта группа рассылает вредоносное ПО, поэтому мы зря ее закрыли.
Подпись, ваш Google».
Сцена молчаливого удивления.
Хорошо, давайте откроем вторую группу, для разработчиков NDK. Она работает. Вводим в поиск слово CMake, надеясь уловить что-нибудь интересное — и находим! Тема называется «Как указать внешний CMake для Android StudioЭ» .
Краткий его обзор показывает, что именно здесь обсуждалось изменение, приведшее к появлению в плагине версии 3.0.0. Эта возможность.
В тему был вызван человек, который что-то понимал в плагине.
Дал автору темы ссылку на репозиторий (тот самый бесполезный, где написано использовать репо), но самое главное не удержался и скопировал часть кода из файла в одно из писем, указывая свое название! Этого было достаточно для меня.
Я ввела имя в поиск Google и сразу нашла его в их репозитории.
Правда, это был файл из ветки studio-2.2-preview3, то есть более ранний, не имеющий интеграции с внешними версиями CMake. Потом до меня дошло, что это должно было до меня дойти гораздо раньше — два года назад разработчики плагина перестали брать на себя обязательства по мастерингу, и стали вести всю разработку в ветках, никогда не выгружая результаты в основную.
Моё единственное оправдание состоит в том, что я никогда не работал с Git в таком стиле, и вообще, ВСЕ проекты, которые я видел, обычно заканчиваются слиянием изменений в мастер.
Однако, даже если бы я знал, что мне нужно покопаться в списке веток, не факт, что я потом найду нужную - их сотни, даты создания не видны, и я понятия не имел о имя правильное.
Меняем название ветки прямо в URL на studio-3.0, и.
Находим, но не совсем верно: в этом файле нет упоминания о версии протокола CMake Server. Но это уже не страшно, благо через веб-интерфейс, в отличие от репо, можно загрузить в tgz отдельную папку репозитория и искать в ней то, что вам нужно.
Вид код показало, что действительно дело в версии протокола.
Плагин сравнивал его на строгое соответствие с 1.0 (в функции getSupportedVersion), а последний CMake использовал 1.1 (в следующей версии, кстати, уже будет 1.2).
Изучая код CMake, я понял, что версия 1.1 не добавила ничего принципиально ломающего, поэтому не было никаких препятствий для работы Android Studio с ней, кроме этой дурацкой проверки.
Поэтому я нашел у себя на диске файл gradle-core-3.0.0.jar, извлек из него нужный класс и с помощью Java Bytecode Editor изменил проверку, чтобы все работало( Дисклеймер: не повторяйте дома (и тем более на рабочем месте); трюк выполнил отчаявшийся и очень злой программист ).
И все работало.
P.S. На самом деле не совсем: по какой-то причине CMake при сборке под Android использует неправильные относительные пути к исходным файлам, которые затем переходят в объектные файлы и, как следствие, к отладочной информации внутри библиотеки.
И тогда отладчик ничего не может найти по этим путям, потому что библиотеки там вообще нет. Но это другая и гораздо более короткая история.
Теги: #Android Studio #Android #CMake #C++ #деменция и смелость #программирование
-
Ms Explorer Мини
19 Oct, 24 -
По-Настоящему Объемное 3D-Изображение
19 Oct, 24 -
Быстрые Tcp-Сокеты В Erlang
19 Oct, 24 -
«Кокон» От O2
19 Oct, 24 -
Аккаунт, Gosuslugi.ru И Фз-152
19 Oct, 24 -
Реалистичный Дым На Холсте
19 Oct, 24