Отображение вашей цифровой подписи хранилища ключей
MD5 и SHA1 сигнатуры приложений Xamarin.Android зависят от файла .keystore, который использовали для подписи APK-файла. Обычно отладочная сборка и сборка выпуска используют различные файлы .keystore.
Для подписанных отладочных/ненастраиваемых сборок
Xamarin.Android подписывает все отладочные сборки при помощи одного и того же файла debug.keystore. Этот файл создается при первой установке Xamarin.Android. Ниже описывается процедура отображения MD5 и SHA1 сигнатур файла Xamarin.Android debug.keystore по умолчанию.
- Visual Studio
- Visual Studio для Mac
Найдите файл Xamarin debug.keystore, используемый для подписывания приложений. По умолчанию хранилище ключей, которое используется для подписывания отладочных версий приложений Xamarin.Android, располагается по следующему пути:
C:\Users\USERNAME\AppData\Local\Xamarin\Mono for Android\debug.keystore
Информация о хранилище ключей отображается при вызове команды keytool.exe из JDK. Обычно она располагается по следующему пути:
C:\Program Files (x86)\Java\jdkVERSION\bin\keytool.exe
Добавьте каталог, содержащий файл keytool.exe, в переменную среды PATH . Откройте командную строку и запустите keytool.exe при помощи следующей команды:
keytool.exe -list -v -keystore "%LocalAppData%\Xamarin\Mono for Android\debug.keystore" -alias androiddebugkey -storepass android -keypass android
При запуске keytool.exe должен выводить следующий текст. Метки MD5: и SHA1: указывают на соответствующие сигнатуры:
Alias name: androiddebugkey Creation date: Aug 19, 2014 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Android Debug, O=Android, C=US Issuer: CN=Android Debug, O=Android, C=US Serial number: 53f3b126 Valid from: Tue Aug 19 13:18:46 PDT 2014 until: Sun Nov 15 12:18:46 PST 2043 Certificate fingerprints: MD5: 27:78:7C:31:64:C2:79:C6:ED:E5:80:51:33:9C:03:57 SHA1: 00:E5:8B:DA:29:49:9D:FC:1D:DA:E7:EE:EE:1A:8A:C7:85:E7:31:23 SHA256: 21:0D:73:90:1D:D6:3D:AB:4C:80:4E:C4:A9:CB:97:FF:34:DD:B4:42:FC: 08:13:E0:49:51:65:A6:7C:7C:90:45 Signature algorithm name: SHA1withRSA Version: 3
Найдите файл Xamarin debug.keystore, используемый для подписывания приложений. По умолчанию хранилище ключей, которое используется для подписывания отладочных версий приложений Xamarin.Android, располагается по следующему пути:
~/.local/share/Xamarin/Mono for Android/debug.keystore
Информация о хранилище ключей отображается при вызове команды keytool из JDK. Обычно она располагается по следующему пути:
~/Library/Developer/Xamarin/jdk/microsoft_dist_openjdk_VERSION/bin/keytool
/System/Library/Java/JavaVirtualMachines/VERSION.jdk/Contents/Home/bin/keytool
Добавьте каталог, содержащий файл keytool, в переменную среды PATH. Откройте Терминал и запустите keytool с помощью следующей команды:
$ keytool -list -v -keystore ~/.local/share/Xamarin/Mono\ for\ Android/debug.keystore -alias androiddebugkey -storepass android -keypass android
При запуске keytool должен выводить следующий текст. Метки MD5: и SHA1: указывают на соответствующие сигнатуры:
Alias name: androiddebugkey Creation date: Apr 16, 2015 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Android Debug, O=Android, C=US Issuer: CN=Android Debug, O=Android, C=US Serial number: 76afa120 Valid from: Thu Apr 16 10:52:27 PDT 2015 until: Sat Apr 08 10:52:27 PDT 2045 Certificate fingerprints: MD5: 0A:D3:7E:80:3D:40:2A:23:89:B9:AB:9C:4B:B6:63:36 SHA1: 89:33:8F:F2:C5:0C:91:08:4A:CF:04:A5:EC:4A:31:80:84:18:0D:D4 SHA256: 91:AC:3E:2F:CB:EF:50:07:2B:E0:D9:8D:8B:C2:42:87:6A:85:02:86:EB:44:84:10:34:02:ED:35:CE:C6:38:47 Signature algorithm name: SHA256withRSA Version: 3 Extensions: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 65 6C FE 67 8E CD CB 9A 01 CD 9F E8 25 9C A4 A3 el.g. %. 0010: 4F 4E CF 17 ON.. ] ]
Для подписанных сборок выпуска и настраиваемых сборок
Процесс для сборок выпуска, подписанных собственным файлом .keystore, совпадает с процессом, описанным выше, за исключением того, что вместо файла debug.keystore Xamarin.Android использует файл .keystore для выпуска. При создании файла хранилища ключей измените значения пароля хранилища ключей и имени псевдонима на свои.
- Visual Studio
- Visual Studio для Mac
Когда для подписания приложения Xamarin.Android используется мастер Распространить в Visual Studio, получаемое хранилище ключей располагается в следующем месте:
C:\Users\USERNAME\AppData\Local\Xamarin\Mono for Android\Keystore\alias\alias.keystore
Например, при создании нового ключа подписи при помощи диалогового окна Создать новый сертификат ключевое хранилище из этого примера будет находиться по следующему пути:
C:\Users\USERNAME\AppData\Local\Xamarin\Mono for Android\Keystore\chimp\chimp.keystore
Дополнительные сведения о подписывании приложений Xamarin.Android см. в разделе Подписывание пакета приложения для Android.
При подписывании приложения в Visual Studio для Mac при помощи мастера Подписать и распространить. ключевое хранилище будет находиться по следующему пути:
~/Library/Developer/Xamarin/Keystore/alias/alias.keystore
Например, при создании нового ключа подписи при помощи диалогового окна Создать новый сертификат ключевое хранилище из этого примера будет находиться по следующему пути:
~/Library/Developer/Xamarin/Keystore/chimp/chimp.keystore
Дополнительные сведения о подписывании приложений Xamarin.Android см. в разделе Подписывание пакета приложения для Android.
Публикуем приложения в Google Play и зарабатываем миллионы
В статье присутствуют скриншоты, когда магазин приложений назывался «Android Market». Уже выросло поколение котов, которые никогда не слышали об этом названии. Но общий принцип не изменился. Оставил для истории. Я не могу заново пройти регистрацию, чтобы сделать новые скриншоты.
Итак, за 30 дней вы научились создавать собственные приложения. Пора поделиться ими со всем миром и получить заветный миллион на блюдечке с голубой каёмочкой.
Так как мы волнуемся, то потренируемся на кошках. Возьмем, например, пример из статьи Пишем справочник и попытаемся выложить его в Google Play. Если все получится, то дальше будет проще.
Прежде чем приступать к дальнейшим операциям, убедитесь, что у вас готовы собственные значки для приложений и название программы. Будет очень странно увидеть в магазине приложений программу со стандартным значком и названием «HelloWorld». А также проверьте все записи в файле манифеста.
Шаг первый. Он трудный самый
Любое приложение, выкладываемое в магазин приложений, должно иметь подписанный сертификат. Сертификат позволяет идентифицировать вас как автора программы. И если кто-то попытается выложить программу с таким же именем как у вас, то ему будет отказано из-за конфликта имён. Под именем приложения имеется в виду полное название пакета.
Когда вы запускали свои приложения на эмуляторе или своём телефоне, то среда разработки автоматически подписывала программу отладочным сертификатом. Для распространения через магазин отладочный сертификат не подходит, и вам нужно подписать приложение своим уникальным сертификатом. Это бесплатно, без регистрации и смс.
Создадим подписанный APK-файл, который является что-то типа исполняемым файлом как notepad.exe в Windows. Если у вас открыта среда разработки Android Studio, то выберите в меню Build | Generate Signed APK. .
Появится диалоговое окно мастера, которое необходимо заполнить данными.

