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

Комментарии (1)


  1. pvzh
    13.07.2026 22:15

    Согласен, mise превосходный инструмент, но вот их apt-репозиторий с некоторых пор недоступен без средств обхода блокировок, что несколько напрягает и печалит. А обновления там выходят довольно часто.