Использование mise для установки зависимостей при андроид-разработке

от автора

Есть большая и сложная система сборки Gradle и андроид-плагин AGP для установки большей части компонентов Android SDK, необходимых для вашего приложения. Но что, если вам не хочется руками устанавливать Android Studio, Android SDK, cmake, scrcpy и прочие нужные вещи? Здесь на помощь приходит инструмент mise — при кажущейся простоте он умеет все, что нам нужно.

Установка самого mise

По умолчанию, документация предлагает такой способ установки:

curl https://mise.run | sh

Для тех, кому не нравится подобный способ установки, предусмотрены альтернативы.

Вам также понадобится активировать mise в вашей командной оболочке, в таком случае mise сможет работать как direnv. Я не тестировал работоспособность данной статьи без такой одноразовой активации.

Для bash:

echo 'eval "$(mise activate bash)"' >> ~/.bashrc

Для fish:

echo 'mise activate fish | source' >> ~/.config/fish/config.fish

Для zsh:

echo 'eval "$(mise activate zsh)"' >> "${ZDOTDIR-$HOME}/.zshrc"

И не забудьте перезапустить терминал, чтобы эти настройки активировались.

Базовые возможности

Mise при желании позволяет устанавливать софт глобально, список доступных пакетов можно проверить командой mise registry

mise use -g bun deno go java gradle

Но не будем о банальщине. Как с помощью mise можно просто, допустим, скачать мой проект с Гитхаба и собрать его под андроид, не имея на своей системе ничего, кроме этого самого mise? Скачаем проект (если у вас нет git, то можно просто скачать архивом с сайта Гитхаба):

satori@fedora ~ [1]> git clone --depth=1 'https://github.com/lunardoesdev/raytris'Cloning into 'raytris'...remote: Enumerating objects: 33, done.remote: Counting objects: 100% (33/33), done.remote: Compressing objects: 100% (24/24), done.remote: Total 33 (delta 0), reused 27 (delta 0), pack-reused 0 (from 0)Receiving objects: 100% (33/33), 1.39 MiB | 1.02 MiB/s, done.satori@fedora ~> cd raytris/mise ERROR error parsing config file: ~/raytris/mise.tomlmise ERROR Config files in ~/raytris/mise.toml are not trusted.Trust them with `mise trust`. See https://mise.en.dev/cli/trust.html for more information.mise ERROR Version: 2026.7.2 linux-x64 (2026-07-07)mise ERROR Run with --verbose or MISE_VERBOSE=1 for more information

mise предупреждает, что он не будет при переходе в директорию автоматически устанавливать зависимости и добавлять их в PATH без вашего разрешения командой mise trust. После выполнения этой команды вы можете сразу запустить таск mise apk, определенный в моем mise.toml, и собрать таким образом apk! Да, вот так просто.

Разбор повторяемого окружения

Давайте рассмотрим сам mise.toml (дальше я буду показывать кусочки из этого файла и объяснять, что они делают):