В первом поле следует указать путь к хранилищу ключей. Если вам раньше приходилось создавать программы раньше, в том числе и в Eclipse, то можете указать уже существующее хранилище через кнопку Choose existing. . Если вы создаёте хранилище первый раз, то выбирайте кнопку Create new. . Появится новое диалоговое окно.
В первом поле Key store path нужно выбрать папку через кнопку . и ввести имя для файла с хранилищем, которому будет присвоено расширение jks.

Далее вы вернётесь обратно и продолжаете заполнять поля. Поля Password и Confirm в объяснении не нуждаются.
Теперь создаёте ключ для приложения. В поле Alias (Псевдоним) вводите понятное вам и котам название ключа. Не обязательно создавать псевдоним для каждого приложения, можете использовать один псевдоним для своих приложений и отдельные псевдонимы для приложений под заказ.
Для ключа также нужно создать пароль и подтвердить его.
Ключ рассчитан на 25 лет. Поле Validity (years) оставляем без изменений (если у вас нет весомых причин в обратном).
Напоследок заполняете данные о себе.

Заполнив поля, вы вернёмся к самому первому окну мастера.

Нажимаем на кнопку Next и в следующем окне вводим ещё один пароль для доступа к базе паролей.

Возможно, этого шага у вас не будет. Он может появиться, если вы отметили флажком опцию «Запомнить пароль». Подробностей не помню, разберётесь сами.
Последний шаг — нажать кнопку Finish.

