Итак, вы трудились много дней (а может и ночей), и вот ваше первое гибридное мобильное приложение готово. Оно достаточно стабильно, большинство критичных багов закрыто. Остались мелкие, но помня о том, что перфекционизм — зло, вы принимаете волевое решение выложить приложение.

Необходимое условие для этого — наличие подписанного APK файла. Как подписать apk файл, вы узнаете из этой статьи.

Небольшое отступление


Когда мой pet project вплотную приблизился к релизу, я начал искать информацию о том, как быстро и без боли опубликовать приложение. Множество найденных инструкций выглядели простыми. Я выбрал инструкцию авторов фреймворка Ioniс, на котором и разработано приложение. Не все получилось с первого раза, есть несколько особенностей. Процесс подписывания описан в этой статье, важные моменты особо выделены.

Исходные данные


Я предполагаю, что у вас настроено все необходимое для разработки гибридных мобильных приложений с помощью Apache Cordova. Должно быть установлено:

  • Apache Cordova
  • Java Development Kit
  • Android SDK Tools

В качестве имени проекта и приложения используется lcf. Замените на имя своего проекта там, где это необходимо.

Поехали


Для начала нужно создать релизный билд вашего приложения. Но перед этим, давайте убедимся, что все лишние плагины удалены. Например, нам не нужен плагин, который выводит отладочную информацию в консоль. Удалим его:

$ cordova plugin rm cordova-plugin-console

Для генерации релизной сборки под Андроид используем команду build с флагом --release:

$ cordova build --release android

Эта команда создаст неподписанный APK файл в каталоге:

platforms/android/build/outputs/apk

Например, platforms/android/build/outputs/apk/android-release-unsigned.apk. Потом нам понадобится подписать этот файл и запустить утилиту zipalign для оптимизации и подготовки файла для Google Play.

Для подписывания файла нужен сертификат. Создадим его с помощью утилиты keytool, которая включена в JDK:

$ keytool -genkey -v -keystore lcf.keystore -alias lcf -keyalg RSA -keysize 2048 -validity 10000

Важно
Значение параметра -alias необходимо запомнить, а лучше записать. В примере выше он равен lcf (по первым буквам названия приложения Loyal Client Free). Детали здесь приводить не буду, если будет интересно, напишите в комментарии, я расскажу подробнее.

Алиас используется каждый раз при подписывании* приложения. Чтобы было проще запомнить, в качестве алиаса используйте имя keystore файла, например:

	-keystore hello-world.keystore -alias hello-world
	-keystore weather-app.keystore -alias weather-app
	-keystore todo.keystore -alias todo

* Подписывать приложение нужно при каждом выпуске обновлений

Утилита keytool задает ряд вопросов. Всего их будет 8. Чтобы заранее иметь представление о вопросах и примерных ответах, все они приведены далее, под спойлером.

Вопросы keytool и примерные ответы на них
1. Enter keystore password:
Здесь необходимо ввести пароль для файла (не менее 6 символов). Введенный пароль нужно записать в надежном месте, он нужен всякий раз при подписывании приложения.

2. Re-enter new password:
Повторный ввод пароля.

3. What is your first and last name?
[Unknown]: Ivan Petrov
Ваше имя и фамилия. Значение в квадратных скобках — это значение по умолчанию.

4. What is the name of your organizational unit?
[Unknown]: IT
Название подразделения вашей компании. Можно оставить пустым, я указываю IT.

5. What is the name of your organization?
[Unknown]: 2developers
Название вашей организации. Укажите, если есть.

6. What is the name of your City or Locality?
[Unknown]: Moscow
Название города

7. What is the name of your State or Province?
[Unknown]: MO
Название области

8. What is the two-letter country code for this unit?
[Unknown]: RU
Код страны. Я указываю RU.

Далее будет предложено проверить введенную информацию:
Is CN=Ivan Petrov, OU=IT, O=2developers, L=Moscow, ST=MO, C=RU correct?

[no]: y

Подтверждайте, если все верно или нажмите Enter, чтобы ввести еще раз.

В конце появится сообщение об успешной генерации ключа. Будет предложено задать пароль для приватного ключа (если хотите оставить такой же, как и для сертификата — нажмите Enter):

Generating 2 048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 10 000 days
       for: CN=Ivan Petrov, OU=IT, O=2developers, L=Moscow, ST=MO, C=RU
