Есть большая и сложная система сборки 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/