Раньше это был последний шаг. Сейчас появились новые флажки V1 (Jar Signature) и V2 (Full APK Signature). Отметьте как минимум первый вариант V1 — это соответствует старому способу. Второй способ считается более надёжным в плане взлома и его можно использовать для поздних API, на ваше усмотрение (см. ниже).
В результате сложных манипуляций с диалоговыми окнами у вас появится долгожданный APK — ваша прелесть, которая откроет дверь в мир богатства и счастья.

Нажав кнопку Show in Explorer, вы запустите Проводник на вашем компьютере с папкой, в которой находится подписанный файл.
Будьте аккуратны с созданным ключом. Именно он является гарантией, что новая версия программы написана вами. Поэтому, если вы потеряете созданный ключ, вам придется выкладывать программу под другим именем с новым ключом.
В студии предусмотрен режим автоматического создания подписанного приложения. Щёлкните правой кнопкой мыши на папке app и в контекстом меню выберите пункт Open Module Settings. Выберите раздел app в секции Modules. Выберите вкладку Signing. Нажимаете на кнопку с плюсиком и заполняете поля.

Переходите на вкладку Build Types и выбираете сборку release. В выпадающем списке Signing Config выбираете только что созданную конфигурацию. По умолчанию она имеет имя config.

Нажимаем OK для сохранения результатов.
Подписывать приложения можно и через командную строку без участия студии, если вы извращенец. Можете почитать в документацию на эту тему.
v2 Full APK
В 2017 году Google немного изменила процесс подписания. Теперь существуют две схемы получения подписи APK: v1 JAR и v2 Full APK.
Подпись v1 (который существовал с самого начала) не защищает некоторые части APK, такие как метаданные ZIP. Верификатор APK должен обрабатывать множество ненадёжных структур данных, а затем отбрасывать данные, которые не подписаны, что предоставляет большой простор для атаки. Кроме того, верификатор APK должен распаковать все сжатые записи, что тратит много времени и памяти. Для решения проблем была разработана новая версия v2 Full APK, которую вы встретите при подписании вашего приложения.
Схема v2 работает в Android 7.0 Nougat (API 25). Схема обеспечивает более быструю установку приложения и хорошую защиту от несанкционированных изменений в APK. Содержимое APK хешируется и подписывается, затем полученный блок подписи APK вставляется в APK.
Новый формат обратно совместим, поэтому APK, подписанные новой схемой, могут быть установлены на более ранних устройствах (которые будут просто игнорировать новую подпись), если эти APK также подписаны схемой v1.
В старых приложениях я оставляю флажок у первой версии. Возможно, позже заставят переходить на вторую версию принудительно. Важно учитывать, что подписывать схемой v1 нужно до подписания схемой v2, поскольку APK не пройдёт проверку по схеме v2, если он будет подписан дополнительными сертификатами после подписания схемой v2.
Строго говоря, вы можете apk-файл выложить у себя на сайте, и все ваши посетители могут его скачать и установить на телефон. Но это как-то несолидно в наш век нанотехнологий. Поэтому переходим к следующему шагу.
Шаг второй. Надо, Федя, надо
Следующий шаг очень неприятный. Вам нужно подарить 25 вечнозеленых чужому человеку. Чтобы вам было не так обидно, данную операцию назвали регистрационным взносом. Вам понадобится кредитная карточка с указанной суммой. Учтите, что Visa Electron, а уж тем более дисконтная карточка сети магазинов «Перекресток» вам не подойдут. Если у вас уже есть нужная карточка, то пропускаете этот абзац. Остальным могу посоветовать завести QIWI-кошелёк и там завести виртуальную карточку. Именно так я и поступил, так как идти в банк и писать всякие заявления было неохота.
Идём на страницу разработчиков, заполняем необходимые поля и расстаёмся с нужной суммой. Если операция пройдёт успешно, то вы сможете продвинуться дальше. В моем случае мне дважды отказывали, так как я пожадничал и положил на карточку меньшую сумму, чем требовалось (не учёл комиссию). Если вы позже доложили необходимую сумму, то не ждите, что её автоматически у вас спишут. Снова зайдите на страницу разработчика и отредактируйте данные о карточке (нужно еще раз написать код безопасности).

Шаг третий. Со счастливым концом
Если платёж прошел успешно, то ссылка на следующий шаг будет доступна и вы попадаете в специальный личный кабинет, где можете добавлять свои приложения.
Весь интерфейс на русском. Поэтому трудностей у вас не возникнет. Заливаем подготовленный APK-файл, а также необходимые картинки-скриншоты и значок.
Для своего первого приложения я не стал заморачиваться, а сделал всё на скорую руку.

В процессе добавления программы вы можете удалять картинки и файл приложения, снова их заливать и снова удалять. Иногда можно нажимать на кнопку Сохранить. Если вы сделаете что-то не так, то на странице появятся предупреждающие надписи. Если таких надписей нет, то можете смело нажимать на кнопку Публиковать. Всё! Ваше приложение доступно всему миру. За вами уже выехали.

Недавно в Google Play Developer Console добавили возможность тестирования приложений среди определённых пользователей. Если раньше вы загружали своё приложение и оно сразу становилось доступным всем, то теперь добавлены два промежуточных шага.
При загрузке новой версии приложения вам нужно выбрать раздел:
- АЛЬФА-ТЕСТИРОВАНИЕ
- БЕТА-ТЕСТИРОВАНИЕ
- РАБОЧАЯ ВЕРСИЯ
Если вы загрузите приложение в раздел Альфа-тестирования, то потом можете перевести его в бета-тестирование или сразу в Рабочую версию. Соответственно, из бета-тестирования можно перевести сразу в Рабочую версию. Обратно нельзя.
Если программа находится в стадии тестирования, то оно доступно только тестерам, другие пользователь не смогут найти вашу программу ни через поиск, ни по прямой ссылке.
Вам следует создать специальное сообщество в Google+ (указывается в настройках приложения) и пригласить туда нужных людей. Доверенные лица смогут затем перейти по ссылке play.google.com/apps/testing/com.yourdomain.package.
Ищет милиция, ищут пожарные
Когда вы публикуете свою программу, то она сразу попадает в магазин приложений без всякой модерации. Но найти её будет там не просто. Даже поиск по магазину вам не поможет. Нужно какое-то время, чтобы данные в магазине обновились и поисковый робот заметил вашу программу. Но я помогу вам бесплатным советом, как быстро найти свою программу в Google Play. А всё очень просто. Вспомните имя вашего пакета, который использовался при создании приложения — он и является ключом к разгадке. Заходим на сайт и вбиваем нужный адрес с указанием пакета в качестве ID:
И вы сразу окажетесь в нужном месте и можете раздать ссылку своим друзьям. В последнее время добавление/обновление программы происходит достаточно медленно. Поэтому не стоит сразу искать свою программу, подождите пару часов.
Где деньги, Зин
Какой вы быстрый, однако. Есть два способа зарабатывания денег на своём приложении. Либо надо зарегистрироваться как продавец, либо как участник рекламной сети AdMob.
Открыть страницу приложения в Google Play
Пользователи скачивают приложение и забывают отблагодарить разработчика. Надо аккуратно ему напомнить о гражданском долге — поставить высшую оценку вашей программе. Добавляете кнопку с текстом Оцените наше приложение и пишете небольшой код:
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("market://details?id=ru.alexanderklimov.crib")); startActivity(intent);
Учтите, что на эмуляторе код не сработает, так как в нём нет приложения Google Play. А пока можете зайти через телефон по указанному адресу и поблагодарить меня. Коты вам скажут Спасибо!.
Продвижение
На странице https://play.google.com/intl/ru_ru/badges/ на вкладке Badge Generator вы можете указать необходимые параметры, формирующие код для кнопки-баннера, который затем можете использовать в своём блоге или других местах. Например, так:

Автоматическое обновление
Если вы создали новую версию программы, исправив различные баги и добавив новые фотографии кота, то вам нужно в манифесте увеличить на единицу номер версии (атрибут versionCode) и заменить versionName для себя (будет показана на странице Google Play). В последних версиях студии данные свойства находятся теперь не в манифесте, а в файле build.gradle модуля вашего приложения. Закачайте новую версию на Google Play и пользователи получат обновление в автоматическом режиме.
Следим за отзывами
Установите на своём устройстве приложение Google Play Developer Console, чтобы не пропустить новый отзыв на вашу программу. Также вы можете просматривать статистику.
Меняем пароли хранилища и псевдонима ключа
Не пришлось пользоваться за несколько лет, поэтому не знаю, актуальна ли данная информация.
Допустим, вы продали свою программу с исходниками другой компании. Чтобы она могла выкладывать обновления программы, компания должна подписывать приложение тем же ключом, которым подписывали вы. Иначе программа будет считаться другой и придётся менять название пакета. Но тогда старые пользователи не смогут получить обновления.
Но если вы все свои программы подписываете одним и тем же ключом и паролем, например cat cat, то компания может подписать этим же ключом и другие ваши приложения, разместив свои программы с таким же именем пакета, и вы никому ничего не докажете.
Поэтому вам нужно позаботиться о смене ключа для передачи новому владельцу.
Предположим наше хранилище имеет структуру:
Имя хранилища (keystore): old.keystore Пароль от хранилища: cat1 Псевдоним: my_alias Пароль от псеводнима: cat2
Сделайте копию вашего хранилища и сохраните его в другом месте. Это надо было сделать ещё при первом создании, потому что при потере хранилища вы не сможете восстановить доступ к своим программам при обновлении.
Сделайте копию вашего хранилища ещё раз и переименуйте его, например, new.keystore. С ним и будем работать.
Далее вам нужно изменить пароль хранилища, изменить псевдоним и изменить пароль псевдонима. Полученный файл передать новому владельцу.
Запускаем утилиту keytool с командой:
keytool -storepasswd -keystore new.keystore
Вам будет предложено ввести текущий пароль, а затем ввести новый пароль и повторить его. Приблизительно так:
Enter keystore password: New keystore password: Re-enter new keystore password:
Первая часть задачи выполнена, пароль от хранилища изменён.
Если вы хотите также изменить и пароль от псевдонима, то снова запускаем утилиту с командой:
keytool -keypasswd -keystore new.keystore -alias my_name
Вас попросят ввести текущий пароль от хранилища (ваш новый пароль), затем пароль для псевдонима. Вы можете ввести новый пароль и он заменит старый пароль.
Enter keystore password: Enter key password for
Пароль от псевдонима изменён.
Если изменения пароля вам недостаточно и вы хотите изменить имя псевдонима (может вы использовали имя любимой кошки, зачем другим об этом знать), то продолжаем работу.
keytool -changealias -keystore new.keystore -alias my_alias -destalias my_new_alias
Вас попросят ввести пароль от хранилища, затем пароль для нового псевдонима (текущий пароль), затем новый пароль и повторить его. Имя псевдонима будет изменено.
Итак, нам понадобилось три шага, чтобы создать новое хранилище и псевдоним для передачи чужому человеку. Новый владелец должен проделать тоже самое, чтобы быть уверенным, что вы не воспользуетесь изменённым файлов в своих целях. Впрочем, это уже его проблемы.
Подписываем готовое приложение
Такой случай может подвернуться, когда у вас утеряны исходники и есть только APK. Скорее всего это актуально для пиратов, которые переподписывают другие приложения (не делайте так с чужими программами).
Сначала поменяйте расширение с apk на zip. В архиве удалите папку META-INF. Восстановите расширение. Вы удалили старую подпись.
Теперь нужно подписать приложение новым ключом. Введите команду.
jarsigner -keystore keystore-file.jks -storepass keystore_password -keypass alias_password —signedjar signed-apk-file.apk apk-file.apk alias_name
В успешном случае получите сообщение, что приложение подписано. Далее выполняем ещё одну команду.
ANDROID_SDK_PATH/build-tools/LAST_BUILD_TOOLS_VERSION/zipalign -v 4 signed-apk-file.apk aligned-apk-file.apk
В результате должен получиться APK-файл, подписанный новым ключом. Сам ни разу не применял.
Хранение ключей у Гугла
В 2017 году Google добавил новую возможность хранить ключи в облачном хранилише. Основное отличие заключается в том, что вы подписываете приложение специальным ключом загрузки, который Google проверяет и удаляет, заменяя его оригинальным ключом подписи приложения, который вы предоставили.
С его помощью можно управлять ключами подписи приложений как для новых, так и для опубликованных приложений, которые будут храниться у Google в их собственном хранилище ключей. Чтобы присоединиться к этой программе, необходимо подписаться на неё в своей Google Play Console. Стоит отметить, что отписаться от неё уже будет невозможно.
Такой способ очень полезен — при потере хранилища ключей Google Play App Signing позволит сбросить ключ для установки нового. Вам не придётся публиковать приложение повторно с новым именем пакета и ключом.
App Bundle
Традиционный метод доставки пользователю вашего приложения через установку APK-файла имеет один существенный недостаток — пользователь получает кучу лишнего материала, которым он никогда не воспользуется. Например, ресурсы для других языков, картинки разных разрешений для каждого типа экрана. В итоге, готовое приложение раздувается и занимает большой объём.
Новый формат (доступен в Android 3.2 и выше) позволяет пользователю скачать специальную версию вашего приложения, которые содержит только нужный язык (value-en/strings.xml), картинку нужного разрешения (xxhdpi) и другие специфичные ресурсы. В результате итоговое приложение получается гораздо меньше по размеру.
Новый формат App Bundle имеет расширение .aab (Android App Bundle). Файл с этим расширением вы загружаете в Play Store вместо apk-файла. На основе вашего файла магазин приложений создаст различные варианты вашего приложения (apk).
Просмотреть структуру App Bundle можно через меню Build | Build Bundle(s)/APK(s) | Build Bundle(s). Сначала студия покажет всплывающее окно с указанием местоположения созданного файла.

Переходим по ссылке locate и видим наш файл app-debug.aab. Путь к файлу может быть таким: ..\YourApp\app\build\outputs\bundle\debug. Файл является стандартным zip-файлом, который можно посмотреть через любой подходящий архиватор.
Архив состоит из папок base, BUNDLE_METADATA и файла BundleConfig.pb.
Также могут быть директории с дополнительными особенностями, в этом случае каждой из них присваивается специальное имя feature1, feature2 и др.
Для создания подписанного файла используем Build | Generate Signed Bundle/APK. . В диалоговом окне выбираем опцию Android App Bundle и нажимаем Next.

Теперь при загрузке приложения в Play Store вы выбираете не apk-файл, а созданный aab-файл. После этого вы можете посмотреть, какую выгоду получит пользователь при загрузке своего варианта.
Если вам интересно посмотреть, как генеруются отдельные apk-файлы на основе App Bundle, то можете установить утилиту командной строки Bundletool.
Восстановление ключей
Если вы потеряли свой ключ для подписания приложения, то не всё потеряно. Заполните форму и ждите ответа от Гугла. Они пришлют письмо с инструкциями. Вам нужно будет сгенерировать новый файл, отослать им обратно и получить подтверждение, что можно пользоваться новым ключом.
Дополнительное чтение
Android-keystore-password-recover by MaxCamillo — если вы утеряли пароль, то попробуйте воспользоваться данным инструментом. Сам не пользовался, поэтому рассказывать не буду.
Подписывание пакета APK вручную
После сборки приложения для выпуска и до распространения необходимо подписать пакет APK, чтобы его можно было запускать на устройстве Android. Как правило, этот процесс обрабатывается в интегрированной среде разработки, однако существуют ситуации, когда пакет APK нужно подписать вручную с использованием командной строки. В ходе процесса подписывания пакета APK выполняются следующие действия:
- Создание закрытого ключа . Этот шаг необходимо выполнить только один раз. Закрытый ключ необходим для подписывания пакета APK цифровой подписью. После подготовки закрытого ключа это действие можно пропустить для будущих сборок выпуска.
- Zipalign APK . Zipalign — это процесс оптимизации, выполняемый в приложении. Он позволяет Android более эффективно взаимодействовать с пакетом APK во время выполнения. Xamarin.Android проводит проверку во время выполнения и запретит запуск приложения, если пакет APK не был оптимизирован.
- Подписывание APK — на этом шаге используется служебная программа apksigner из пакета SDK для Android и подписывание ПАКЕТА APK с помощью закрытого ключа, созданного на предыдущем шаге. Приложения, разработанные с применением средств сборки пакета SDK для Android, вышедших до v24.0.3, будут использовать приложение jarsigner из пакета JDK. Оба эти средства обсуждаются более подробно ниже.
Важно соблюдать порядок действий, который зависит от средства, применяемого для подписывания пакета APK. При использовании apksigner важно сначала оптимизировать приложение с помощью zipalign, а затем подписать его с помощью apksigner. Если для подписывания пакета APK необходимо использовать jarsigner, то важно сначала подписать пакет APK, а затем запустить zipalign.
Предварительные требования
В этом руководстве будет рассматриваться использование apksigner из средств сборки пакета SDK для Android v24.0.3 или более поздней версии. Предполагается, что пакет APK уже собран.
Для приложений, созданных с помощью более ранней версии средств сборки пакета SDK для Android, следует использовать средство jarsigner, как описано в разделе Подписывание пакета APK с помощью jarsigner.
Создание закрытого хранилища ключей (keystore)
keystore — это база данных сертификатов безопасности, которая создается с помощью программы keytool из пакета SDK для Java. Хранилище ключей крайне важно для публикации приложения Xamarin.Android, так как Android не будет запускать приложения, не имеющие цифровой подписи.
Во время разработки для подписывания приложения Xamarin.Android использует хранилище ключей, что позволяет развернуть приложение непосредственно в эмуляторе на устройствах, настроенных для использования отлаживаемых приложений. Однако это хранилище ключей не распознается как допустимое для распространения приложений.
Поэтому для подписывания приложений необходимо создать и использовать закрытое хранилище ключей. Это действие выполняется только один раз, так как один и тот же ключ будет использоваться для публикации обновлений и для подписывания других приложений.
Очень важно обеспечить безопасность этого хранилища ключей. В случае его потери будет невозможно публиковать изменения для приложения в Google Play. Единственное решение проблемы, связанной с потерянным хранилищем ключей, заключается в создании нового хранилища ключей, повторном подписывании пакета APK новым ключом и отправке нового приложения. Старое приложение потребуется удалить из Google Play. Аналогично, в случае нарушения безопасности нового хранилища ключей или его публичного распространения в широкую доступность могут выйти неофициальные или вредоносные версии приложения.
Создание нового хранилища ключей
Для создания нового хранилища ключей требуется средство командной строки keytool из пакета SDK для Java. Ниже приведен пример использования keytool (замените именем файла хранилища ключей, а — именем ключа в хранилище ключей):
$ keytool -genkeypair -v -keystore .keystore -alias -keyalg RSA \ -keysize 2048 -validity 10000
Сначала keytool запросит пароль для хранилища ключей. Затем он запросит определенные сведения, которые помогут в создании ключа. Ниже приведен пример создания ключа publishingdoc , который будет храниться в файле xample.keystore :
$ keytool -genkeypair -v -keystore xample.keystore -alias publishingdoc -keyalg RSA -keysize 2048 -validity 10000 Enter keystore password: Re-enter new password: What is your first and last name? [Unknown]: Ham Chimpanze What is the name of your organizational unit? [Unknown]: NASA What is the name of your organization? [Unknown]: NASA What is the name of your City or Locality? [Unknown]: Cape Canaveral What is the name of your State or Province? [Unknown]: Florida What is the two-letter country code for this unit? [Unknown]: US Is CN=Ham Chimpanze, OU=NASA, O=NASA, L=Cape Canaveral, ST=Florida, C=US correct? [no]: yes Generating 2,048 bit RSA key pair and self-signed certificate (SHA1withRSA) with a validity of 10,000 days for: CN=Ham Chimpanze, OU=NASA, O=NASA, L=Cape Canaveral, ST=Florida, C=US Enter key password for (RETURN if same as keystore password): Re-enter new password: [Storing xample.keystore]
Чтобы получить список ключей, хранящихся в хранилище ключей, используйте keytool с параметром – list :
$ keytool -list -keystore xample.keystore
Оптимизация пакета APK
Перед подписыванием пакета APK с помощью apksigner сначала необходимо оптимизировать файл с помощью средства zipalign из пакета SDK для Android. zipalign выравнивает ресурсы в пакете APK по 4-байтовым границам. Благодаря выравниванию Android может быстро загружать ресурсы из пакета APK, повышая производительность приложения и потенциально сокращая использование памяти. Чтобы определить, прошел ли пакет APK оптимизацию, Xamarin.Android будет проводить проверку во время выполнения. Если пакет APK не оптимизирован, приложение не запустится.
Следующая команда использует подписанный пакет APK, а ее результатом будет подписанный, оптимизированный пакет APK helloworld.apk, готовый к распространению.
$ zipalign -f -v 4 mono.samples.helloworld-unsigned.apk helloworld.apk
Подписывание пакета APK
Оптимизированный пакет APK необходимо подписать с использованием хранилища ключей. Для этого предназначено средство apksigner, находящееся в каталоге build-tools версии средств сборки пакета SDK. Например, если установлены средства сборки пакета SDK для Android v25.0.3, apksigner можно найти в следующем каталоге:
$ ls $ANDROID_HOME/build-tools/25.0.3/apksigner /Users/tom/android-sdk-macosx/build-tools/25.0.3/apksigner*
В следующем фрагменте предполагается, что средство apksigner доступно для переменной среды PATH . Пакет APK подписывается с помощью псевдонима ключа publishingdoc , содержащегося в файле xample.keystore.
$ apksigner sign --ks xample.keystore --ks-key-alias publishingdoc mono.samples.helloworld.apk
При выполнении этой команды при необходимости apksigner запросит пароль для хранилища ключей.
Дополнительные сведения об использовании apksigner см. в документации Google.
Согласно проблеме Google 62696222, средство apksigner «отсутствует» в пакете SDK для Android. Решением этой проблемы является установка средств сборки пакета SDK для Android v25.0.3 и использование этой версии apksigner.
Подписывание пакета APK с помощью jarsigner
Сведения в этом разделе применимы, если пакет APK необходимо подписать с помощью программы jarsigner. Для подписывания пакета APK разработчикам рекомендуется использование apksigner.
Эта методика предполагает подписывание APK-файла с помощью jarsigner из пакета SDK для Java. Средство jarsigner входит в состав пакета SDK для Java.
Далее показано, как подписать пакет APK с помощью jarsigner и ключа publishingdoc , содержащегося в файле хранилища ключей xample.keystore:
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore xample.keystore mono.samples.helloworld.apk publishingdoc
При использовании jarsigner важно сначала подписать пакет APK, а затем использовать средство zipalign.
Связанные ссылки
- Подписывание приложений
- jarsigner
- keytool
- zipalign
- Средства сборки 26.0.0: куда пропало средство apksigner?
Смена Android keystore¶
Как изменить путь к Android Keystore вручную через конфигурации файлов¶
При необходимости вы можете вручную указать (изменить) путь к расположению файла Android Keystore.
Когда разработчик обновляет приложение или добавляет новое в Google Play Market под своим именем, необходимо чтобы у нового приложения был тот же Keystore, иначе загрузить приложение не удастся. Важно знать, что уникальный Keystore генерируется только один раз. Если удалить EV Studio или Keystore файл, повторное его создание с такими же данными сгенерирует другой Keystore. Если вы загрузили приложение в Google Play в первый раз, и планируете обновления, советуем скопировать и сохранить keystore файл в надежном месте.
Например, при разработке приложения вы сохранили Keystore в **D:/Projects/Android/android.keystore**
По умолчанию в настройках программы расположение keystore:

- macOS: /Users//Library/Application Support/ev_studio_/android.keystore

При этом в текущей версии программы (EV Toolbox 3.4.x) нет возможности указать расположение вашего keystore напрямую из программы.
Для того, чтобы вручную указать расположение keystore необходимо модифицировать файл settings, который расположен:
Для модификации откройте файл с помощью текстового редактора (Sublime Text, Visual Studio Code, Noteped и др.)
Найдите параметр (18 строка), где указан текущий путь к расположению файлов android.keystore. Замените путь к файлу на необходимый: в нашем примере это будет D:/Projects/Android/android.keystore. Сохраните изменения в файле.

Запустите программу конструктор EV Toolbox и в настройках экспорта проверьте внесенные изменения.