Enter key password for <lcf>
        (RETURN if same as keystore password): 
[Storing lcf.keystore]

В текущем каталоге будет создан файл lcf.keystore.

Важно
Созданный файл нужно сохранить в надежном месте. Если вы используете закрытый репозиторий, то файл можно закоммитить вместе с исходными кодами приложения. В общем случае, сертификаты лучше хранить отдельно. В случае утери сертификата вы не сможете выпускать обновления приложения.

Осталось два шага, и вы получите готовый к распространению APK файл. Переходим непосредственно к подписыванию.

Чтобы подписать ваш apk файл, используйте утилиту jarsigner, которая тоже включена в JDK.

$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore lcf.keystore android-release-unsigned.apk lcf

Имя сертификата указывается после параметра -keystore, алиас — после имени файла.

Наконец, для оптимизации apk файла, воспользуемся утилитой zipalign:

$ zipalign -v 4 android-release-unsigned.apk LoyalClientFree.apk

Последний параметр — это имя файла, который вы будете загружать в Google Play.

Важно.
Утилита zipalign это часть Android SDK Tools и может быть найдена здесь:

/path/to/Android/sdk/build-tools/VERSION/zipalign


Заключение


Теперь у вас есть готовый к распространению apk файл, который можно загрузить в Google Play. Заполняйте описание, определяйте рейтинг своего приложения и смело жмите “Опубликовать”.
Поделиться с друзьями
-->

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


  1. adasoft
    20.03.2017 17:00

    Спасибо, как раз подхожу к этому рубежу. Но смущается почему только коммандная строка? Неужели нет GUI решений, которые возьмут часть вопросов по сохранению данных по приложению между процессами подписания обновлений на себя??


    1. Suvitruf
      20.03.2017 17:36
      +1

      Через Android Studio сборка .apk в пару кликов. Статья имеет смысл, если вы где-то на серваке хотите собирать или автоматизировать. На своей же машине проще прям в IDE сбилдить.


      1. evilray
        20.03.2017 23:52

        Вы хотите сказать, что Android Studio в контексте разработки приложений на cordova/ionic проще, чем использование командной строки?


        1. Suvitruf
          21.03.2017 01:26

          Я с cordova/ionic не работал, но в документации вижу:

          Once it finishes importing, you should be able to build and run the app directly from Android Studio
          Так что да, из гуи проще, чем возиться с консолью.

          Да и даже в этом офф доке процесс подписи куда проще описан, чем у вас.


    1. Space_Cowboy
      20.03.2017 23:52

      image


    1. hitman51
      20.03.2017 23:52

      есть, можно делать через Android Studio https://developer.android.com/studio/publish/app-signing.html


  1. thelongrunsmoke
    20.03.2017 19:27

    И сразу пропишите в .gitignore.


    *.keystore
    *.jks


  1. NexOtaku
    20.03.2017 23:52

    В принципе инструкция полезная для тех, кто делает всё через консоль.

    Что касается обычных разработчиков, то в Android Studio всё это делается нажатием пары кнопок, гораздо проще и быстрее.

    P.S. Сам я тоже публикую Android-приложения на Cordova.


    1. 2developers
      21.03.2017 10:32

      Релизные сборки в Android Studio делаете?


      1. NexOtaku
        23.03.2017 13:00

        Да, конечно.


  1. zakium
    20.03.2017 23:53

    В документации cordova и phonegap есть инструкции с вариантами как можно подписать.
    Самый стандартный способ это:
    1) сгенерировать ключ (пароль + алиас)
    2) прописать конфиг в build.properties
    3) запустить стандартный cordova build android --release

    Итого ничего потом подписывать не нужно после билда, на выходе подписанный .apk


  1. chopikus
    20.03.2017 23:53
    +1

    В чем прикол коммандной строки, ведь в Android Studio во вкладке Build есть Generate Signed APK.


    1. 2developers
      21.03.2017 10:31

      Это чтобы лишний раз Android Studio не запускать.
      Обычно с помощью ionic/cordova разрабатываются приложения сразу под несколько платформ: android и ios. Намного быстрее написать в консоли cordova build android; cordova build ios; чем запускать Android Studio и Xcode.
      Да, сам код обычно пишется в каком-то другом редакторе или IDE.