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