урок 123
- створюємо ключі і підписуємо додаток
Тема цього уроку не відноситься безпосередньо до програмування. І цілком собі можна кодувати без цих знань. Але для загального розвитку, думаю, про це все-таки варто поговорити. Дані знання знадобляться вам, наприклад, коли будете робити додаток з гугл-картою, або коли будете викладати своє творіння на маркет.
підпис додатки
Взагалі, в процесі підписи і верифікації беруть участь закритий / відкритий ключі та сертифікат. Якщо кому цікаво, то можете погуглити ці поняття і почуття докладніше. Я ж, щоб не ускладнювати урок, буду просто називати все це ключем. Для розуміння теми уроку цього буде достатньо.
Ви створили додаток і хочете його протестувати на реальному пристрої або емуляторі. Для того, щоб встановити і запустити додаток, воно повинно бути підписано. Якщо ви ще не публікували на маркеті свої додатки, то, швидше за все, про те, що додаток треба підписувати, ви чуєте вперше. І точно пам'ятаєте, що ні з якими підписи не возилися. Створювали проект, коділі все, що потрібно, зберігали і запускали і все прекрасно працювало. Так відбувалося, тому що Eclipse сам створював ключ і сам підписував додаток цим ключем, щоб вам на перших порах не доводилося думати про це. І коли ваш додаток встановлювалося, воно було вже підписаним. А якщо спробувати встановити непідписаний додаток, то отримаємо помилку.
Отже, додаток обов'язково повинне бути підписаним, і Eclipse люб'язно бере це на себе. Він підписує їх debug-ключем. Раніше термін його дії був всього один рік. Android перевіряє термін дії ключа тільки при установці. Тобто якщо ви встановили додаток і термін дії ключа закінчився, ви все одно зможете використовувати встановлене додаток. А ось встановити або оновити додаток, підписана вичерпаним ключем, не вийде. Система видасть помилку.
Файл debug.keystore має розширення keystore. Це можна перевести як сховище ключів. Це дійсно так, один такий файл може містити в собі кілька ключів. Для того щоб звернеться до конкретного ключу всередині сховища використовується alias (алиас, можна розглядати його як ім'я ключа).
Подивимося, які ключі є в сховищі debug.keystore. Використовуємо команду list. За допомогою параметрів keystore і storepass вкажемо ім'я файлу сховища і пароль до сховища:
keytool -list -keystore debug.keystore -storepass android
Давайте створимо свій ключ. Для цього використовуємо команду genkey і до неї йде купа параметрів.
keytool -genkey -keystore mykeys.keystore -storepass spassword -alias mykey1 -keypass kpassword1 -dname "CN = Dmitry Vinogradov O = StartAndroid C = RU" -validity 10000
Виглядає страшно, але насправді все нескладно. Просто треба розуміти наступне:
сховище - це файл і воно захищене паролем
ключ в сховище має алиас і свій пароль
також ключ містить інформацію про власника і має обмежений термін дії
Саме ці перераховані вище параметри ми і задали в скрипті.
keystore - ім'я файлу сховища
storepass - пароль до сховища
alias - алиас створюваного ключа
keypass - пароль до ключа
dname - інформація про власника ключа
validity - термін дії ключа (в днях)
dname задається в певному форматі. Я вказав тільки ім'я, організацію та країну.
Після виконання цієї команди в сховище mykeys.keystore створився ключ з вищевказаними параметрами. Якщо вказане сховище не існує, то воно буде створено.
Тепер давайте знову використовуємо команду list і подивимося на щойно створений ключ
keytool -list -keystore mykeys.keystore -storepass spassword
Бачимо, що всередині все так, як ми і створювали - один ключ з аліасом mykey1.
Туди ж можна помістити другий ключ. Але тепер запишемо скрипт створення ключа в дещо урізаному вигляді. Ми не будемо вказувати паролі до сховища і ключу, і інформацію про власника.
keytool -genkey -keystore mykeys.keystore -alias mykey2 -validity 10000
і програма запитає нас про відсутніх даних. Спочатку пароль до сховища, потім дані про власника ключа (я заповнював не всі необхідні значення), потім пароль для створюваного ключа і підтвердження пароля.
Функціонально різниці немає, але при такому способі вам не треба знати формат введення параметра dname (утиліта все запитає сама), і стороннім не помітні паролі, які ви вводили.
Тепер в сховище два ключа. Виконаємо list і переконаємося.
keytool -list -keystore mykeys.keystore
Зверніть увагу, що я не ввів пароль від сховища (наприклад, щоб не «світити» його). Утиліта запитає мене:
Видно, що був запитаний пароль і в сховище зараз два ключа.
Команду list можна ще виконати з параметром v. Цей параметр додає інформативності.
Тепер для кожного ключа видно не тільки алиас і дата створення, а й інфа про власника, термін дії тощо.
Параметр 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).
Спробуємо встановити додаток на емулятор за допомогою adb. Отримуємо помилку Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]:
Система виявила, що програма не підписано.
Якщо ж спочатку закинути APK на емулятор і там запустити файловим менеджером, отримаємо таке повідомлення при установці:
Eclipse надає візард, який дозволяє реалізувати всі вищеописані кроки з підготовки додатки до установки. Для цього треба на проекті в Eclipse натиснути правою кнопкою і вибрати Android tools> Export Signed Application Package.
Візард про всяк випадок уточнить проект
Потім треба вибрати: використовувати існуюче сховище або створювати нове. Якщо використовуємо існуюче, то вибираємо його і вводимо пароль до цього сховища.
Тиснемо Next, і візард запитує, який з існуючих ключів використовувати, або дає можливість створити новий.
Вибираємо існуючий ключ, вводимо пароль до нього
Залишилося вказати шлях і ім'я файлу, куди Eclipse збереже готове, підписана і стислий додаток. Заодно він відразу показує термін дії сертифіката.
Тиснемо Finish і отримуємо готовий додаток, яке можна публікувати на маркеті.
Якщо ж у вас поки немає ключа, то візард допоможе вам його створити, щоб не треба було возитися з консоллю і keytool.
В цьому випадку ви вказуєте, що хочете створити сховище
Далі треба створити ключ
Тут ви вказуєте алиас, пароль, термін дії (в роках) і інфу про власника.
Ну і залишається вказати шлях до створюваного файлу
За ідеєю, я міг би відразу показати вам цей візард, який за вас все зробить, але я думаю, що ви не розуміли б значення всіх його екранів і полів. А це не дуже гарна практика - користуватися тим, чого не розумієш. Тому я детально розписав механізм ключів і підпису додатків, щоб ви уявляли собі, як влаштований цей процес і що робить візард.
На наступному уроці:
- розбираємося, що таке Package для додатка
Приєднуйтесь до нас в Telegram: