урок 123

- створюємо ключі і підписуємо додаток

Тема цього уроку не відноситься безпосередньо до програмування. І цілком собі можна кодувати без цих знань. Але для загального розвитку, думаю, про це все-таки варто поговорити. Дані знання знадобляться вам, наприклад, коли будете робити додаток з гугл-картою, або коли будете викладати своє творіння на маркет.

підпис додатки

Взагалі, в процесі підписи і верифікації беруть участь закритий / відкритий ключі та сертифікат. Якщо кому цікаво, то можете погуглити ці поняття і почуття докладніше. Я ж, щоб не ускладнювати урок, буду просто називати все це ключем. Для розуміння теми уроку цього буде достатньо.

Ви створили додаток і хочете його протестувати на реальному пристрої або емуляторі. Для того, щоб встановити і запустити додаток, воно повинно бути підписано. Якщо ви ще не публікували на маркеті свої додатки, то, швидше за все, про те, що додаток треба підписувати, ви чуєте вперше. І точно пам'ятаєте, що ні з якими підписи не возилися. Створювали проект, коділі все, що потрібно, зберігали і запускали і все прекрасно працювало. Так відбувалося, тому що Eclipse сам створював ключ і сам підписував додаток цим ключем, щоб вам на перших порах не доводилося думати про це. І коли ваш додаток встановлювалося, воно було вже підписаним. А якщо спробувати встановити непідписаний додаток, то отримаємо помилку.

Отже, додаток обов'язково повинне бути підписаним, і Eclipse люб'язно бере це на себе. Він підписує їх debug-ключем. Раніше термін його дії був всього один рік. Android перевіряє термін дії ключа тільки при установці. Тобто якщо ви встановили додаток і термін дії ключа закінчився, ви все одно зможете використовувати встановлене додаток. А ось встановити або оновити додаток, підписана вичерпаним ключем, не вийде. Система видасть помилку.

урок 123

Файл debug.keystore має розширення keystore. Це можна перевести як сховище ключів. Це дійсно так, один такий файл може містити в собі кілька ключів. Для того щоб звернеться до конкретного ключу всередині сховища використовується alias (алиас, можна розглядати його як ім'я ключа).

Подивимося, які ключі є в сховищі debug.keystore. Використовуємо команду list. За допомогою параметрів keystore і storepass вкажемо ім'я файлу сховища і пароль до сховища:

keytool -list -keystore debug.keystore -storepass android

урок 123

Давайте створимо свій ключ. Для цього використовуємо команду genkey і до неї йде купа параметрів.

keytool -genkey -keystore mykeys.keystore -storepass spassword -alias mykey1 -keypass kpassword1 -dname "CN = Dmitry Vinogradov O = StartAndroid C = RU" -validity 10000

урок 123

Виглядає страшно, але насправді все нескладно. Просто треба розуміти наступне:
сховище - це файл і воно захищене паролем
ключ в сховище має алиас і свій пароль
також ключ містить інформацію про власника і має обмежений термін дії

Саме ці перераховані вище параметри ми і задали в скрипті.

keystore - ім'я файлу сховища
storepass - пароль до сховища
alias - алиас створюваного ключа
keypass - пароль до ключа
dname - інформація про власника ключа
validity - термін дії ключа (в днях)

dname задається в певному форматі. Я вказав тільки ім'я, організацію та країну.

Після виконання цієї команди в сховище mykeys.keystore створився ключ з вищевказаними параметрами. Якщо вказане сховище не існує, то воно буде створено.

Тепер давайте знову використовуємо команду list і подивимося на щойно створений ключ

keytool -list -keystore mykeys.keystore -storepass spassword

урок 123

Бачимо, що всередині все так, як ми і створювали - один ключ з аліасом mykey1.

Туди ж можна помістити другий ключ. Але тепер запишемо скрипт створення ключа в дещо урізаному вигляді. Ми не будемо вказувати паролі до сховища і ключу, і інформацію про власника.

keytool -genkey -keystore mykeys.keystore -alias mykey2 -validity 10000

урок 123

і програма запитає нас про відсутніх даних. Спочатку пароль до сховища, потім дані про власника ключа (я заповнював не всі необхідні значення), потім пароль для створюваного ключа і підтвердження пароля.

Функціонально різниці немає, але при такому способі вам не треба знати формат введення параметра dname (утиліта все запитає сама), і стороннім не помітні паролі, які ви вводили.

Тепер в сховище два ключа. Виконаємо list і переконаємося.

keytool -list -keystore mykeys.keystore

Зверніть увагу, що я не ввів пароль від сховища (наприклад, щоб не «світити» його). Утиліта запитає мене:

урок 123

Видно, що був запитаний пароль і в сховище зараз два ключа.

Команду list можна ще виконати з параметром v. Цей параметр додає інформативності.

урок 123

Тепер для кожного ключа видно не тільки алиас і дата створення, а й інфа про власника, термін дії тощо.

Параметр v також можна використовувати і з командою genkey. Після створення ключа буде виведено трохи інформації про нього в консоль.

Отже, розібралися з keytool. Знаємо, як створювати сховище з ключами і як подивитися інфу про існуючі. Залишилося дізнатися, як підписати додаток ключем. Для цього використовується інша утиліта - jarsigner.

Скрипт підпису виглядає так:

jarsigner -keystore mykeys.keystore -storepass spassword -keypass kpassword1 Package1.apk mykey1

Імена параметрів нам знайомі по keytool: сховище (keystore), пароль (storepass) до нього і пароль (keypass) до ключу. А останні два параметри - це ім'я APK-файлу, який ви хочете підписати і алиас ключа із зазначеного сховища, який ви хочете використовувати для підпису.

Після цього додаток буде підписано і система прийме його до установки.

Заради інтересу давайте спробуємо встановити непідписаний APK. Щоб створити його треба натиснути правою кнопкою миші на проекті в Eclipse і вибрати Android tools> Export Unsigned Application Package. Далі вказуємо шлях, куди зберегти APK-файл. Eclipse створює додаток з проекту і зберігає його в зазначений каталог. Після цього він виводить повідомлення, що перед публікацією додатка необхідно його підписати і стиснути (утилітою zipalign).

урок 123

Спробуємо встановити додаток на емулятор за допомогою adb. Отримуємо помилку Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]:

урок 123

Система виявила, що програма не підписано.

Якщо ж спочатку закинути APK на емулятор і там запустити файловим менеджером, отримаємо таке повідомлення при установці:

урок 123

Eclipse надає візард, який дозволяє реалізувати всі вищеописані кроки з підготовки додатки до установки. Для цього треба на проекті в Eclipse натиснути правою кнопкою і вибрати Android tools> Export Signed Application Package.

Візард про всяк випадок уточнить проект

урок 123

Потім треба вибрати: використовувати існуюче сховище або створювати нове. Якщо використовуємо існуюче, то вибираємо його і вводимо пароль до цього сховища.

урок 123

Тиснемо Next, і візард запитує, який з існуючих ключів використовувати, або дає можливість створити новий.

урок 123

Вибираємо існуючий ключ, вводимо пароль до нього

урок 123

Залишилося вказати шлях і ім'я файлу, куди Eclipse збереже готове, підписана і стислий додаток. Заодно він відразу показує термін дії сертифіката.

урок 123

Тиснемо Finish і отримуємо готовий додаток, яке можна публікувати на маркеті.

Якщо ж у вас поки немає ключа, то візард допоможе вам його створити, щоб не треба було возитися з консоллю і keytool.

В цьому випадку ви вказуєте, що хочете створити сховище

урок 123

Далі треба створити ключ

урок 123

Тут ви вказуєте алиас, пароль, термін дії (в роках) і інфу про власника.

Ну і залишається вказати шлях до створюваного файлу

урок 123

За ідеєю, я міг би відразу показати вам цей візард, який за вас все зробить, але я думаю, що ви не розуміли б значення всіх його екранів і полів. А це не дуже гарна практика - користуватися тим, чого не розумієш. Тому я детально розписав механізм ключів і підпису додатків, щоб ви уявляли собі, як влаштований цей процес і що робить візард.

На наступному уроці:

- розбираємося, що таке Package для додатка

Приєднуйтесь до нас в Telegram:

Схожі статті