Есть большая и сложная система сборки 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.toml mise 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 — хороший инструмент, мне работать с ним понравилось. Всего доброго.
pvzh
Согласен, mise превосходный инструмент, но вот их apt-репозиторий с некоторых пор недоступен без средств обхода блокировок, что несколько напрягает и печалит. А обновления там выходят довольно часто.