Перейти к содержанию
Educora
Продвинутый24 мин14 / 14

Публикация и лучшие практики

Задай приложению версию, подпиши его и опубликуй через Google Play Console; пиши тесты, делай приложение доступным для всех и проверяй его производительность в релизной сборке.

Проверь себя
В этом уроке ты узнаешь
  • Объяснять разницу между versionCode и versionName и настраивать релизную сборку
  • Создавать подписанный App Bundle и понимать роль Play App Signing
  • Проходить тестовые треки в Play Console и публиковать приложение
  • Писать модульные и UI-тесты и применять правила доступности и производительности

Приложение готово: экраны, навигация, сеть, база данных. Пора доставить его на телефоны друзей и тысяч пользователей. Путь состоит из нескольких шагов: задать версию, подписать, подготовить страницу приложения в Google Play Console, проверить с тестировщиками и наконец опубликовать. По дороге займёмся и качеством: тестами, доступностью и скоростью.

Версия и релизная сборка

У Android-приложения два номера версии. **versionCode — целое число, которое видят только система и Google Play; у каждой новой загрузки он должен быть больше прежнего. versionName** — строка, которую пользователи видят в магазине, например 0.1.0. Часто используют семантическое версионирование: MAJOR.MINOR.PATCH — крупное изменение, новая функция, исправление ошибки.

Kotlin
android {
    defaultConfig {
        applicationId = "com.educora.app"
        minSdk = 24
        targetSdk = 36
        versionCode = 102
        versionName = "0.1.2"
    }
    buildTypes {
        release {
            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
}
isMinifyEnabled включает R8: неиспользуемый код удаляется, остальной сжимается и оптимизируется; isShrinkResources убирает ненужные ресурсы.

Подпись и App Bundle

Android устанавливает только подписанные приложения: подпись подтверждает автора и то, что обновление пришло из того же источника. Новые приложения загружают в Google Play в формате Android App Bundle (.aab). Ты подписываешь бандл своим ключом загрузки (upload key), а через Play App Signing Google подписывает APK для пользователей ключом подписи приложения, который хранит у себя. Из бандла каждое устройство получает только нужные ему части, поэтому загрузка меньше.

  1. 1
    Открой меню

    Выбери Build › Generate Signed Bundle / APK, отметь Android App Bundle и нажми Next.

  2. 2
    Создай хранилище ключей

    Нажми Create new… и укажи расположение файла .jks, пароли, имя ключа (alias) и данные владельца. Срок действия выбери не меньше 25 лет.

  3. 3
    Выбери вариант release

    В следующем окне выбери вариант release и нажми Create. Готовый файл .aab появится в папке app/release.

Google Play Console

Для публикации нужен аккаунт разработчика Google Play: разовый регистрационный взнос 25 долларов США и подтверждение личности. Затем в Play Console нажимают Create app и заполняют несколько разделов: страницу в магазине (название до 30 символов, краткое описание до 80, полное до 4000, значок 512×512, главная картинка 1024×500, скриншоты), содержание приложения (политика конфиденциальности, форма Data safety, анкета возрастного рейтинга, целевая аудитория) и выпуск.

ТрекКто видит
Внутреннее тестированиедо 100 выбранных тестировщиков; новые версии приходят быстро
Закрытое тестированиеприглашённые списки адресов или группы
Открытое тестированиелюбой, кто присоединится со страницы в Google Play
Рабочая версия (production)все пользователи

Тесты

Модульные тесты лежат в папке src/test и выполняются на компьютере, без телефона, за секунды — идеально для проверки логики (вычислений, ViewModel). Инструментальные тесты лежат в src/androidTest и выполняются в эмуляторе или на телефоне; ими проверяют экраны Compose.

Kotlin
fun percent(correct: Int, total: Int): Int =
    if (total == 0) 0 else correct * 100 / total

class ScoreTest {
    @Test
    fun percent_isRoundedDown() {
        assertEquals(66, percent(correct = 2, total = 3))
    }

    @Test
    fun percent_withNoQuestions_isZero() {
        assertEquals(0, percent(correct = 0, total = 0))
    }
}
Тест JUnit в папке src/test. Целочисленное деление отбрасывает дробную часть: 200 / 3 = 66.
Kotlin
class QuizScreenTest {
    @get:Rule
    val composeTestRule = createComposeRule()

    @Test
    fun correctAnswer_movesToNextQuestion() {
        composeTestRule.setContent { QuizScreen() }

        composeTestRule.onNodeWithText("Question 1 of 5").assertIsDisplayed()
        composeTestRule.onNodeWithText("Correct").performClick()
        composeTestRule.onNodeWithText("Question 2 of 5").assertIsDisplayed()
    }
}
UI-тест Compose в папке src/androidTest: тест сам нажимает кнопку и проверяет, что экран изменился.

Доступность и производительность

Пользователи со слабым зрением работают с приложением через экранный диктор TalkBack, который вслух читает элементы экрана. Для значков без текста задавай contentDescription, а для декоративных картинок передавай null, чтобы диктор их пропускал. Области нажатия должны быть не меньше 48×48 dp (компоненты Material это обеспечивают), а размер текста задаётся в sp, чтобы текст увеличивался при выборе крупного шрифта в системе.

Немая для TalkBack кнопка
IconButton(onClick = onDelete) {
    Icon(
        painter = painterResource(R.drawable.ic_delete),
        contentDescription = null
    )
}
Кнопка с описанием
IconButton(onClick = onDelete) {
    Icon(
        painter = painterResource(R.drawable.ic_delete),
        contentDescription = stringResource(R.string.delete_lesson)
    )
}
Слева TalkBack произносит только «Button», справа — «Delete lesson». Текст берётся из strings.xml, поэтому переводится на каждый язык.
  • Скорость всегда измеряй в релизной сборке: в отладочной (debug) Compose работает заметно медленнее.
  • Тяжёлые вычисления выполняй во ViewModel или один раз через remember, а не прямо в composable.
  • Baseline Profile ускоряет запуск приложения и первые экраны; в Android Studio есть готовый шаблон модуля для него.
  • Доступность проверяй приложением Accessibility Scanner, а скорость — окном Profiler в Android Studio.
запустить тест или файл тестов под курсором (Mac: Ctrl+Shift+R)Ctrl+Shift+F10
переключиться между классом и его тестом или создать тест, если его нет (Mac: Cmd+Shift+T)Ctrl+Shift+T
удалить неиспользуемые импорты (Mac: Ctrl+Option+O)Ctrl+Alt+O
отформатировать код перед релизом (Mac: Cmd+Option+L)Ctrl+Alt+L

Главное

  • versionCode — целое число, растущее с каждой загрузкой, а versionName — видимая пользователю строка вроде 0.1.0.
  • Новые приложения загружаются как подписанный .aab; для пользователей подпись ставит Play App Signing.
  • В Play Console заполняют страницу в магазине, содержание приложения и тестовые треки; новым личным аккаунтам нужен 14-дневный закрытый тест с 12 тестировщиками.
  • Модульные тесты пишут в src/test, UI-тесты Compose — в src/androidTest.
  • Давай значкам contentDescription, задавай размер текста в sp и проверяй скорость только в релизной сборке.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Что обязательно должно увеличиваться при каждой новой загрузке в Google Play?