Быстрая сборка Unity‑проекта под Android: что настроить и почему

Короткий ответ: установите рекомендованные Unity версии SDK/NDK и OpenJDK, используйте Gradle (лучше — Export Project для CI), создайте и надёжно сохраните keystore, собирайте AAB для Google Play и настраивайте подпись в Gradle через переменные окружения. Ниже — компактный пошаговый чек‑лист и частые ошибки с решениями.

Подготовка окружения (SDK, NDK, JDK)

  1. Установите Android Studio (как эталон SDK), затем через SDK Manager установите:
    • Android SDK Platform для target (например, 33/34).
    • Platform‑Tools и Build‑Tools (текущую + 1–2 предыдущие версии).
    • NDK нужной версии (см. рекомендацию Unity).
  2. JDK: используйте OpenJDK 11, встроенный в Unity, если нет явной необходимости в другой версии. Менять JAVA_HOME не нужно, пока сборки проходят.
  3. Пути:
    • Windows: C:\Users<User>\AppData\Local\Android\Sdk
    • macOS: ~/Library/Android/sdk
    • Linux: ~/Android/Sdk

Фиксируйте версии SDK/NDK/JDK в README проекта и в CI‑скриптах — это уменьшит «на моей машине собирается».

Настройка Unity и Gradle

  1. Модули Unity: через Unity Hub добавьте Android Build Support, Android SDK & NDK Tools (если хотите встроенные) и OpenJDK.
  2. В Unity: Edit → Preferences → External Tools — укажите пути к SDK/NDK/JDK либо оставьте опцию "Installed with Unity".
  3. Build System:
    • Выбирайте Gradle (рекомендуется). Для тонкой настройки ставьте Export Project и собирайте через Android Studio/CI.
    • Для Google Play отмечайте Build App Bundle.
  4. Если экспортируете: выносите секреты (keystore и пароли) из репозитория. Используйте gradle.properties либо CI‑секреты для signingConfigs.

Частая причина падений — несоответствие версии NDK и Android Gradle Plugin. Используйте рекомендуемую Unity связку NDK + Gradle Plugin.

Подпись APK/AAB и управление ключами

  1. Создание keystore: Project Settings → Player → Publishing Settings → Create New Keystore.
    • Храните keystore вне репозитория (BuildConfig/Keystore) и делайте резервные копии в защищённом хранилище.
    • Срок действия ключа — минимум 25 лет.
  2. V1/V2/V3: для максимальной совместимости включайте V1 + V2 + V3; при публикации AAB Google Play подпишет APK через Play App Signing, но свой keystore всё равно нужен.
  3. Автоматизация: в exported Gradle проекте используйте:
    • gradle.properties (локально) или CI Secrets для паролей,
    • signingConfigs в build.gradle для разных билдов (dev/stage/prod).

Чек‑лист для быстрой проверки перед сборкой

  • [ ] Unity и проект в совместимой версии.
  • [ ] SDK Platform и Build‑Tools установлены (target SDK совпадает).
  • [ ] NDK версия — рекомендованная Unity.
  • [ ] JDK (OpenJDK 11) корректен.
  • [ ] Export Project если нужно кастомное Gradle‑настроение.
  • [ ] Keystore создан и пароли в CI/секретах.
  • [ ] Build App Bundle для Play, APK для локального теста.

Частые ошибки

  • "SDK Build Tools not found" — установите требуемую версию Build‑Tools через SDK Manager.
  • "Unsupported NDK version" — установите NDK, рекомендованный конкретной версией Unity, и пропишите путь.
  • "Unsupported class file major version" — несоответствие JDK/Gradle; используйте JDK Unity или обновите Gradle Plugin.
  • "Keystore was tampered with, or password was incorrect" — проверьте кодировку и правильность пароля, не используйте повреждённый файл.
  • Конфликты ресурсов плагинов — объедините манифесты, используйте tools:replace или переименуйте конфликтующие ресурсы.

FAQ

  • Нужно ли всегда экспортировать Gradle проект?
    • Нет. Для простых проектов Unity‑сборки хватает встроенного Gradle. Экспорт нужен для сложной интеграции, нативных плагинов и CI.
  • Как хранить пароль keystore в CI безопасно?
    • В секрете CI (GitHub Secrets, GitLab CI variables) и подставлять в gradle.properties на этапе сборки, не коммитя в репозиторий.
  • Что выбрать: APK для теста или AAB?
    • Для публикации на Play — AAB. Для быстрого локального теста — APK.

Если нужно, могу сгенерировать пример gradle.properties и signingConfigs для CI или дать конкретные команды для настройки в GitHub Actions.