[tools]android-sdk = "latest""github:Genymobile/scrcpy" = "4.0""github:cesarferreira/byedroid" = "0.9.0"gradle = "9.6.1"java = "26.0.1"zig = "0.15.1"[env]_.path = {tools = true, path = [ "${ANDROID_HOME}/platform-tools", "${ANDROID_HOME}/build-tools/36.0.0",]}CPM_SOURCE_CACHE = "${HOME}/.cache/cpm-source-cache"[settings]env_shell_expand = true[tasks.accept-android-licenses]sources = ['settings.gradle.kts']run = """  yes | sdkmanager --licenses  yes | sdkmanager "cmake;4.1.2"  yes | sdkmanager "platform-tools""""[tasks.debug-apk]depends = ["accept-android-licenses"]sources = [  'build.gradle.kts',  'gradle.properties',  'src/**',  'settings.gradle.kts',  'android-sdk-packages.txt',  'CMakeLists.txt']run = "gradle assembleDebug"alias = "apk"[tasks.debug-native]sources = [  'src/**/*',  '*.txt']run = """  mkdir -p build/debug  cd build/debug  cmake ../..  make"""[tasks.debug]depends = ['debug-native']run = '''  ./build/debug/raytris'''alias = 'debug'[tasks.build-windows]sources = [  'src/**',  '*.txt']run = '''  mkdir -p build/windows  cd build/windows  cmake -DCMAKE_TOOLCHAIN_FILE=cmake/zig-toolchain.cmake \   -DZIG_TARGET=x86_64-windows \   ../..  make'''

Давайте по порядку. В секции [tools] описываются пакеты, которые mise установит.

[tools]android-sdk = "latest""github:Genymobile/scrcpy" = "4.0""github:cesarferreira/byedroid" = "0.9.0"gradle = "9.6.1"java = "26.0.1"zig = "0.15.1"

Обратите внимание, что можно устанавливать не только пакеты, определенные в mise registry, но и качать просто с github releases. Например, вот так глобально можно поставить неплохую систему сборки xmake:

mise use -g github:xmake-io/xmake[rename_exe=xmake]

rename_exe и другие опции и их значения вы можете посмотреть если будет интересно на сайте mise, например для их github «бекенда»: https://mise.jdx.dev/dev-tools/backends/github.html#rename-exe

Далее идет [env].

[env]_.path = {tools = true, path = [ "${ANDROID_HOME}/platform-tools", "${ANDROID_HOME}/build-tools/36.0.0",]}CPM_SOURCE_CACHE = "${HOME}/.cache/cpm-source-cache"

_.path это специальный способ переопределить PATH, tools=true означает что мы сначала ставим tools из секции [tools], а потом переопределяем эту переменную. $ANDROID_HOME определеяется пакетом android-sdk, вам не нужно делать это вручную.

CPM_SOURCE_CACHE это переменная для cmake cpm, пакетного менеджера для системы сборки cmake который я использую для установки raylib в свой проект. Она позволяет не перекачивать исходники снова и снова если вы удаляете билд-директорию или собираете в разных местах под разные платформы, как это делаю я.

Идём дальше. Секция [settings].

[settings]env_shell_expand = true

env_shell_expand позволяет в env вытворять такое:

[env]FOO = "hello"BAR = "$FOO-world"        # "hello-world"BAZ = "${FOO}_suffix"     # "hello_suffix"QUX = "${UNDEF:-fallback}" # "fallback"

То есть у нас env-переменные преобразуются в свои значения… как собственно и должно быть, на мой взгляд.

Дальше идет секция [tasks], в которой мы определяем задачи, файлы, от которых они зависят, задачи-зависимости. Mise — могучий task runner, и он имеет множество возможностей для задач, если будет интересно посмотрите в его документации возможные опции https://mise.jdx.dev/tasks/

[tasks.accept-android-licenses]sources = ['settings.gradle.kts']run = """  yes | sdkmanager --licenses  yes | sdkmanager "cmake;4.1.2"  yes | sdkmanager "platform-tools""""

Здесь в задаче accept-android-licenses мы принимаем лицензии sdk компонентов и устанавливаем нужные нам компоненты, которые gradle ставит не всегда или не очень надежно. В данном примере обратите внимание, что я использую конкретную версию cmake. Её же я прописал в gradle-файлах, чтобы использовать именно её, поскольку у меня возникали проблемы с cpm или raylib при сборке старой версией cmake, которая ставится если выбрать просто «cmake» вместо «cmake 4.1.2». Пришлось много повозиться, но в итоге система ставит нужный cmake, а gradle его подхватывает, даже если установлены какие-то иные версии cmake. Я добавил, что эта задача зависит от файла settings.gradle.kts, чтобы она не перезапускалась при каждой сборке.

А вот задача, которая отвечает за команду mise apk:

[tasks.debug-apk]depends = ["accept-android-licenses"]sources = [  'build.gradle.kts',  'gradle.properties',  'src/**',  'settings.gradle.kts',  'android-sdk-packages.txt',  'CMakeLists.txt']run = "gradle assembleDebug"alias = "apk"

Она зависит от предыдущей задачи, и собирает apk с помощью gradle. Я не очень уверен в ‘src/‘, возможно правильный glob синтаксис был бы ‘src//*’, но в целом у меня сборка работает.

alias «apk» позволяет нам использовать наш debug-apk просто как mise apk. Обратите внимание что не надо сделать alias «run» или «watch», поскольку это пересекается с субкомандами mise.

Дальше похожим способом определяются таски для нативной сборки, запуска нативной игры и для сборки под windows. Никаких новых элементов для документации здесь нет, но вы можете оценить изящество моего решения, собирающего одну кодовую базу под разные операционные системы.

Mise — хороший инструмент, мне работать с ним понравилось. Всего доброго.

ссылка на оригинал статьи https://habr.com/ru/articles/1058494/