APK hazırla
Что такое APK?
APK — файл, который ставит телефон Android. Внутри экран, картинки, текст и код, который нужен приложению, чтобы работать. Магазин обычно открывает этот файл за тебя. Если сохранить и открыть его самому, телефон может спросить дополнительное разрешение.
APK — не язык программирования. Это пакет готового приложения. Внутри может быть Kotlin, Java, Flutter или только веб-страница. Снаружи все заканчиваются на .apk.
APK с незнакомой страницы может не быть настоящей копией приложения. Файл, который ты собираешь из своего сайта или своего zip, — другое. Буквы apk в имени не показывают, что файл безопасен.
Как делают APK?
Сначала пишут, что приложение будет делать. Потом собирают экран. Потом этот экран становится файлами. В конце программа упаковывает эти файлы в один APK. Телефон ставит этот один файл.
Короткий путь — веб-страница. Zip, в котором есть index.html, отдают Nibras Studio, и Studio превращает его в APK. Android Studio, аккаунт и курс кода для этого пути не нужны. Страница открывается в окне приложения на телефоне.
Длинный путь — программа, которая работает на самом телефоне. Тогда появляются папки, манифест и шаг подписи. APK в конце всё равно один файл, но чтобы до него дойти, нужно больше инструментов.
Что нужно?
Не каждый вид просит один и тот же инструмент. Если превращаешь сайт в приложение, хватает браузера, текстового редактора и zip. Сам телефон — проверка. Сборку делает Nibras Studio.
Нативное приложение на Kotlin или Java требует Android Studio, JDK и Android SDK. Пакет собирает Gradle. Capacitor нужен ещё Node и npm, потому что страница сначала стоит в веб-папке, потом переходит в папку android. Flutter нужен свой Flutter SDK.
- Веб-APK: редактор, браузер, zip, Nibras Studio
- Нативный: Android Studio, JDK, Android SDK, Gradle
- Capacitor: Node, npm, Android SDK, папка android
- Flutter: Flutter SDK, папка android
Этапы сборки
Пропуск этапа даёт в конце пустое приложение. Сначала закончи один экран, потом добавь второй. У каждого этапа свой файл.
- Напиши работу одной фразой: что приложение хранит или что показывает.
- Увидь экран на бумаге или на чёрном примере этой страницы. Заголовка, строки и кнопки хватает.
- Положи файлы в папку этого вида. Для веба index.html должен стоять в корне.
- Открой на своём компьютере. Веб-страницу проверь в браузере, нативное приложение — в эмуляторе или на телефоне.
- Собери APK. Если это веб-zip, отдай его Studio. Если нативный, Gradle вызывает assemble.
- Поставь на телефон и нажми кнопку. Поправь строку, которая не сработала, и собери снова.
Виды APK
Веб-APK
Это помещение сайта в окно телефона. Внутри HTML, CSS и JavaScript. Python, который работает на сервере, здесь сам не открывается. index.html должен быть в корне zip. Папки css и js стоят рядом. Картинка падает в img. Nibras Studio берёт этот zip или адрес сайта, выбираются имя, значок и имя пакета, и APK собирается.
qeyd/ index.html css/app.css js/app.js img/icon.png
Готовый пример устроен так. Скачай zip ниже, открой index.html, если хочешь сменить строку, и отдай его Studio.
Нативный APK
Пишется на Kotlin или Java. Экран — это xml-файл в res/layout. Работа кнопки — в файле java или kotlin. Значок — в папках mipmap. AndroidManifest.xml говорит имя приложения, пакет и экран открытия. Android Studio сам открывает эти папки. Сборка идёт через Gradle. Этот вид берут для камеры, датчика и глубокой работы на телефоне. Для маленькой страницы заметок он тяжёл.
app/src/main/ AndroidManifest.xml java/com/example/qeyd/MainActivity.kt res/layout/activity_main.xml res/mipmap-hdpi/ic_launcher.png
Запомни строку app/src/main. Манифест, экран и значок стоят под этой строкой.
APK Capacitor
Страница остаётся в папке www. capacitor.config.json говорит, как сайт входит в приложение. Папка android — нативная оболочка. Сначала закончи страницу в www, потом Capacitor обновляет папку android, а APK собирается из этого android-проекта. Нужны и Node, и Android SDK. Это на шаг дальше веб-APK: телефон можно трогать своим плагином.
www/ index.html capacitor.config.json android/app/src/main/ AndroidManifest.xml
www — это сайт. android — оболочка. Изменить одно и забыть другое — положить на телефон старый экран.
APK Flutter
Экран пишется на языке Dart внутри lib/main.dart. pubspec.yaml — список пакетов. Папка android всё ещё оболочка, но страницу держит не HTML. Flutter рисует экран сам. Проект не открывается, пока не поставлен SDK. Папок кажется мало, но инструмент учат отдельно.
lib/main.dart pubspec.yaml android/app/src/main/ AndroidManifest.xml
lib — это сам экран. android — только оболочка телефона. APK выходит командой flutter build apk.
Что лежит внутри APK?
APK на самом деле архив с другим именем. Имя кончается на .apk, но внутри папки и файлы. Телефон открывает этот один файл, проверяет подпись и потом запускает программу внутри. Изменить нутро и закрыть снова не делает приложение твоим. Подпись ломается, и телефон отклоняет файл.
Снаружи два APK могут выглядеть одинаково. Один держит страницу, другой — много экранов, картинок и библиотек. Размер растёт от картинок и добавленных инструментов, а не от длины фразы.
- AndroidManifest.xml говорит имя приложения, пакет, экран открытия и разрешения, которые оно может спросить.
- classes.dex — программа, которую запускает телефон. Kotlin и Java при сборке становятся этим. В веб-APK своей логики меньше, страница стоит отдельно.
- Папка res хранит картинки, текст и раскладку экрана.
- resources.arsc — таблица, которая связывает имя с картинкой и строкой.
- META-INF — это подпись. Если файл внутри изменился и подпись не обновлена, установка останавливается.
- В веб-APK сам сайт стоит в assets или похожей папке. Окно открывает эти файлы.
Зачем разрешения?
Камера, контакты и место не открываются только потому, что APK лежит на телефоне. Манифест лишь пишет, что приложение может спросить. Человек обычно соглашается, когда этот экран открывается первый раз. Без согласия эта работа не идёт, остальное приложение может остаться.
Проси только то, чем пользуется экран. Приложению заметок микрофон не нужен. Карте нужно место. Экрану, который говорит с сервером, нужен интернет. Лишнее разрешение пугает человека и вызывает вопрос при проверке магазина.
Если веб-APK открывает твой сайт, нужен интернет. Камера сама не приходит. И оболочка, и страница должны её спросить, и человек должен согласиться. Оставь разрешение на экране камеры, а не на первом открытии.
Debug, release и AAB
Debug APK нужен для проверки. APK, который собирает Nibras Studio, подписан отладочной подписью. Его можно поставить на свой телефон и нажать кнопку. Магазин обычно не берёт этот файл как окончательный выпуск. Другу для теста отдать можно, телефон может предупредить о неизвестном источнике.
Release APK подписывается твоим ключом. Этот ключ показывает, что следующее обновление пришло от тебя. Потеряешь ключ — не сможешь положить новый файл поверх того же приложения. Новое имя пакета считается другим приложением и стоит рядом со старым.
versionCode — целое число. В каждом новом файле оно должно вырасти. versionName — имя, которое видит человек, например 1.2. Если число не выросло, телефон не ставит новый файл на место старого.
AAB — пакет, который магазин часто хочет. APK — файл, который ставит телефон. Магазин может разрезать AAB на маленькие APK под вид телефона. Если ставишь сам, в руках должен быть APK.
Что такое развитый APK?
Простой APK — это один экран. Он хранит строку на телефоне. Он не знает, кто человек. Закрой и открой — строка на месте, и этого хватает. Заметка, счётчик и страница с одной кнопкой такого вида. Его можно собрать за день.
Развитый APK — это много экранов. Есть учётная запись. Данные должны быть видны и на другом телефоне. Список приходит из интернета. Картинка отправляется. Уведомление может прийти, когда приложение закрыто. Двое видят одно изменение. Это уже не страница, сжатая в файл. Телефон, сервер и сохранённые данные работают вместе.
Развитое приложение не начинается большим в первый день. Сначала заканчивается простой экран. Потом приходит второй. Потом сохранение переходит на сервер. Потом вход. Написать всё это в первый день — получить пустую оболочку: кнопки есть, работы нет.
На веб-пути трудная часть часто сам сайт. Вход, список и сервер живут на сайте. APK — только окно. Nibras Studio может превратить этот сайт в приложение. Native или Flutter выбирают, когда камера, файлы и фоновая работа должны быть глубже страницы. Если окна хватает, вторая программа — потеря времени.
Как собирают развитый APK?
Большое приложение не начинается одной фразой. Слова «программа, которая делает всё» не заканчивают ни один экран. Раздели работу на короткие фразы. Например: человек входит, видит свои заметки, добавляет одну, и эта заметка видна на втором телефоне. Это четыре фразы и четыре работы. У каждой свой экран и свой файл.
- Раздели экраны. Список, внутренность одной заметки, форма записи и вход. У каждого экрана одна работа.
- Выбери, где лежат данные. Строка, которая нужна только этому телефону, может остаться на нём. Если её должен видеть другой телефон, нужен сервер.
- Телефон шлёт серверу короткий запрос. Сервер возвращает данные. База не лежит внутри APK.
- Не пиши пароль и тайный ключ в код. Человек, который откроет APK, сможет это прочитать. Проверяет сервер. Телефон хранит только знак разрешения.
- Вход — отдельный экран. Сервер даёт знак. Знак — это не сам пароль.
- Положи разрешение на экран, где работа. Камеру спрашивают на экране камеры, не при первом открытии.
- Реши, что остаётся открытым, когда интернет пропал. Может показаться копия последнего списка. Новая запись может подождать и уйти позже. Если этого не продумать, экран просто встанет.
- Проверь на узком телефоне. Кнопка, которая помещается на твоём экране, может вылезти на другом.
- Подними versionCode. Подпиши тем же ключом, что и старый release. Имя пакета должно остаться тем же.
- Страница магазина отдельно от APK. Имя, картинки, короткий текст и адрес политики не кончаются внутри файла.
Папки Gradle
В простом приложении один экран стоит в activity_main. В развитом проекте у каждого экрана свой файл, и Gradle собирает их в один APK. В корне settings.gradle говорит, какой модуль есть, обычно app. build.gradle — правило сборки. gradle/wrapper и gradlew держат сам Gradle вместе с проектом, чтобы на другом компьютере работала та же версия. gradle.properties — мелкие настройки.
Настоящий код лежит в папке app. app/build.gradle пишет библиотеки и версию SDK. Под src/main/java стоят папки пакета: список, внутренность заметки и вход — отдельные файлы. res/layout — раскладка экрана, res/mipmap — значок, assets — страница или шрифт, который кладут внутрь. Папки app/build и .gradle появляются сами во время сборки. Их не пишут руками и не кладут в Git.
Папка сервера может не стоять внутри проекта телефона. Она работает по другому адресу. APK только шлёт ей запрос. Чёрный экран ниже — приложение, которое дают эти папки: список, место для картинки и нижнее меню.
Qeyd/
settings.gradle
build.gradle
gradle.properties
gradlew
gradle/wrapper/
app/
build.gradle
src/main/
AndroidManifest.xml
java/az/studio/qeyd/
MainActivity.kt
SiyahiEkran.kt
QeydEkran.kt
GirisEkran.kt
res/layout/
res/values/
res/mipmap-hdpi/
assets/
server/ (ayrı ünvanda)Сначала увидь один экран на телефоне. Потом добавь второй. Сервер подключай в конце и только если второй телефон должен видеть ту же строку. Начнёшь наоборот — останется база без кнопки и пустой APK.
Обновление и частые вопросы
Телефон заменяет старое приложение, только когда сходятся три вещи. Имя пакета одно. Подпись от того же ключа. versionCode больше. Если одного нет, новый файл либо не ставится, либо стоит рядом со старым как второе приложение.
Собирай своё приложение. Открыть чужой APK и положить внутрь свой экран не делает его твоим. Подпись ломается, файл не ставится, и эта программа не твоя.
APK и AAB — одно и то же?
Нет. APK — файл, который открывает телефон. AAB — пакет, который отдают магазину. Магазин может превратить его в APK под телефон.
APK открывается на iPhone?
Нет. iPhone использует другой файл и другое правило. APK, собранный для Android, там не ставится.
Почему файл большой?
Одна фраза на экране файл не растит. Растят картинки, шрифты и лишние библиотеки. Не клади внутрь картинку, которая не нужна.
Веб-APK работает без интернета?
Страница, которую ты положил в zip, остаётся на телефоне и может открыться. Страница, которая грузится с адреса, хочет интернет. Если картинка тоже приходит снаружи, при обрыве сети она пустая.
Debug-файл кладут в магазин?
Нет. Он для проверки. Магазину нужна подпись release, растущая версия и часто AAB.
Как установить APK на телефон?
Установить APK — не значит положить его в магазин. Файл открывается на телефоне, телефон просит разрешение, потом приложение появляется в списке. Магазин прячет этот шаг за тебя. У файла, который ты собрал или скачал с сайта, шаг виден тебе.
Не каждый файл, который кончается на apk, ставится. Недокачанный файл, документ с чужим именем и обновление, собранное другой подписью, останавливают телефон. Прежде чем открыть, узнай, откуда файл.
Перед установкой
Открывай только файл, который собрал сам, или который пришёл с твоего сайта либо со страницы самого автора. APK, который ходит в сообщении, с именем похожим на известное приложение и без своей страницы, может быть другой программой. Буквы apk в имени не значат безопасность.
Файл от Nibras Studio нужен для проверки. Его можно поставить на свой телефон и нажать кнопку. Это не выпуск магазина. При установке телефон может сказать «неизвестное приложение». Это лишь значит, что файл пришёл не из Play.
Окно установки показывает разрешения, которые приложение может спросить. Прочитай список. Если приложение заметок просит камеру, контакты и место, закрой файл. В приложении, которое собрал сам, этот список — то, что ты написал в манифесте.
Шаги
На Android 8 и новее разрешение — не один общий переключатель. Каждому приложению, которое открывает файл, нужно своё. Разрешение для Chrome не переходит на приложение «Файлы».
- Скачай файл до конца. Если размер ноль или намного меньше, чем ты ждал, загрузка не кончилась. Удали этот файл и возьми снова.
- Нажми файл apk из папки загрузок или из приложения файлов. Нажатие готовой загрузки под браузером тоже работает.
- Если телефон говорит, что установка из этого источника закрыта, перейди в настройку, которая открылась. Включи установку неизвестных приложений для этого приложения или строку с тем же смыслом. Вернись и нажми файл снова.
- На старом Android путь другой. Настройки, безопасность, неизвестные источники. После установки закрой эту строку снова.
- Прочитай список разрешений. Если согласен, нажми Установить. Когда кончится, появится Открыть.
- Если то же приложение уже есть на телефоне и подпись совпадает, кнопка говорит Обновить. Имя пакета должно быть тем же, подпись той же, а versionCode больше.
- Открой и один раз нажми главную кнопку. Белый экран или мгновенное закрытие значит, что не работает нутро, а не что установка сорвалась.
- После дела разрешение можно выключить. В настройках погаси неизвестную установку у этого браузера или приложения файлов. Уже поставленное приложение не исчезнет.
Разница по марке
На чистом Android путь короткий. Когда открываешь файл, телефон сам ведёт на страницу разрешения. Так устроены Pixel и часть телефонов Nokia.
На Samsung путь: Настройки, Безопасность и конфиденциальность, установка неизвестных приложений. На части моделей автоблокировка или защита приложений режет файл. Прочитай предупреждение. Если это файл, который собрал сам, разреши только этот раз. Не выключай защиту навсегда.
На Xiaomi, Redmi и Poco разрешение часто лежит в Настройках, Конфиденциальность, особые разрешения, неизвестные приложения. Приложение Безопасность ещё сканирует файл и держит установку. Когда скан кончится, Установить иногда нужно нажать снова. Если кидаешь с компьютера по кабелю, в параметрах разработчика также должна быть включена установка по USB.
На Huawei и Honor путь: Настройки, Безопасность, ещё настройки, установка из неизвестных источников. На части моделей есть режим, который режет внешний источник. Для файла не из AppGallery открой этот режим только на эту установку, потом закрой.
На что смотреть
Этот путь не заменяет проверку магазина. Если отдаёшь тестовый файл другу, он видит те же шаги. Выпуск для всех требует Play или AppGallery.
- Play Protect может показать предупреждение. Он не знает твой тестовый файл. Прочитай текст. Файл неизвестного автора не проводи через «всё равно установить».
- Детский аккаунт и рабочий профиль могут отрезать установку. На таком телефоне обычного разрешения пользователя мало.
- Приложение, которое открывает файл, и приложение, которому ты разрешил, должны быть одним. Если открываешь из Telegram, разрешение для Telegram. Если потом открываешь из Файлов, дай разрешение и Файлам.
- Когда установка кончается, приложение видно в меню. Если не видно, поищи имя пакета или заголовок с экрана. Иногда оно падает внутрь папки.
- Удаление — из настроек или долгим нажатием на значок. Когда удалишь, строка, которую приложение хранило внутри, тоже может уйти.
APK, который не ставится и не открывается
Телефон обычно показывает одну короткую фразу. Под ней может сидеть несколько причин. Сначала смотри на сам файл, потом на старую копию на телефоне, в конце на вид телефона. Удалить не то место и поставить снова иногда стирает и старые данные. Сначала отдели причину.
Пакет не разобран
«При анализе пакета произошла ошибка» или «файл не является допустимым пакетом» значит недокачанный или другой файл. Браузер сохранил страницу под именем apk. Если размер несколько килобайт, внутри текст, а не программа.
Удали файл. Открой сайт или Studio снова и дождись, пока процент загрузки дойдёт до конца. Если сеть оборвалась, остаётся битый файл. Переименовать zip в APK даёт ту же ошибку. APK собирается отдельно, zip — его сырьё.
Подпись не совпадает
«Пакет конфликтует с уже установленным» или «подписи не совпадают» значит, что на телефоне уже есть приложение с тем же именем, но этот файл собран другим ключом. Телефон не кладёт файл другого ключа поверх старого.
Выхода два. Удалить старое приложение и поставить новое. Это уносит сохранённую внутри строку. Либо собрать новый файл снова старым ключом. Если для проверки один раз брал debug-ключ, а для магазина другой, телефон не считает их одним приложением. Смешать debug-файл Nibras Studio со своим release-ключом даёт эту ошибку.
Версия старее
Если написано, что версию нельзя понизить, или вместо кнопки обновления приходит ошибка, versionCode нового файла меньше копии на телефоне или равен ей. Телефон назад не идёт.
Подними versionCode в build.gradle, собери снова и поставь этот новый файл. Сменить имя файла, не подняв число, недостаточно. Удаление старого тоже ставит, но данные человека уходят. На своём тестовом телефоне удалить можно. На чужом поднимай число.
Телефон не подходит
Если написано, что эта версия несовместима с устройством, или кнопка установки немая, minSdk приложения выше Android телефона. Старый телефон не открывает новую цель. Наоборот, файл с очень старой целью новый Android может отрезать сам.
Вторая причина — процессор. Split-файл, собранный только под один вид телефона, на другом не открывается. Нужен полный APK или файл под этот телефон. Бросить AAB прямо на телефон нельзя. Сначала он должен стать APK. Магазин делает это сам. Ручная установка хочет APK.
Память и тестовый файл
«Недостаточно памяти» — ясная причина. Удали снимки и ненужное приложение, потом нажми снова. Если сам файл большой, для установки нужно больше свободного места, чем размер файла, потому что телефон открывает его и копирует.
«Только для теста» бывает на части проверочных сборок Android Studio. Этот файл не для магазина и не для обычной установки. Возьми сборку release. Debug APK от Nibras Studio с этой фразой не приходит, его можно ставить обычным путём. Флаг testOnly в Android Studio останавливает установку из приложения файлов.
Play Protect и защита отрезали
Кнопка установки видна, потом приходит окно вредного приложения или окно защиты. На файле, которого не знаешь, это предупреждение не обходи. Если на тестовом файле, который собрал сам, текст не называет твой пакет, ты перепутал файл.
Если это твой файл, в том окне разреши только эту установку. Не выключай защиту на весь телефон. На Xiaomi и Samsung нажатие до конца скана повторяет ошибку. Дождись конца скана.
Рабочий профиль, семейный контроль и часть корпоративных телефонов режут внешний файл целиком. На таком устройстве настройка может быть не в твоих руках. Проверь на своём телефоне.
Поставилось, но не открывается
Значок есть. Нажимаешь — остаётся белый экран, или приложение сразу закрывается. Это уже не ошибка установки. Не работает страница, разрешение или библиотека внутри.
- Если веб-приложение открывается с адреса, проверь интернет. Если адрес неверный, экран пустой. Страница, положенная внутрь zip, должна открываться и без адреса.
- На Huawei и на телефоне без служб Google вход через Google, карты или уведомление Play могут уронить открытие. Спрячь эту часть или не вызывай службу, которой на телефоне нет.
- Если разрешение отклонено, кнопка мертва. Зайди в разрешение приложения в настройках и включи камеру или уведомления.
- Если остались старые битые данные, очисти память приложения. Можно также удалить и поставить снова тем же ключом. Установка другим ключом возвращает ошибку подписи.
- Если открывается только у тебя и не у другого, ты не смотришь на разницу эмулятора или своей версии Android. Проверь один старый и один новый телефон.
Проверяй в таком порядке
Когда несколько причин лежат вместе, сначала меняй файл, потом старую копию, в конце телефон.
- Посмотри размер файла. Если он слишком мал, скачай снова.
- Если то же приложение есть на телефоне, проверь подпись и versionCode. Если не совпадают, удали или подними число и собери тем же ключом.
- Если Android телефона ниже, чем просит приложение, нужен другой телефон или более низкий minSdk.
- Посмотри свободное место. Потом прочитай окно защиты и не выключай её навсегда.
- Если поставилось и не открывается, раздели интернет, разрешение и службы Google. Белый экран часто значит неверный адрес.
Значок, имя и имя пакета
У приложения три имени, и они делают не одну работу. Короткое имя под значком — то, что видит человек. Имя на странице магазина может быть длиннее. Имя пакета — не слово, которое человек читает. Телефон и магазин узнают приложение по нему. Изменить одно не меняет остальные само.
Значок тоже отдельно. Картинка в меню телефона и картинка магазина 512 могут быть одним рисунком, но это разные файлы. Взять чужой знак или имя известного приложения — и отказ, и не твоё приложение.
Имя под значком
Это имя видно под значком. Если оно длинное, телефон обрезает. Хватает двух или трёх коротких слов. «Моё самое лучшее приложение заметок» в меню не помещается.
В нативном проекте имя стоит в строке app_name внутри res/values/strings.xml. AndroidManifest.xml зовёт его через android:label="@string/app_name". Слово можно вписать прямо в манифест, но потом отдельная строка для каждого языка становится труднее. Для другого языка тот же app_name повторяется в папках res/values-tr и res/values-ru.
Nibras Studio спрашивает имя при сборке. Это имя падает в заголовок окна. Крупный заголовок внутри сайта остаётся в index.html. Если хочешь, чтобы оба совпали, поменяй имя в Studio и заголовок на странице.
Имя магазина — отдельная форма. Там можно написать чуть длиннее, но не обещай работу, которой нет внутри. Имя в меню может быть «Заметка», имя в магазине — «Заметка — дневная строка». Имени пакета может не быть ни там, ни там.
Значок
Телефон не хранит картинку в одном размере. Несколько размеров одного рисунка раскладываются по папкам. Если одного нет, телефон уменьшает большую картинку, и значок выглядит мутным.
- 48×48 внутри mipmap-mdpi
- 72×72 внутри mipmap-hdpi
- 96×96 внутри mipmap-xhdpi
- 144×144 внутри mipmap-xxhdpi
- 192×192 внутри mipmap-xxxhdpi
- Отдельный PNG 512×512 для магазина. Он кладётся в форму магазина, а не в папку телефона.
В новом проекте значок часто обрезается в круг или скруглённый квадрат. Не клади текст и важную линию на край. В середине пусть останется один знак. Буква на краю срежется.
Файл обычно называется ic_launcher.png. Круглый значок может быть отдельным ic_launcher_round.png. Окно Image Asset в Android Studio само делает эти размеры из одной картинки. Вручную бросить одну большую картинку в одну папку недостаточно.
В веб-APK Nibras Studio берёт значок на шаге сборки. Маленький значок сайта не всегда значок телефона. Картинка, которую отдаёшь Studio, должна быть квадратной, и на краю не должно быть знака чужой марки.
Имя пакета
Имя пакета — постоянный номер приложения. Человек может не видеть его в меню, но телефон по нему знает, один ли это приложение у двух файлов. Обычно пишут обратный домен: az.studio.note. Каждый кусок — строчные буквы. Без пробела, без заглавной и без дефиса. Цифра не стоит в начале куска.
Место меняется от вида проекта. Для нативного и Flutter это строка applicationId в app/build.gradle. Для Capacitor appId внутри capacitor.config должен совпасть с этой строкой. Старая строка package в манифесте остаётся в части проектов. Если applicationId другой, телефон смотрит на applicationId.
Не ходи в магазин с com.example или com.test. Это пример имени. Если своего домена нет, выбери устойчивое имя и пиши его везде одинаково: az.tvoyoimya.note. После первой загрузки Play и AppGallery не дают это имя менять.
Смена имени открывает новое приложение. Старый пакет остаётся на старом телефоне, новый стоит рядом. Обновление не переходит. Строка, сохранённая внутри, остаётся в старом приложении. Поэтому имя решают в самом начале, до первого release.
Что не путать
Запиши три вещи на один лист: имя меню, имя пакета и где лежит ключ. После первого AAB пакет с этого листа не меняется.
- Смена имени в меню не меняет пакет. Меняется только слово, и обновление ложится на то же приложение.
- Смена пакета сама не чинит имя в меню. Это две работы.
- Смена значка не меняет ключ. Файл с новым значком, подписанный тем же ключом, встаёт на место старого.
- Имя магазина и имя меню могут не совпадать. Короткая разница, которая не ложь, нормальна.
- Скопировать значок и пакет чужого приложения не делает его твоим. Магазин отказывает, а телефон не ставит, когда подпись не совпадает.
Как создать ключ?
Ключ — это подпись приложения. Файл закрываешь этим ключом. Телефон и магазин ищут тот же ключ в следующем файле. Если пакет тот же, ключ тот же и versionCode больше, старое приложение обновляется. Если ключ другой, телефон считает это другим автором и сверху не кладёт.
Ключ — это не один пароль. Это файл под именем keystore, внутри один или несколько ключей. У каждого ключа есть прозвище, alias. Спрашивают и пароль файла, и пароль ключа. Потеряешь оба — не откроешь файл, даже если он в руке.
Создать командой
Если на компьютере стоит Java, команда keytool создаёт ключ. Открой пустую папку рядом с проектом и положи ключ туда. В Git-папку проекта не клади. Когда команда спрашивает, пишут имя, организацию и город. Строку, которой не знаешь, можно оставить пустой. Пароль на экране терминала не оставляй.
keytool -genkeypair -v \ -keystore qeyd.keystore \ -alias qeyd \ -keyalg RSA \ -keysize 2048 \ -validity 10000
qeyd.keystore — сам файл. qeyd — прозвище. RSA размером 2048 хватает для сегодняшней сборки. 10000 дней — долгий срок. Если выбрать короткий, ключ устареет и обновление встанет. Когда команда кончится, храни файл в двух местах: одно на своём диске, другое на отдельном накопителе.
Чтобы увидеть, что создалось, напиши keytool -list -v -keystore qeyd.keystore. Он спросит пароль и покажет отпечаток сертификата. Если позже подключишь вход Google или карту, этот отпечаток может понадобиться. Храни его вместе с ключом.
Привязать к сборке
Файл ключа сам по себе APK не подписывает. Сборка release должна его вызвать. В Android Studio окно Generate Signed Bundle или Generate Signed APK спрашивает файл, прозвище и пароль. Путь можно запомнить. Пароль нельзя писать в файл, который видят все.
Когда связываешь через Gradle, не клади пароль в проект открытым текстом. Храни его в отдельном файле и не добавляй этот файл в Git. Пример только показывает место. Замени ACARIN своим паролем, а файл держи вне хранилища.
// app/build.gradle — şifrəni repoya yazma
signingConfigs {
release {
storeFile file("qeyd.keystore")
storePassword "ACARIN"
keyAlias "qeyd"
keyPassword "ACARIN"
}
}Потом сборка release вызывает эту настройку. ./gradlew bundleRelease даёт AAB. ./gradlew assembleRelease даёт APK. Сборка debug этот ключ не использует. Она закрывается своим debug-ключом компьютера.
Debug-ключ другой
Android Studio при первой проверке твой ключ не просит. На компьютере есть скрытый debug.keystore. Файл, собранный тем ключом, похож только на проверку на твоей машине. Debug-ключ другого компьютера другой. Поэтому debug-файл с одного компьютера не ложится на debug-файл с другого, и выходит ошибка подписи.
APK от Nibras Studio тоже подписан debug-подписью. Друг может попробовать его на телефоне. Play и AppGallery не берут этот файл как окончательный выпуск. С первого файла, который идёт в магазин, нужен свой release-ключ. Один раз выйти в магазин на debug-ключе нельзя.
Где хранится и что будет, если потеряется
Не храни ключ в папке проекта, в почте и на общем диске. Он должен лежать на отдельном накопителе и в месте, которое открываешь только ты. Не пиши пароль в открытый текстовый файл рядом с ключом. Пароль храни в другом месте. Потерять оба в одном месте легко, и украсть оба из одного места тоже легко.
Если ключ APK, который подписал сам, потерян, новый файл поверх этого приложения не положить. Можно удалить старое и начать с новым именем пакета. Старая страница магазина и данные человека в новое приложение не переходят.
В Play App Signing могут быть два ключа. Ключ загрузки у тебя, ключ подписи магазина у Google. Если потеряешь ключ загрузки, можно попросить сброс в Play Console. Это может занять несколько дней. Потеря собственного ключа подписи магазина не в твоих руках, его хранит Google. У старого приложения, которое не входило в эту службу и чей ключ был только у тебя, потеря окончательна.
На Huawei, если APK подписываешь сам, правило то же. Потеряешь ключ — обновление этого приложения в AppGallery встанет. Если выбрал AAB и вошёл в службу подписи Huawei, последняя подпись у них. Всё равно храни ключ файла, который загружаешь, потому что следующая загрузка может его спросить.
Как заработать на мобильном приложении?
Деньги сами внутри приложения не появляются. Сначала должен быть экран, который делает дело для человека. Потом ты берёшь плату за часть этой работы или показываешь рекламу. Кнопка оплаты на пустом приложении денег не приносит. Если человек не видит причины, он не нажимает.
Доход обычно начинается с малого. Сначала десять человек должны открыть приложение и закончить своё дело. Потом добавляется оплата или реклама. Сеть рекламы, аккаунт магазина и банк можно подключить в первый день, но пришедшие деньги зависят от пользователей.
Платные пути
Есть несколько прямых путей. Заполнить все сразу портит экран. Выбери один, увидь, что он работает, потом добавь второй.
- Платная установка. Человек платит один раз, когда берёт приложение из магазина. Это подходит маленькому готовому инструменту.
- Разовая покупка внутри приложения. Дополнительная страница, режим без рекламы или набор. Если цифровой товар продаётся в магазине, он должен пройти через оплату самого магазина.
- Подписка. Она обновляется каждый месяц или каждый год. Человек должен видеть, когда она кончается и как её остановить.
- Реклама. Полоса стоит у края экрана. Реклама на весь экран не должна резать дело. В рекламе с наградой человек сам смотрит и получает что-то взамен.
- Своя услуга. Приложение — окно сайта. Урок, бронь или работа вне телефона могут оплачиваться на сайте. За цифровой товар, который тратится внутри приложения, магазин часто хочет свою оплату.
Что нужно подключить
Чтобы деньги дошли до тебя, нужны и аккаунты вне приложения. Они не лежат в папке APK. Ты регистрируешься на сайте, а приложение хранит номер этого аккаунта.
- Аккаунт магазина. Чтобы выйти в Google Play, нужен Play Console. При открытии есть разовый взнос.
- Профиль продавца и банк. Магазин должен знать, куда слать деньги. Спрашивают и налоговые сведения.
- Play Billing для цифровой покупки. Внутрь приложения подключается библиотека. Цена открывается как товар в магазине, скрытую цену в код не пишут.
- Аккаунт рекламной сети для рекламы. Приложению дают номер рекламного блока. Если пользователь в Европе, нужно и окно согласия.
- Страница политики. На одном адресе напиши, что собираешь, и упомяни рекламу и оплату. Магазин просит этот адрес.
- Тестовый пользователь. Первую покупку не делай своей картой. Проверка лицензии магазина даёт нажать кнопку поддельной оплатой.
Debug APK от Nibras Studio нужен для проверки. Оплата магазина им не открывается. Если оплата есть на самом сайте, окно может открыть ту страницу. Чтобы положить в магазин, всё равно нужны подпись release, растущая версия и правило магазина.
На что смотреть
Магазин оставляет себе часть продажи, остальное приходит тебе. Точная доля написана на странице самого магазина и может меняться. Налог с пришедшей суммы считают по правилу своей страны.
- Не прячь цену. Сумма и срок должны быть видны рядом с кнопкой. У подписки должно быть написано, когда она обновляется.
- Остановка не должна быть трудной. Человек должен закрыть подписку со страницы подписок магазина.
- Реклама не должна выглядеть как системная кнопка. Знак закрытия не должен быть крошечным или фальшивым. Не закрывай главную кнопку экрана.
- Для детей правило строже. Рекламу и покупки в детском приложении проверяют жёстче. Если не знаешь возраст, не заполняй приложение так, будто оно сделано для детей.
- Не продавай чужое. Не ставь чужой курс, музыку или картинку за свою кнопку оплаты.
- Не пиши тайный ключ и секрет оплаты внутрь APK. Человек, который откроет файл, сможет это прочитать. Проверку оставь на сервере.
- Не обещай первые деньги. Доход рекламы зависит от показов. Если никто не открывает, сеть тоже не платит.
- Приложение, которое ломает правило, может потерять аккаунт. Сюда входят обманная кнопка, скрытая подписка и оплата, которая не работает.
Как загрузить готовое приложение в Play Market?
Play Market — это Google Play. Положить APK на свой телефон — другая работа. Чтобы выйти в магазин, нужны аккаунт Play Console, подписанный AAB и заполненная страница. Debug APK от Nibras Studio туда не идёт. С августа 2021 новое приложение должно быть AAB, а не APK. AAB — это пакет. Магазин превращает его в маленький APK под вид телефона.
Работа не кончается за день. Есть проверка личности, текст, картинки и на части аккаунтов закрытый тест на 14 дней. Сначала собери файл, потом заполни страницу, в конце отправь на проверку.
Шаги
Порядок важен. Пустое приложение открыть и картинку загрузить можно, но кнопка production не откроется, пока формы не закончены.
- Открой Play Console с аккаунтом Google. У личного аккаунта просят документ. У аккаунта организации — бумаги компании и часто номер D-U-N-S. При открытии есть разовый взнос. Сумму показывает страница регистрации.
- Нажми Create app. Выбери имя, первый язык, приложение или игра, бесплатно или платно. Имя пакета запирается первым AAB и потом не меняется. Оно должно совпасть с applicationId внутри приложения.
- Собери release AAB. В Android Studio это Generate Signed Bundle, либо ./gradlew bundleRelease в корне проекта. Файл обычно лежит в app/build/outputs/bundle/release. Храни ключ. Потеряешь — не положишь новый файл поверх того же приложения.
- В Play App Signing могут быть два ключа. Ключ загрузки остаётся у тебя, ключ подписи магазина — у Google. Обновление должно следовать обоим правилам. Файл, собранный отладочным ключом, в магазин не идёт.
- С 31 августа 2026 новое приложение для телефона и обновление должны целиться в API 36, то есть Android 16. Старую цель не принимают. targetSdk пишется в build.gradle.
- Заполни страницу магазина. Короткий текст, длинный текст, значок 512, картинка 1024x500, снимки экрана телефона, категория и почта для связи. Адрес политики должен открываться.
- Закончи формы содержания. Есть ли реклама, какие данные собираются, анкета возраста, для кого приложение. Если для детей, формы строже. У новостного приложения отдельное заявление.
- Выбери страны и цену. Можно оставить бесплатным и брать оплату внутри. Потом превратить бесплатную установку в платную бывает трудно.
- Сначала положи во внутренний тест. Это твой список почты, до 100 человек. Увидь, что файл открывается. Эта дорожка не считается в правиле 12 человек.
- Потом закрытый тест. Список почты или Google Group. Личный аккаунт, открытый 13 ноября 2023 или позже, для каждого нового приложения должен держать минимум 12 человек одновременно 14 дней подряд. Если один вышел, его счёт начинается заново. Новая сборка дни не обнуляет. Аккаунт организации и личный аккаунт до этой даты в эту стену не упираются.
- Когда 14 дней кончатся, попроси доступ к production с Dashboard. В ответах напиши настоящую работу приложения. Доступ часто занимает до недели. Открытый тест открывается после этого доступа.
- После доступа отправь AAB на дорожке production. Проверка может занять несколько дней. Отказ пишет причину. Исправь и отправь снова с большим versionCode.
Обновление
Новый файл встаёт на место старого приложения, только когда сходятся три вещи. Имя пакета не меняется. Подпись совпадает с прошлым release. versionCode больше. Новое приложение под другим именем старых пользователей не переносит. Оно стоит в магазине второй программой.
Снимок экрана должен быть из самого приложения. Не обещай работу, которой нет в тексте. Первый отказ бывает. Прочитай отчёт, поправь картинку или текст и отправь снова. Обманная страница и оплата, которая не работает, могут закрыть аккаунт.
Как загрузить готовое приложение в Huawei AppGallery?
Магазин Huawei — это AppGallery. Это отдельный аккаунт от Play Market. Аккаунт Google там не работает. APK, который ты положил на свой телефон, сам в магазин не падает. В AppGallery Connect открывают приложение, загружают подписанный файл, заполняют страницу и отправляют на проверку.
Выйти в Play не значит выйти в Huawei. Имя пакета может быть тем же, но аккаунтов два, страниц две и проверок две. Когда одно кончается, другое само не открывается.
Шаги
Файл не загружается, пока аккаунт не проверен. Сначала закончи личность, потом собери пакет.
- Открой Huawei ID на developer.huawei.com. Проверься как человек или как компания. У личного аккаунта просят документ, у компании — регистрационные бумаги. Проверка часто занимает один или два рабочих дня.
- В AppGallery Connect открой My apps, потом новое приложение. Платформа Android, устройство телефон. Напиши имя, первый язык, имя пакета и категорию. Имя пакета после первой загрузки не меняется и должно совпасть с applicationId внутри приложения.
- Выбери файл. Можно отдать и APK, и AAB. APK подписываешь своим ключом. На этом пути последняя подпись остаётся у тебя. Если выбираешь AAB, надо войти в службу App Signing от Huawei, и последнюю подпись хранят они.
- Путь APK такой. В папке android проекта выполни ./gradlew assembleRelease. Файл лежит в app/build/outputs/apk/release. Ключ не теряй. Следующее обновление должно быть подписано тем же ключом.
- versionCode и versionName должны совпасть с версией, которую пишешь в магазине. versionCode растёт с каждым новым файлом. То же число на место старого не встаёт.
- Для каждого языка заполни имя, короткий текст, длинный текст, значок и снимки экрана. Картинки должны быть экраном самого приложения. Пустая картинка или вырезанная из другой программы — причина отказа.
- Напиши страны, бесплатно или платно, и адрес политики. Возрастной рейтинг выбери анкетой. Если продаёшь цифровой товар внутри приложения, могут потребовать внутреннюю оплату Huawei.
- Перед отправкой открой на телефоне Huawei или в облачном тесте AppGallery. Эмулятор с Google прячет ошибку, которая останавливается на Huawei.
- Отправь страницу на проверку. Это может занять несколько дней. Отказ пишет, чего не хватает. Исправь и отправь снова с тем же именем пакета и большим versionCode. Можно открыть сразу после проверки или в выбранный час.
Служб Google на Huawei нет
С конца 2019 на многих телефонах Huawei нет служб Google Play. Вход через Google, карты Google, Play Billing и уведомления Firebase на этих телефонах не открываются. Спрячь эти части или замени службой самой Huawei. Приложение, которое прошло проверку, может открыться и показать пустую кнопку. Поэтому нужен облачный тест или настоящий телефон Huawei.
Если приложение только окно твоего сайта и не вызывает библиотеку Google, та же страница может открыться и в AppGallery. Всё равно нужен APK или AAB с подписью release. Debug-файл от Nibras Studio — не файл магазина.
Два магазина — две аудитории. Человек в Play сам не видит тебя в Huawei. Текст страницы, значок и адрес политики заполняются в каждом магазине отдельно. Одинаковое имя пакета в обоих не смешивает обновления, потому что магазины не носят подпись друг друга. Ключ первого файла храни в своём месте для каждого магазина.
В каких случаях приложение могут не одобрить?
Магазин может отказать не потому, что файл открылся, а потому что он не следует правилу. Отказ не всегда закрывает аккаунт. В ответе пишут причину. Её можно исправить и отправить снова с тем же именем пакета и большим versionCode. Вторая отправка той же ошибки удлиняет проверку. Обман ставит аккаунт под риск.
Play и Huawei не говорят одними словами, но корень отказа похож. Страница лжёт, приложение не открывается, разрешение не объяснено или файл — не та сборка, которую просил магазин. Ниже случаи, которые встречаются чаще всего.
Страница не совпадает с приложением
Проверяющий сначала смотрит страницу магазина, потом открывает приложение. Если они не говорят об одной работе, приходит отказ. Снимок, вырезанный из другой программы, значок чужой марки или кнопка, обещанная в тексте и отсутствующая в приложении, делают страницу ложью.
- Короткий и длинный текст пустые, скопированы из другого приложения или это только куча ключевых слов.
- Снимки экрана — не экран самого приложения. Размер неверный или картинка мутная.
- В имени есть «официальное», «лучшее» или имя чужой компании, а ты не эта компания.
- Адрес политики не открывается, страница пустая или не говорит, что приложение собирает.
- Язык смешан. Страница на одном языке, внутри приложения другой, и проверяющий не понимает работу.
- Категория неверная. Игра записана как инструмент, а детское приложение — как для взрослых.
Приложение не открывается или пустое
Проверяющий должен увидеть главную работу за несколько минут. Файл, который падает на первом экране, остаётся белым или имеет кнопку, которая ничего не делает, не одобряют. Открытия на твоём телефоне мало. Он должен открыться и на их тестовом устройстве.
- При открытии даёт ошибку или сразу закрывается.
- Просит вход, но пробное имя и пароль не написаны в заметке. Без твоего аккаунта внутрь не заглянуть.
- Сервер выключен. Список пуст, картинка не приходит, страница стоит.
- Нажатие на кнопку не даёт ответа. Форма не уходит.
- Запрос разрешения без причины. Просишь камеру, а экрана, который ею пользуется, нет.
Это только окно сайта
Google Play часто отказывает приложению, которое лишь кладёт сайт в окно. Если нет уведомления, работы, сохранённой на телефоне, камеры и кнопки сверх страницы, проверяющий может не счесть это отдельным приложением. Если открыть адрес сайта в браузере — та же работа, магазин считает файл лишним.
Huawei тоже может отказать пустому окну и адресу, который не открывается. Если сам сайт полный и работает на телефоне, шанс выше, но это не обещание. Debug APK от Nibras Studio на эту проверку не отправляют. Магазину нужна сборка release.
Если хочешь сделать из окна приложение, добавь хотя бы одну телефонную работу. Сохрани последнюю открытую страницу, пошли уведомление или возьми одну картинку с камеры. Отправка без этого повышает шанс отказа.
Данные, реклама и деньги
Форма и нутро приложения должны совпасть. Фраза «ничего не собираю» в анкете безопасности данных при сохранённом аккаунте и номере рекламы — причина отказа. Страница политики должна написать этот список открыто.
- Цифровой товар не проходит через оплату самого магазина. Play ждёт Play Billing, Huawei — свою внутреннюю оплату.
- Подписка спрятана. Цена и срок обновления не стоят рядом с кнопкой.
- Рекламу нельзя закрыть, она выглядит как системное предупреждение или закрывает главную кнопку.
- Пишешь, что для детей, а внутри взрослая реклама и покупки. Возрастная группа выбрана неверно.
- Согласие на слежение не спрашивают, хотя рекламная сеть этого требует.
Чужое имя и сам файл
Чужое имя, значок, музыка, картинка или текст останавливают одобрение. Положить экран чужого приложения под своё имя — и отказ, и риск для аккаунта. Сними свой экран.
- Отладочная подпись. Магазин не берёт тестовый ключ как окончательный выпуск.
- Старый targetSdk. С 31 августа 2026 приложение для телефона должно целиться в API 36. Более низкая цель возвращает файл.
- В обновлении versionCode не растёт или имя пакета не совпадает с прошлым файлом.
- Ключ не тот, что у прошлого release. Магазин считает это новым приложением или сломанным обновлением.
- На Huawei библиотека Google роняет открытие. Телефон без карт, входа Google или уведомлений Play остаётся с пустым или закрытым экраном.
Что делать, когда пришёл отказ
Дочитай отчёт до конца. Часто это несколько пунктов, а не одна строка. Исправь все. Не оставляй один и не отправляй снова. Сними экран заново из самого приложения. Открой страницу политики на телефоне и на компьютере. Напиши тестовый аккаунт в поле заметки.
После правки открой на своём телефоне и ещё на одном. Если это для Huawei, открой на устройстве без Google или в облачном тесте. Потом отправь с большим versionCode. Если три раза возвращается по той же причине, укороти текст и убери работу, которую обещал, а приложение не делает. Кнопка, которой нет, оставленная на странице, приносит следующий отказ.
Примеры на чёрном экране





Измени текст
Готовые файлы приложения
В корне этого zip стоит index.html. Рядом папки css и js. Его можно отдать Studio как есть.
Выбери свой zip
Nibras Studio открывается сам, как только выбран zip.