Использование Google Firebase Cloud Messages (FCM) в проектах

Firebase Cloud Messaging (FCM) — это межплатформенное решение для обмена сообщениями, которое позволяет надежно доставлять сообщения без каких-либо затрат. Используя FCM, вы можете уведомить клиентское приложение о том, что для синхронизации доступны новые электронные или другие данные.

Статья состоит из 2 частей. В первой рассматривается введение и начальная настройка, а далее подробно раскрывается принцип отправки и обработки уведомлений FCM.

Часть 2. Принцип работы отправки и приемки уведомлений в Firebase Cloud Messages (FCM)

Это перевод и дополнение официальной статьи по плагину cordova-plugin-fcm.

Установка

Процесс установки мы уже рассматривали в первой части статьи. Перед началом, убедитесь, что у вас есть google-services.json для Android или GoogleService-Info.plist для iOS в корневой папке вашего проекта Cordova. Вам не нужно настраивать что-либо еще, чтобы иметь push-уведомление, работающее для обеих платформ, все это волшебство. Установка плагина FCM занимает не много времени

cordova plugin add cordova-plugin-fcm

Файлы конфигурации Firebase

Получите необходимые файлы конфигурации для Android или iOS из Firebase Console (см. документацию: https://firebase.google.com/docs/).

Детали компиляции под Android

Поместите загруженный файл «google-services.json» в корневую папку проекта Кордовы. Вам нужно будет убедиться, что вы установили соответствующие библиотеки Android SDK.

Если хотите добавить значок уведомления в Android> 5.0, то вы должны поместить картинку со значком с именем «fcm_push_icon.png» в папку «res» так же, как вы добавляете другие значки приложений. Если вы не установите этот ресурс, SDK будет использовать значок по умолчанию для вашего приложения, который может не соответствовать стандартам для Android> 5.0.

Детали компиляции под iOS

Поместите загруженный файл «GoogleService-Info.plist» в корневую папку проекта Cordova.

Использование FCM в Cordova

Пример заполнения JSON данных для отправки на сервер FCM по REST API представлен в ниже в подразделе Отправить уведомление. Пример из песочницы (REST API).

Настоятельно рекомендуется использовать REST API для отправки push-уведомлений, потому что консоль Firebase не имеет всех функций. Обратите внимание на пример в песочнице, чтобы научиться правильно использовать плагин. Вы также можете протестировать свои уведомления на бесплатном сервере тестирования: https://cordova-plugin-fcm.appspot.com.

Получение обновления токена

Токен — это идентификатор, выданный серверами соединения FCM, в клиентское приложение, который позволяет приложению получать сообщения. Обратите внимание, что регистрационные токены должны храниться в секрете.

//FCMPlugin.onTokenRefresh( onTokenRefreshCallback(token) );
/**
 * Обратите внимание, что этот Callback будет срабатывать каждый раз, 
 * когда будет сгенерироваться новый токен, в том числе и первый раз.
 */
FCMPlugin.onTokenRefresh(function(token){
    alert( token );
});

При первом запуске вашего приложения FCM SDK генерирует регистрационный токен для экземпляра клиентского приложения. Если вы хотите настроить таргетинг на отдельные устройства или создать группы устройств, вам необходимо получить доступ к этому токену или токенам.

Получение токена

Функция getToken возвращает токен текущего устройства или нулевое значение, если токен еще не установлен для устройства.

//FCMPlugin.getToken( successCallback(token), errorCallback(err) );
/**
 * Имейте в виду, то функция возвращает нулевое значение, 
 * если токен не был установлен еще.
 */
FCMPlugin.getToken(function(token){
    alert(token);
});
Подписаться на тему(топик)
//FCMPlugin.subscribeToTopic( topic, successCallback(msg), errorCallback(err) );
/**
 * Все устройства подписаны автоматически, 
 * ко 'всем' - и 'ios' и 'android' темам соответственно.
 * Должен соответствовать следующему регулярному выражению: "[a-zA-Z0-9-_.~%]{1,900}"
 */
 FCMPlugin.subscribeToTopic('topicExample');
Отписаться от темы(топика)
//FCMPlugin.unsubscribeFromTopic( topic, successCallback(msg), errorCallback(err) );
FCMPlugin.unsubscribeFromTopic('topicExample');
Получение данных push-уведомлений

Функция FCMPlugin.onNotification(…) принимает все уведомления, по токену или по топику, на который подписаны пользователи

//FCMPlugin.onNotification( onNotificationCallback(data), successCallback(msg), errorCallback(err) )
/**
 * Здесь Вы можете определить свое поведение приложения на основе данных уведомления.
 */
 FCMPlugin.onNotification(function(data){
    if(data.wasTapped){
      //Уведомление было получено в трей устройства и постучал пользователю.
      alert( JSON.stringify(data) );
    }else{
      //Уведомление было получено на переднем плане. Возможно, пользователя нужно уведомить.
      alert( JSON.stringify(data) );
    }
});

Следует отметить, что если вы используете Vue.js, как программную архитектуру или jQuery, то необходимо дождаться, пока ресурсы устройства подгрузятся, иначе можно получить ошибку, что плагин FCMPlugin не определен. Один из вариантов — размещение обработчика в setTimeout

var app = {
    initialize: function() {
        this.bindEvents();
        this.setupApp();
    },
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    onDeviceReady: function() {
    },
    setupApp: function() {
        //Программная логика на какой-то библиотеке
        setTimeout(function(){
            FCMPlugin.onNotification(function(data) {
                console.log(data);
            });
        },2000);
    }
}

app.initialize();

или разместить весь код в обработчике события deviceready

var app = {
    initialize: function() {
        this.bindEvents();
        this.setupApp();
    },
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    onDeviceReady: function() {
        FCMPlugin.onNotification(function(data) {
            console.log(data);
        });
    },
    setupApp: function() {
        //Программная логика на какой-то библиотеке
    }
}

app.initialize();
Отправить уведомление. Пример из песочницы (REST API)

Чтобы отправлять FCM — уведомления тому или иному устройству нам необходимо знать токен этого устройства и тему (топик), на который подписано устройство.

Как получить токен, подписаться устройство на тему(топик) и как отписаться мы выше уже привели примеры с кодом. Теперь нам осталось уметь отправлять уведомления и как мы уже говорили выше, для этого нужно отправлять JSON — с заполненными данными методом POST на адрес https://fcm.googleapis.com/fcm/send и потребуется указать еще 2 заголовка отправки, как Content-Type: application/json и Authorization: key=AIzaSy*******************. Первый заголовок указывает, что мы передаем JSON — данные и второй — что, запрос содержит учетные данные для аутентификации пользовательского агента с сервером. Второй заголовок принимает параметр ключа API для веб-приложения, который можно узнать в консоли FCM

 

Пример этой JSON приведен ниже и еще ниже описаны параметры, которые входят в эту строку.

Дополнительно:

{
  "notification":{
    "title":"Notification title",
    "body":"Notification body",
    "sound":"default",
    "click_action":"FCM_PLUGIN_ACTIVITY",
    "icon":"fcm_push_icon"
  },
  "data":{
    "param1":"value1",
    "param2":"value2"
  },
    "to":"/topics/topicExample",
    "priority":"high",
    "restricted_package_name":""
}

Метод передачи и заголовки с параметрами:

  • POST: https://fcm.googleapis.com/fcm/send
  • HEADER: Content-Type: application/json
  • HEADER: Authorization: key=AIzaSy*******************

Передаваемые параметры в JSON методом POST:

  • sound — необязательный параметр для указания своего звука уведомления
  • click_action — должен присутствовать с указанным значением для Android
  • icon — значок — имя ресурса для Android >5.0
  • data — положите любые «param»:»value» и получите их в JavaScript callback — уведомлениях
  • to — токен устройства или /topic/topicExample
  • priority — должен быть установлен в «high» для доставки уведомлений закрытым iOS — приложениям
  • restricted_package_name — Необязательное поле, если вы хотите отправить только на ограниченный пакет приложений (т.е.: com.myapp.test)
Пример отправки POST — запроса FCM — уведомления при помощи jQuery

В коде представлен пример AJAX запроса методом POST с указанием необходимых заголовков и их параметров

var fcm_server_key = "AIzaSy*******************";

$.ajax({
  method: "POST",
  dataType: 'json',
  headers: {'Content-Type': 'application/json', 'Authorization': 'key=' + fcm_server_key},
  url: "https://fcm.googleapis.com/fcm/send",
  data: JSON.stringify(
      {
        "notification":{
          "title":"Title",  //Любое значение
          "body": "Body",  //Любое значение
          "sound": "default", //Если вы хотите звучание в уведомление
          "click_action": "FCM_PLUGIN_ACTIVITY",  //Должен присутствовать для Android
          "icon": "fcm_push_icon"  //Белая иконка ресурса Android
        },
        "data":{
          "param1":"value1",  //Любые данные, получаемые в callback - уведомлении
          "param2": "Prueba"
        },
        "to":"/topics/all", //Тема(топик) или какое-то одно устройство
        "priority":"high", //Если не установлен, то уведомления не могут быть доставлены для закрытых приложений iOS
        "restricted_package_name":"" //Необязательно. Устанавливается для фильтрации приложений
      }
    )
}).success(function(data){
  alert("Success: " + JSON.stringify(data));
}).error(function(data){
  alert("Error: " + JSON.stringify(data));
});
Пример отправки POST — запроса FCM — уведомления при помощи cURL с сервера

Вот пример cURL. Не забудьте заменить авторизацию заголовка собственной учетной записью службы Firebase

curl -X POST \
  https://fcm.googleapis.com/fcm/send \
  -H 'authorization: key=YOUR-FIREBASE-SERVER-KEY' \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -d '{
	"to": "/topics/all",
	"notification": {
	    "title": "Hello World!",
	    "body": "Proin rutrum, nunc vitae porta volutpat, mi nibh.",
        "icon": "fcm_push_icon",
    	"color": "#F79838",
        "sound":"default"
	},
	"priority": "high",
        "click_action":"FCM_PLUGIN_ACTIVITY"
}'

 

Пример отправки POST — запроса FCM — уведомления при помощи Axios из устройства

Axios — это отличная клиентская библиотека, которая использует промисы по умолчанию, а так же работает как на сервере(что делает его подходящим для получения данных при рендеринге на сервере), так и на клиенте. Axios очень легко начать использовать с Vue.js. Поэтому, если у вас приложение написано с использованием Vue.js или Ionic, то отправку уведомлений нам придется реализовать через Axios

var fcm_server_key = "AIzaSy*******************";

axios({
  method: 'POST', //Метод отправки
  url: 'https://fcm.googleapis.com/fcm/send',
  data: JSON.stringify(
      {
        "notification":{
          "title":"Title",  //Любое значение
          "body": "Body",  //Любое значение
          "sound": "default", //Если вы хотите звучание в уведомление
          "click_action": "FCM_PLUGIN_ACTIVITY",  //Должен присутствовать для Android
          "icon": "fcm_push_icon"  //Белая иконка ресурса Android
        },
        "data":{
          "param1":"value1",  //Любые данные, получаемые в callback - уведомлении
          "param2": "Prueba"
        },
        "to":"/topics/all", //Тема(топик) или какое-то одно устройство
        "priority":"high", //Если не установлен, то уведомления не могут быть доставлены для закрытых приложений iOS
        "restricted_package_name":"" //Необязательно. Устанавливается для фильтрации приложений
      }
    ),
  headers: {
    'Content-Type': 'application/json', 'Authorization': 'key=' + fcm_server_key
  }
}).then((response) => {
    console.log(response)
})
.catch((error) => {
    console.log(error)
});
    
Пример отправки POST — запроса FCM — уведомления при помощи Axios из Node.js

Для начала нам потребуется установить Axios в систему при помощи простой команды через менеджер модулей npm

npm install axios

Теперь создаем index.js в корневом каталоге вашего проекта и заполняем его следующим образом

var axios = require('axios');
const fcmKey = 'YOUR_FCM_SERVER_KEY'
const fcmUrl = 'https://fcm.googleapis.com/fcm/send'
const phoneToken = 'MY_PHONE_TOKEN'

Здесь мы просто импортируем модуль axios, устанавливаем ключ сервера api и указываем адрес сервера взаимодействия, на который мы отправляем POST наши уведомления. Константа phoneToken является идентификатором вашего телефона, который раздается клиентам сервером FCM для регистрации в системе обмена.

Чтобы наше уведомление отвечало на событие, мы заставим его прослушивать конечную точку тестирования в базе данных Firebase

ref.child('test').on('child_added', (snapshot) => {
  const notification = buildNotification(snapshot.val())
  sendNotification(notification)
})

Как вы можете видеть, это просто наблюдает за конечной точкой/тестом(endpoint /test) для нового потомка. Потомок — это просто ключ/значение(key/value) с ключом «name». Перейдем к нашей функции buildNotification()

function buildNotification (data) {
  const { name } = data
  return {
    "notification": {
      "title":"New name",
      "text":`${name} is awesome`,
      "sound":"default"
    },
    "to":phoneToken,
    "priority":"high"
  }
}

Не забудьте установить приоритет на высокий уровень при разработке, иначе может потребоваться некоторое время, прежде чем ваше уведомление поступит

function buildRequest (notification) {
  return {
    url: fcmURL,
    method: 'post',
    headers: {
      "Content-Type":"application/json",
      "Authorization":`key=${fcmKey}`
    },
    data: notification
  }
}
function sendNotification(notification) {
  const request = buildRequest(notification)
axios(request).then((r) => {
    console.log(r)
  }).catch((error) => {
    console.log(error)
  })
}

Сначала мы создаем запрос с нашим уведомлением и токеном FCM в заголовках запросов. Затем мы передаем этот запрос в Axios и слушаем ответ или ошибку. Теперь вы должны увидеть уведомление, появившееся на вашем устройстве.

Если у вас не получилось, то есть несколько вещей, на которые стоит обратить внимание:

  • Убедитесь, что приоритет установлен на высокий
  • Убедитесь, что у вас есть сертификат push-уведомления, загруженный в консоль Firebase (В iOS 10 могут быть изменения на использование)

Как это работает

К примеру, мы отправляем push-уведомление на одно устройство или в тему(топик). При этом возможны 2 случая:

a. Приложение находится на переднем плане:

  • Данные уведомления принимаются в Callback — вызове JavaScript без сообщения в панели уведомлений (это обычное поведение push — уведомлений в мобильных ).

b. Приложение находится в фоновом режиме или закрыто:

  • Устройство отображает сообщение уведомления на панели уведомлений устройства.
  • Если пользователь удаляет уведомление, приложение выходит на передний план и данные уведомления принимаются в Callback —  вызове JavaScript.
  • Если пользователь не обращается к уведомлению, но открывает приложение, то ничего не происходит до тех пор, пока уведомление не будет обработано.

Реальный пример отправки из Axios

Код отправки уведомления

/**
 * to - кому и куда отправляется уведомление и может быть:
 * 1. токеном
 * 2. топиком
 * 3. или можем отправить всем сразу
 * title - заголовок уведомления
 * message - тело уведомления
 * apiKey - секретный ключ из облачного приложения Android Google FCM
 */
var to =  "cicx9RtKXdk:APA91bGsk16she-DPkwjSrM5_9ZfJ4v189k53ETUF081DXtIH6vl6MwsSy8ky6Orn5MUzZJqzUoCNHOZ3BxWquTvIJis2X5zzFtJQSY6ozQFUsMb6157lKS27HTDN4vuMcF4_CuTpEJH";          
//var to = "/topics/topicExample";
//var to = "/topics/all";

var title = "Новое сообщение";
var message = "Мое сообщение!";
var apiKey = "AIzaSyDqYOMoJ1jVoIfLTErYboDOtuqfCHcnWfE";

axios({
method: 'POST', //Метод отправки
url: 'https://fcm.googleapis.com/fcm/send', 
data:{
    "notification":{
      "title":title,  //Любое значение
      "body": message,  //Любое значение
      "sound": "default", //Если вы хотите звучание в уведомление
      "click_action": "FCM_PLUGIN_ACTIVITY",  //Должен присутствовать для Android
      "icon": "fcm_push_icon"  //Белая иконка ресурса Android
    },
    "data":{
      "param1":"value1",  //Любые данные, получаемые в callback - уведомлении
      "param2": "Prueba"
    },
    "to":to,
    "priority":"high" //Если не установлен, то уведомления не могут быть доставлены для закрытых приложений iOS
    //"restricted_package_name":"" //Необязательно. Можно закомментить
},
headers: {
    'Content-Type': 'application/json', 'Authorization': 'key=' + apiKey
}
}).then((response) => {
console.log(response)
})
.catch((error) => {
console.log(error)
});

Код приемки уведомления. Необходимо ждать, пока подгрузяться ресурсы

setTimeout(function(){
    if(data.wasTapped){
      //Уведомление было получено в трей устройства и постучал пользователю.
      alert( JSON.stringify(data) );
    }else{
      //Уведомление было получено на переднем плане. Возможно, пользователя нужно уведомить.
      alert( JSON.stringify(data) );
    }
},2000);

или можно закинуть в обработчик Cordova ‘deviceready’

var app = {
    initialize: function() {
        this.bindEvents();
        this.setupApp();
    },
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    onDeviceReady: function() {
        FCMPlugin.onNotification(function(data) {
            console.log(data);
        });
    },
    setupApp: function() {
        //Программная логика на какой-то библиотеке
    }
}

app.initialize();

 

Авторизация в мобильном устройстве на Cordova через Facebook

Вход в Cordova — приложение с помощью Facebook является одной из наиболее востребованных статей, и здесь мы рассмотрим один из способов реализовать данную настройку.

Для реализации входа будет использован сторонний плагин cordova-plugin-facebook4, который является форком из репозитория phonegap-facebook-plugin.

Данный плагин использует последний SDK SDK для Facebook, позволяя реализовать получение данных из профиля Facebook в проектах Cordova.

В этой статье мы позволим нашему пользователю войти в систему со своей учетной записью Facebook, и после того, как мы пройдем проверку подлинности, мы сделаем запрос на захват некоторой пользовательской информации из нашего профиля Facebook.

Нам нужно будет создать новое приложение для Facebook через свой профиль и подключить наше Facebook — приложение к приложению Cordova и результат этого будет похож следующим образом:

  • если пользователь не авторизирован в Facebook, то вывести формы авторизации;
  • подтверждение, что вы даете разрешение на доступ к своим данным через приложение Facebook приложению Cordova;
  • передача данных нашего профиля приложению на Cordova и использование для регистрации или для входа в систему.

Создаем новое приложение Facebook

Заходим в свой аккаунт на Facebook и в левом списке ищем пункт Приложения

Жмем на пункт "Управление приложениями"
Жмем на пункт «Управление приложениями»

 

Создаем новое приложение

Тут мы создаем новое приложение или используем существующее. У меня оно уже есть
Тут мы создаем новое приложение или используем существующее. У меня оно уже есть

Выбираем для приложения продукты авторизации

Тут добавляем новый продукт для приложения. Для авторизации достаточно добавить продукт "Вход через Facebook"
Тут добавляем новый продукт для приложения. Для авторизации достаточно добавить продукт «Вход через Facebook»

Обращаем внимание на ID приложения. Он нам нужен будет на этапе настройки плагина cordova-plugin-facebook4 .

Далее настраиваем наше приложение, заполняя основную информацию

Заполняем основную информацию в настройках приложения
Заполняем основную информацию в настройках приложения

И далее основное — добавление платформ к приложению. В данном примере добавим только платформу Android, но вам никто не мешает добавить и остальные

Тут добавляем необходимые для нас платформы, к которым наше приложение Facebook будет комуницировать с этими платформами
Тут добавляем необходимые для нас платформы, к которым наше приложение Facebook будет комуницировать с этими платформами

 

На этапе добавления, в данном случает добавления платформы Android, достаточно прописать идентификатор приложения в Google Play. Чтобы приложение работало оно может быть и не опубликовано в Google Play — это необязательно, но прописать индентификатор необходимо для работоспособности.

Настройка клиентского приложения на Cordova

После создания приложения Cordova необходимо добавить вышеупомянутый плагин командой с параметрами приложения Facebook

cordova plugin add cordova-plugin-facebook4 --save --variable APP_ID="123456789" --variable APP_NAME="myApplication"
  • APP_ID — это ИД приложения Facebook;
  • APP_NAME — имя приложения Facebook.

Теперь код SDK Facebook для авторизации через приложение доступно через код приложения Cordova и сначала нужно инициализировать

        window.fbAsyncInit = function() {
            FB.init({
                appId      : '1971003386550161',
                xfbml      : true,
                version    : 'v2.4'
            });
        };

Далее выполняем код авторизации

                    try {
                        var fbLoginSuccess = function (userData) {
                             if (userData.status=='connected'){
                                  facebookConnectPlugin.api("me/?fields=id,last_name,first_name,birthday,email, picture.width(200).height(200)", ['public_profile', 'user_friends', 'email'],
                                       function onSuccess (result) {
                                            alert("Result: "+JSON.stringify(result));
                                       }, function onError (error) {
                                            alert("Failed: "+JSON.stringify(error));
                                       }
                                  );
                             }
                        };
                        facebookConnectPlugin.login(["public_profile"], fbLoginSuccess,
                             function loginError (error) {
                                  alert('error='+JSON.stringify(error))
                             }
                        );
                   }
                   catch (e) {
                        alert('error1='+e.message);
                   }
                }

Результатом будет следующие данные, которые мы уже можем использовать в нашем приложении

Автоматизация подписи гибридных приложений Android

  1. Основные положения электронной подписи приложений
  2. Способы генерации ключей подписи и хранилища ключей
  3. Разница между хранилищами *.jks и *.keystore
  4. Ручная подписка APK
  5. Подписка APK на Google Play
  6. Соображения подписи, безопасности и удаление подписки из сборки APK
  7. Автоматизация процесса подписи на этапе сборки APK
  8. Автоматизация подписи гибридных приложений Android

Допустим, что у вас есть гибридное приложение, которое было спроектировано с использование фреймворка Ionic или Cordova с использованием Crosswalk.

Настроив автоматизацию, вы сможете создать подписанный release вашего APK, готовый для публикации на Google Play Store.

Если вы проектируете гибридные приложения, используя Ionic и вы нацелены на платформу Android, то вы сможете использовать Crosswalk, чтобы иметь хорошую совместимость на различных устройствах.

Использование Crosswalk в вашем проекте Ionic так же просто, как ввести эту команду:

ionic browser add crosswalk

Ionic позаботится о том, чтобы установить для вас Crosswalk.

Когда вы хотите опубликовать свое приложение в Google Play Store, вам нужно построить APK в режиме выпуска т.е. release, подписать его ключом вашего хранилища ключей и сделать zipalign пакет для его оптимизации.

Условимся, что у вас уже есть сгенерированные ключи в хранилище ключей и нам остается настроить, чтобы система автоматически подписывала приложение на этапе построения release, а если хотите подробно подробно почитать про это, относительно кроссплатформенных приложений на Ionic, то можете обратиться к официальному источнику.

Для начала нам необходимо создать файл под именем release-signing.properties в директории проекта project_folder/platforms/android/. В этот файл добавляем пару строк

storeFile=/path/to/keystore/yourname.keystore
keyAlias=youralias

Конечно же, вы можете поменять путь к файлу ваших ключей и алиас ключа. Затем вы должны построить вашу сборку release

ionic build --release android

Появится небольшое окно с запросом пароля хранилища ключей и пароля ключа. Если вы не хотите вводить два пароля каждый раз, вы можете записать их в файлах release-signing.properties, добавив две строки, похожие на следующие

storeFile=/path/to/keystore/yourname.keystore
keyAlias=youralias
storePassword=your_keystore_password
keyPassword=your_key_password

В целях безопасности и сохранности ключей не рекомендуется хранить в сторонних файлах ключи к подпискам ваших приложений.

После построения вы найдете построенный APK в директории проекта project_folder/platforms/android/build/outputs/apk/. Обычно, там будут 2 вида APK под именами android-x86-release.apk и android-armv7-release.apk.

Замечание 1.Помните, что вы должны загружать как x86, так и armv7 apks в Play Store, потому что с помощью Crosswalk ваше приложение содержит собственный код, специфичный для архитектуры.

Замечание 2. Не забудьте активировать «расширенный режим» в консоли разработчика (если вы находитесь в «Простом режиме», можно активировать только один apk за один раз) и загрузить один APK за другим. Google достаточно умен, понимая, что APK нацелены на две разные платформы. дополнительно про это можете почитать на официальном сайте.

 

Подписка APK на Google Play

  1. Основные положения электронной подписи приложений
  2. Способы генерации ключей подписи и хранилища ключей
  3. Разница между хранилищами *.jks и *.keystore
  4. Ручная подписка APK
  5. Подписка APK на Google Play
  6. Соображения подписи, безопасности и удаление подписки из сборки APK
  7. Автоматизация процесса подписи на этапе сборки APK
  8. Автоматизация подписи гибридных приложений Android

В данном посте рассмотрим, как управлять ключами подписи приложений, используя сервисы Google Play.

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

Если вы потеряли доступ к хранилищу ключей или считаете, что оно было взломано, программа подписания приложений Google Play позволяет сбросить ключ загрузки. Пользователям, которые не зарегистрированы в программе подписания приложений Google Play и потеряли доступ к хранилищу ключей, придется опубликовать приложение заново с другим названием пакета.

О программе подписания приложений Google Play

Если вы не зарегистрированы в программе подписания приложений Google Play, то подписываете свое приложение с помощью специального ключа и загружаете его в Google Play, после чего оно становится доступно пользователям.

Если вы зарегистрированы в программе подписания приложений Google Play, то подписываете приложение ключом загрузки. Google проверяет и удаляет подпись ключа загрузки, а затем подписывает приложение с помощью исходного ключа подписи. После этого оно становится доступно пользователям.

Важно! Регистрацию в программе подписания приложений Google Play нельзя отменить.

Регистрироваться в программе подписания приложений Google Play необязательно. Вы можете управлять собственными ключами, как и раньше.

Для регистрации в программе подписания приложений Google Play необходим аккаунт Play Console. Приняв условия программы, вы сможете регистрировать в ней свои приложения.

Если вы зарегистрируете приложение в программе, это действие нельзя будет отменить. Мы заботимся о безопасности ключей подписи, поэтому их нельзя удалить с защищенного сервера.

Примечание. Если вы принимаете условия программы, это не означает, что все приложения вашего аккаунта разработчика будут автоматически зарегистрированы в программе подписания.

Типы ключей и определения
  • Ключ подписи приложения – ключ, которым подписывается APK-файл на устройстве пользователя. Пока вы не зарегистрировались в программе подписания приложений Google Play, этот ключ находится у вас, и вы подписываете им APK-файлы. После регистрации в программе вам потребуется загрузить его в Google.
  • Ключ загрузки – новый ключ, который вы создаете при регистрации в программе. В дальнейшем вы будете подписывать им все APK-файлы перед их загрузкой в Play Console.
  • Закрытый ключ – ключ, который используется для подписи APK-файлов. Он доступен только вам.
  • Открытый ключ – ключ, который используется для подтверждения подписи APK-файла. Он доступен для всех.
  • Сертификат – файл, который содержит открытый ключ, а также дополнительную информацию о владельце ключа.
  • Инструмент PEPK – используется для экспорта закрытых ключей из хранилища Java и их шифрования для передачи в Google Play при регистрации в программе подписания приложений Google Play.
Рекомендации
  • Чтобы защитить аккаунт разработчика, включите двухэтапную аутентификацию для всех аккаунтов, у которых есть доступ к Play Console.
  • Если вы хотите протестировать APK-файл, подписанный ключом загрузки, зарегистрируйте ключ в службе или API, которые используют подпись приложения для аутентификации (например, API Google Карт или пакете разработчика Facebook). Если вы используете API Google, можно зарегистрировать сертификат загрузки в Google Cloud Console.

Обзор шагов по использованию программы подписки Google App Play

Есть 2 варианта начала использования программы подписки Google App Play: использование с публикацией нового приложения и использование с уже опубликованными приложениями с локальными хранилищами ключей подписи без сервисов Google App Play.

Если вы публикуете новые приложения

  1. Воспользуйтесь инструкциями на этой странице.
  2. Подпишите новый APK-файл ключом загрузки.
Информация о ключе загрузки
  • Ключ загрузки регистрируется только в Google и нужен для того, чтобы подтвердить личность создателя приложения.
  • Ваша подпись удаляется из всех загруженных APK-файлов, прежде чем они попадают к пользователям.
Ограничения
  • Ключ загрузки должен использовать шифрование RSA и быть не менее 2048 битов.
  • Не поддерживаются ключи DSA и EC, а также ключи RSA размером менее 2048 битов.

  1. Откройте Play Console.
  2. Выберите приложение.
  3. В меню слева выберите Управление релизом > Версии приложения.
  4. Напротив пункта «Программа подписания приложений Google Play» нажмите Принять.

Шаг 3. Загрузите подписанное приложение.

  1. Подготовьте и внедрите версию.
  2. Google удалит подпись ключа загрузки и подпишет приложение с помощью нового ключа. После этого оно станет доступно пользователям.

В вашем приложении используется API? Чтобы пройти аутентификацию, вам, скорее всего, понадобится зарегистрировать сертификат ключа. Как правило, для этого требуется цифровой отпечаток.

Чтобы найти сертификат ключа, который Google использует для подписи APK-файла:

  1. Войдите в Play Console.
  2. Выберите приложение.
  3. В меню слева нажмите Управление релизом > Подписи приложений.
  4. На открывшейся странице доступны наиболее распространенные отпечатки для сертификата цифровой подписи (MD5, SHA-1 и SHA-256). Если поставщик API требует другой тип цифрового отпечатка, вы можете скачать оригинальный сертификат в формате DER и преобразовать его нужным образом.

Если вы уже опубликовали свои приложения

Вот как зарегистрировать приложение:

  1. Войдите в Play Console.
  2. Выберите приложение.
  3. В меню слева нажмите Управление релизом > Подписи приложений.
  4. Ознакомьтесь с Условиями использования и выберите Принять.

Выполните следующие действия:

  1. Найдите исходный ключ подписи приложения.
  2. Войдите в Play Console.
  3. Выберите приложение.
  4. В меню слева нажмите Управление релизом > Подписи приложений.
  5. Следуя инструкциям на экране, загрузите исходный ключ подписи, а затем создайте ключ загрузки и зарегистрируйте его в Google.
  6. На следующем экране вы увидите цифровой отпечаток сертификата своего приложения.
Информация о ключе загрузки
  • Ключ загрузки регистрируется только в Google и нужен для того, чтобы подтвердить личность создателя приложения.
  • Ключ загрузки удаляется из всех загруженных APK-файлов, прежде чем они попадают к пользователям.
Ограничения
  • Ключ загрузки должен использовать шифрование RSA и быть не менее 2048 битов.
  • Не поддерживаются ключи DSA и EC, а также ключи RSA размером менее 2048 битов.

Создав ключ загрузки, выберите для него хранилище. Вот некоторые возможные варианты:

  • локальная система;
  • защищенный локальный сервер (с различными списками контроля доступа);
  • облачная система (с различными списками контроля доступа);
  • специальные сервисы по управлению ключами;
  • репозитории Git.

Шаг 4. Подпишите следующее обновление своего приложения ключом загрузки.

Теперь все обновления опубликованного приложения должны подписываться ключом загрузки. Google подтвердит вашу личность и подпишет APK-файл с помощью нового ключа, после чего обновление станет доступно пользователям.

Вот как найти ключ загрузки:

  1. Войдите в Play Console.
  2. Выберите приложение.
  3. В меню слева нажмите Управление релизом > Подписи приложений.

Изменения в APK-файлах

Файл AndroidManifest.xml приложений, подписанных Google, будет содержать запись «derived APK ID». В теге application появится элемент метаданных, который ссылается на

<meta-data android:name="com.android.vending.derived.apk.id" android:value="[ID]" />

Идентификатор измененного APK-файла будет указываться в стандартных отчетах об ошибках. По идентификатору производного APK вы сможете найти APK-файл, который был загружен в Google Play.

Чтобы скачать APK-файл, подписанный Google Play, откройте Play Console и выберите Управление релизом > Библиотека объектов.

Утерянные или взломанные закрытые ключи

Пользователи, зарегистрированные в программе подписания ключей Google Play, могут сбросить свой ключ загрузки в случаях:

  • утери;
  • взлома закрытого ключа.

Примечание. Сброс ключа загрузки не затрагивает ключ подписи, с помощью которого Google Play подписывает APK перед отправкой пользователям.

Как сбросить ключ загрузки

Чтобы создать и зарегистрировать ключ загрузки, следуйте инструкциям в Справочном центре Android Studio. Новый ключ может отличаться от предыдущего.

Затем экспортируйте сертификат для нового ключа в формате PEM.

keytool -export -rfc -alias <upload> -file <upload_certificate.pem> -keystore <keystore.jks>

Наша служба поддержки принимает запросы на сброс ключей только от владельцев учетных записейPlay Console.

Чтобы связаться с нами, владельцу учетной записи нужно заполнить эту форму и прикрепить к ней файл upload_certificate.pem.

Когда ключ будет зарегистрирован, вы получите электронное письмо. После этого выполните указанные выше действия, чтобы обновить хранилища ключей и регистрацию у поставщика API.

Автоматизация процесса подписи на этапе сборки APK

  1. Основные положения электронной подписи приложений
  2. Способы генерации ключей подписи и хранилища ключей
  3. Разница между хранилищами *.jks и *.keystore
  4. Ручная подписка APK
  5. Подписка APK на Google Play
  6. Соображения подписи, безопасности и удаление подписки из сборки APK
  7. Автоматизация процесса подписи на этапе сборки APK
  8. Автоматизация подписи гибридных приложений Android

В Android Studio вы можете настроить свой проект для автоматической подписки APK в процессе сборки, создав конфигурацию подписи и присвоив ее типу вашей версии выпуска. Конфигурация подписи состоит из местоположения хранилища ключей, пароля хранилища ключей, псевдонима ключа и пароля ключа. Чтобы создать конфигурацию подписи и присвоить ее типу выпуска, используя Android Studio, выполните следующие действия:

  1. В окне Project щелкните правой кнопкой мыши на своем приложении и нажмите Open Module Settings.
  2. В окне Project Structure в разделе Modules на левой панели щелкните модуль, который вы хотите подписать.
  3. Жмите таб Signing , затем жмите Add 
  4. Выберите файл хранилища ключей, введите имя для этой конфигурации подписи (так как вы можете создать несколько) и введите необходимую информацию
  5. Жмите таб Build Types.
  6. Жмите на сборку release.
  7. В разделе Signing Config, выберите конфигурацию подписи, которую вы только что создали
  8. Жмите OK

Теперь каждый раз, когда вы создаете свой тип сборки релиза с помощью Android Studio, среда IDE автоматически подпишет APK, используя указанную вами конфигурацию подписи. Вы можете найти подписанные APK в папке build/output/apk/ внутри каталога проекта для модуля, который вы строите.

Когда вы создаете конфигурацию подписи, ваша информация о подписке включается в обычный текст в файлы сборки Gradle. Если вы работаете в команде или публично публиковали свой код, вы должны хранить свою информацию для подписания, удаляя ее из файлов сборки и сохраняя ее отдельно. Вы можете узнать больше о том, как удалить свою информацию подписи из ваших файлов сборки в разделе «Удаление информации о подписании» из ваших файлов сборки. Для получения дополнительной информации о том, как обеспечить безопасность вашей подписки, прочитайте «Безопасность ваших ключей подписи APK».

Настройка подписи каждой программы по разному вкусу

Если ваше приложение использует вкусы(flavor) продукта, и вы хотели бы подписать каждый вкус по-разному, вы можете создать дополнительные настройки подписки и назначить их по вкусу:

  1. В окне Project, щелкните правой кнопкой мыши на своем приложении и нажмите  Open Module Settings.
  2. В окне Project Structure, в разделе Modules в левой панели, щелкните модуль, который вы хотите подписать.
  3. Жмите таб Signing , затем жмите Add .
  4. Выберите файл хранилища ключей, введите имя для этой конфигурации подписи (так как вы можете создать несколько) и введите необходимую информацию
  5. Повторяйте шаги 3 и 4 по мере необходимости, пока не создадите все свои настройки подписи.
  6. Нажмите на таб Flavors.
  7. Выберите настройку, которую вы хотите настроить, затем выберите соответствующую конфигурацию подписи в раскрывающемся меню Signing Config
  8. Жмите OK

 

Соображения подписи, безопасности и удаление информации подписки из сборки APK

  1. Основные положения электронной подписи приложений
  2. Способы генерации ключей подписи и хранилища ключей
  3. Разница между хранилищами *.jks и *.keystore
  4. Ручная подписка APK
  5. Подписка APK на Google Play
  6. Соображения подписи, безопасности и удаление подписки из сборки APK
  7. Автоматизация процесса подписи на этапе сборки APK
  8. Автоматизация подписи гибридных приложений Android

Как правильно использовать сертификат подписи APK

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

  • Обновление приложения. Когда система устанавливает обновление для приложения, он сравнивает сертификаты в новой версии с версиями в существующей версии. Система разрешает обновление, если совпадают сертификаты. Если вы подписываете новую версию с другим сертификатом, вы должны назначить другое приложение для приложения в этом случае, пользователь устанавливает новую версию как совершенно новое приложение и это недопустимо, если вы не хотите потерять аудиторию пользователей вашего приложения;
  • Модульность приложений. Android позволяет APK, подписанным одним и тем же сертификатом, работать в том же процессе, если приложения запрашивают, чтобы система рассматривала их как одно приложение. Таким образом, вы можете развернуть свое приложение в модулях, и пользователи могут обновлять каждый из модулей самостоятельно;
  • Передача кода/данных через разрешения. Android обеспечивает принудительное выполнение разрешений на основе сигнатур, чтобы приложение могло раскрывать функциональность другому приложению, подписанному с указанным сертификатом. Подписывая несколько APK с тем же сертификатом и используя проверки разрешений на основе сигнатур, ваши приложения могут безопасно использовать код и данные.

Если вы планируете поддерживать обновления для приложения, убедитесь, что ключ подписи приложения имеет период действия, превышающий ожидаемый срок службы этого приложения. Рекомендуется использовать срок действия 25 лет и более. Когда срок действия ключа истекает, пользователи больше не смогут плавно обновляться до новых версий вашего приложения.

Если вы планируете публиковать свои приложения в Google Play, ключ, который вы используете для подписания этих APK, должен иметь срок действия, заканчивающийся после 22 октября 2033 года. Google Play применяет это требование, чтобы пользователи могли беспрепятственно обновлять приложения, когда доступны новые версии. Если вы используете подписку на Google Play, то Google гарантирует, что ваши приложения будут правильно подписаны и смогут получать обновления на протяжении всей своей жизни.

Безопасность ваших ключей подписи APK

Если вы решите самостоятельно управлять и подписывать ключ подписки на приложение и хранилище ключей (вместо того, чтобы использовать подписку на Google Play App), защита ключа подписи приложения имеет решающее значение как для вас, так и для пользователя. Если вы разрешаете кому-либо использовать ваш ключ или оставляете хранилище ключей и пароли в незащищенном месте, чтобы сторонние пользователи могли их найти и использовать, ваш авторский идентификатор и доверие пользователя скомпрометированы.

Примечание. Как мы до этого говорили, то вы можете управлять подписками приложения 2 способами:

  1. хранить у себя локально все ключи и подписывать самому
  2. храните ключи на сервере Google Play и подписываете там же.

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

Если третьей стороне удастся украсть ваш ключ без вашего ведома или разрешения, этот человек может подписывать и распространять приложения от вашего имени, которые могут злонамеренно изменять ваш доступ к приложениям или могут повреждать их. Такой человек может также подписывать и распространять приложения под своей личностью, которые потом атакуют другие приложения или саму систему, или повреждают или крадут пользовательские данные.

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

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

  • Выберите надежные пароли для хранилища ключей и ключа.
  • Не предоставляйте и не предоставляйте кому-либо свой секретный ключ, и не позволяйте посторонним лицам знать ваше хранилище ключей и ключевые пароли.
  • Храните файл хранилища ключей, содержащий ваш секретный ключ, в безопасном и недоступном для сторонних месте.

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

Удаление информации о подписке из файлов сборки

Когда вы создаете конфигурацию подписи(release или debug), Android Studio добавляет вашу подпись в простой текст в файлы build.gradle модуля. Если вы работаете с командой или открываете свой код, вы должны перенести эту конфиденциальную информацию из файлов сборки, чтобы она была недоступна для других. Для этого вы должны создать отдельный файл свойств для хранения защищенной информации и обратиться к этому файлу в файлах сборки следующим образом:

1). Создайте конфигурацию подписи и назначьте ее одному или нескольким типам сборки. В этих инструкциях предполагается, что вы настроили одну конфигурацию подписи для типа вашей версии выпуска, как описано в разделе «Автоматизация процесса подписи на этапе сборки APK»

2). Создайте файл с именем keystore.properties в корневом каталоге вашего проекта. Этот файл должен содержать ваши данные для подписания:

storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

3). В файле build.gradle вашего модуля добавьте код для загрузки файла keystore.properties перед блоком android {}:

...

// Create a variable called keystorePropertiesFile, and initialize it to your
// keystore.properties file, in the rootProject folder.
def keystorePropertiesFile = rootProject.file("keystore.properties")

// Initialize a new Properties() object called keystoreProperties.
def keystoreProperties = new Properties()

// Load your keystore.properties file into the keystoreProperties object.
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
    ...
}

Примечание. Вы можете сохранить файл keystore.properties в другом месте (например, в папке модуля, а не в корневой папке для проекта или на сервере сборки, если вы используете инструмент непрерывной интеграции). В этом случае вы должны изменить приведенный выше код, чтобы правильно инициализировать keystorePropertiesFile, используя ваше фактическое местоположение файла keystore.properties.

4). Вы можете ссылаться на свойства, хранящиеся в keystoreProperties, используя синтаксис keystoreProperties [‘propertyName’]. Измените блок signedConfigs файла build.gradle вашего модуля, чтобы ссылаться на информацию подписи, хранящуюся в keystoreProperties, с использованием этого синтаксиса.

android {
    signingConfigs {
        config {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }
    ...
  }

5). Откройте окно инструмента Build Variants и убедитесь, что выбран тип сборки release.

6). Нажмите Build > Build APK, чтобы создать свою сборку релизов, и подтвердите, что Android Studio создала подписанный APK в каталоге build/output/apk/ для вашего модуля.

Поскольку ваши файлы сборки больше не содержат конфиденциальной информации, теперь вы можете включить их в исходный элемент управления или загрузить их в общую кодовую базу. Обязательно сохраните файл keystore.properties. Это может включать удаление его из вашей системы управления версиями.

Ручная подписка APK

  1. Основные положения электронной подписи приложений
  2. Способы генерации ключей подписи и хранилища ключей
  3. Разница между хранилищами *.jks и *.keystore
  4. Ручная подписка APK
  5. Подписка APK на Google Play
  6. Соображения подписи, безопасности и удаление подписки из сборки APK
  7. Автоматизация процесса подписи на этапе сборки APK
  8. Автоматизация подписи гибридных приложений Android

Тут вам покажем несколько способов инструментов, при помощи которых можно подписывать приложения Android перед публикацией их в Google App Play.

Подписка APK средствами IDE Android Studio

Вы можете использовать Android Studio для ручного создания подписанных APK, по одному за раз, или для нескольких вариантов сборки сразу. Вместо того, чтобы вручную подписывать APK, вы также можете настроить свои настройки сборки Gradle для автоматической обработки подписей во время процесса сборки. В этом разделе описывается процесс ручной подписи. Подробнее о подписании приложений как части процесса сборки см. В разделе Настройка процесса сборки для автоматической подписки APK.

Чтобы вручную подписать APK для выпуска в Android Studio, выполните следующие действия:

  1. Жмем Build > Generate Signed APK и откроется окно Generate Signed APK . (Как создать ключи подписи в Android Studio мы писали в прошлой статье)
  2. В окне Generate Signed APK Wizard выберите хранилище ключей, закрытый ключ и введите пароли для обоих. (Если вы только что создали хранилище ключей в предыдущем разделе, эти поля уже будут заполнены) Затем нажмите «Next» 
  3. В следующем окне выберите пункт назначения для подписанных APK, выберите тип сборки (если применимо), выберите продукт (ы) и нажмите «Finish»

Когда процесс завершится, вы найдете свой подписанный APK в выбранной вами папке назначения. Теперь вы можете распространять подписанный APK через торговую площадку приложения, например, в Google Play Store, или использовать выбранный вами механизм распространения подписанного приложения конечным пользователям.

Чтобы пользователи могли успешно устанавливать обновления для вашего приложения, вам нужно будет подписать APK с тем же сертификатом на протяжении всего срока действия вашего приложения.

Подробнее об этом и других преимуществах подписания всех ваших приложений с помощью одного и того же ключа, по поводу безопасности и редактирования.

Есть сгенерированные ключи подписи или создаем?

Мы уже разбирали тут, как генерировать хранилище ключей с ключом подписи. Если кратко, то вы можете подписать свое приложение из командной строки с помощью инструмента apksigner или настроить Gradle для его подписки во время сборки. В любом случае вам нужно сначала сгенерировать закрытый ключ с помощью keytool. Например командой

keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias

Примечание: keytool находится в каталоге bin/ вашего JDK. Чтобы найти ваш JDK из Android Studio, выберите «File»> «Project Structure», а затем «SDK Location», и вы увидите местоположение JDK

В этом примере команды консоль еще запросит ввести пароли для хранилища ключей и ключа подписи и запросит заполнить поля Distinguished Name для вашего ключа. Затем он генерирует хранилище ключей в виде файла с именем my-release-key.jks, сохраняя его в текущем каталоге (вы можете перемещать его по своему усмотрению). Хранилище ключей содержит один ключ, действительный в течение 10 000 дней.

Теперь вы можете создать unsigned APK, т.е. построить конфигурацию release и подписать его вручную или вместо этого настроить Gradle для автоматического подписания APK.

Подписка APK средствами командной строки Android SDK

Инструмент apksigner, доступный в версии 24.0.3 и выше для Android SDK Build Tools, позволяет вам подписывать APK и подтверждать, что подпись APK будет проверена успешно на всех версиях платформы Android, поддерживаемых этими APK. В этом подразделе представлено краткое руководство по использованию инструмента и служит ссылкой для различных параметров командной строки, которые поддерживает инструмент

Примечание 1. если вы подписываете APK с помощью apksigner и вносите дальнейшие изменения в APK, подпись APK становится недействительной. Поэтому перед подписанием APK вы должны использовать такие инструменты, как zipalign.

Примечание 2. Чтобы использовать инструмент apksigner, вы должны иметь версию 24.0.3 или выше установленных инструментов Android SDK Build Tools. Вы можете обновить этот пакет с помощью диспетчера SDK.

1). Открываем командную строку и перемещаемся в корневую директорию —из Android Studio, выбираем View > Tool Windows > Terminal. Затем вызываем команду assembleRelease:

gradlew assembleRelease

Это создает APK под именем module_name-unsigned.apk в папке project_name/module_name/build/outputs/apk/. APK будет неподписанным(unsigned) и невыровненным(unaligned), который на данный момент — он не может быть установлен до тех пор, пока не будет подписан вашим секретным ключом.

2). Align the unsigned APK using zipalign:

zipalign -v -p 4 my-app-unsigned.apk my-app-unsigned-aligned.apk

zipalign гарантирует, что все несжатые данные начинаются с конкретного выравнивания байтов относительно начала файла, что может уменьшить объем оперативной памяти, потребляемой приложением.

3). Подписываем APK своим личным ключом с помощью apksigner:

apksigner sign --ks my-release-key.jks --out my-app-release.apk my-app-unsigned-aligned.apk

В этом примере выводится подписанный APK на my-app-release.apk после его подписания с закрытым ключом и сертификатом, который хранится в одном файле хранилища ключей: my-release-key.jks.

Инструмент apksigner поддерживает другие параметры подписки, включая подписание файла APK с использованием отдельного закрытого ключа и файлов сертификатов и подписку APK с использованием нескольких подписчиков. Для получения дополнительной информации см. ссылку apksigner.

4). Убеждаемся, что ваш APK подписан:

apksigner verify my-app-release.apk

Пример подписки средствами Android SDK

Если вышеописанное вызывает трудности, то давайте сделаем некоторый простой пример генерации ключа командой keytool, выполнения операции zipalign и подписи командой apksigner.

Сначала строим релиз средствами Cordova и Android SDK

cordova build --release android

Команда keytool генерации ключа в консоли:

keytool -genkey -v -keystore keys.jks -keyalg RSA -keysize 2048 -storepass passwordstore -alias eventexpress -keypass passwordkey -dname “CN=John Doe O=WebSofter C=RU” -validity 10000

Операция zipalign в консоли:

C:\Users\WebSofter\AppData\Local\Android\sdk\build-tools\26.0.2\zipalign -v -p 4 android-armv7-release-unsigned.apk android-armv7-release-unsigned-aligned.apk

Обратите внимание, что zipalign мы выполняем по прямому пути версии приложения, которая соответствует версии нашего разрабатываемого приложения.

Операция подписи apksigner:

C:\Users\WebSofter\AppData\Local\Android\sdk\build-tools\26.0.2\apksigner sign --ks C:\Users\WebSofter\Desktop\Projects\ShevcovApp\ClientApp\EventExpress\keys\keys.jks --out signed-release.apk android-armv7-release-unsigned-aligned.apk

Обратите внимание, что apksigner мы выполняем по прямому пути версии приложения и указываем путь к сгенерированному ключу, которая соответствует версии нашего разрабатываемого приложения. Далее, после нажатия Enter, консоль запросит поочередно запросить пароль от хранилища ключей и от самого ключа.

Подписка APK средствами командной строки JDK

Выше мы уже знакомились с инструментом keytool для создания хранилища ключей и самих ключей подписи в составе JDK, а в данной секции описано то, как средствами JDK подписывать этим ключом приложение и для этого есть специальный инструмент в составе JDK в той же папке, что и keytool — jarsigner.

Команда подписи с ее параметрами записывается так

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

Имена параметров нам знакомы по keytool:

  • хранилище (keystore),
  • пароль (storepass) к нему
  • пароль (keypass) к ключу.
  • А последние два параметра – это имя APK-файла, который вы хотите подписать и алиас ключа из указанного хранилища, который вы хотите использовать для подписи.

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

Другие инструменты подписи

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

  • apk-signer — простой инструмент командной строки для подписи apk
  • APK Signing Tool — этот инструмент с оконным интерфейсом позволяет вам подписать APK с вашим хранилищем ключей. Вы можете переопределить хранилище демо-версий и использовать свое собственное хранилище ключей перед загрузкой приложения в Google Play.
  • APK Signer — инструмент с оконным интерфейсом упрощает создание файла хранилища ключей.

Способы генерации ключей подписи и хранилища ключей

  1. Основные положения электронной подписи приложений
  2. Способы генерации ключей подписи и хранилища ключей
  3. Разница между хранилищами *.jks и *.keystore
  4. Ручная подписка APK
  5. Подписка APK на Google Play
  6. Соображения подписи, безопасности и удаление подписки из сборки APK
  7. Автоматизация процесса подписи на этапе сборки APK
  8. Автоматизация подписи гибридных приложений Android

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

Если вы решите управлять и защищать свой собственный ключ подписи приложения и хранилище ключей, вы подпишете свои APK с помощью своего ключа подписи приложения. Если вы решите использовать Google Play App Signing для управления и защиты своего ключа подписи и хранилища ключей, вы подпишете APK с помощью своего ключа загрузки.

Создание ключа и хранилища ключей при помощи встроенного мастера IDE Android Studio

Вы можете сгенерировать новый или загрузить существующий в встроенном мастере работы с ключами подписи Android Studio, используя следующие шаги:

  1. В панели меню нажать на Build > Generate Signed APK;
  2. Выбрать модуль из выпадающего меню и нажать Next;
  3. Нажать на Create new для создания нового ключа и хранилища ключей;
  4. В окне New Key Store предоставить информации о распространителе в лице вас, как разработчика

Keystore(Хранилище ключей)

  • Key store path: Выберите местонахождение, где было создано хранилище ключей;
  • Password: Создайте и подтвердите пароль безопасности для хранилища ваших ключей.

Key(ключ)

  • Alias: Введите идентификационное название для вашего ключа;
  • Password: Создайте и подтвердите пароль безопасности для вашего ключа. Этот пароль должен отличаться от пароля хранилища ключей в целях безопасности;
  • Validity (years): Установите длину времени в годах, в течении которого данный ключ будет валиден. Ваш ключ может иметь валидность до 25 лет. В течении этого времени у вас есть возможность выпускать обновления и подписывать приложение данным ключом и это служит жизненным циклом приложения.
  • Certificate: Введите некоторую информацию для вашего сертификата. данная информация не показывается в вашем приложении, но включается в ваш сертификат, как часть файла APK.
Создание нового хранилища ключей в Android Studio.
  • Закончив форму, нажмите «ОК».

Создание ключа и хранилища ключей при помощи консольных утилиты keytool в составе Java SDK

Для данного метода генерации ключа нам понадобится утилита keytool. Ее можно найти по адресу C:\Program Files\Java\jdk1.x.x_xxx\bin. Утилита может создавать новые ключи и показывать информацию о уже существующих ключах в файле хранилища ключей.

К примеру выясним, какие ключи есть в хранилище debug.keystore, который расположен по пути C:\Users\WebSofter\.android, используем команду list. С помощью параметров keystore и storepass укажем имя файла хранилища и пароль к хранилищу

keytool -list -keystore debug.keystore -storepass android

Замечание. Если команда keytool вызывает ошибку, что такая команда не найдена, то это значит, что путь к данной программе не добавлен в переменные среды Windows и это следует исправить.

Команда нам показывает, что в данном хранилище хранится один ключ с алиасом androiddebugkey, и создан он был 11.11.2016. Этот ключ и используется Android SDK для подписи нашего приложения, когда формируется debug — APK. Хранилище и ключ имеют одинаковый пароль — android.

Теперь создадим свой собственный ключ, которым мы могли бы подписать release — APK, т.е. unaligned — APK или иначе говоря, неподписанный релиз APK.

Для создания используется подкоманда genkey и к ней идут свои параметры

keytool -genkey -v -keystore keys.keystore -keyalg RSA -keysize 2048 -storepass spassword -alias keyname1 -keypass keypassword1 -dname “CN=John Doe O=WebSofter C=RU” -validity 10000

Параметры в данной команде имеют следующие предназначения:

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

Значение dname задается в определенном формате. В данном случае указаны только имя, организация и страна.

После того, как мы выполнили данную команду с нужными нам параметрами в папке, где выполнилась данная команда появится созданный нами хранилище ключей

Если сейчас посмотреть в это хранилище, введя пароль, который мы выше указали, то мы увидим тот ключ, который мы выше добавляли

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

keytool -genkey -keystore keys.keystore -keyalg RSA -keysize 2048 -alias keyname2 -validity 10000

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

Команду list можно еще выполнить с параметром v. Этот параметр добавляет информативности

Как можно заметить, выводится полная информация о владельце сертификата, дата создания, дата истечения срока и т.д.

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

Другие методы создания и подписи

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

  • apk-signer — простой инструмент командной строки для подписи apk
  • APK Signing Tool — этот инструмент с оконным интерфейсом позволяет вам подписать APK с вашим хранилищем ключей. Вы можете переопределить хранилище демо-версий и использовать свое собственное хранилище ключей перед загрузкой приложения в Google Play.
  • APK Signer — инструмент с оконным интерфейсом упрощает создание файла хранилища ключей.

Что дальше? Дальше — подписать APK

Продолжайте вручную подписывать APK по статье «Ручная подписка APK», если вы хотите сгенерировать APK, подписанный вашим новым ключом, нажав «Ok», или нажмите «Cancel», если вы хотите только генерировать ключ и хранилище ключей и не подписывать APK.

Если вы хотите использовать подписку на Google Play по статье «Подписка APK на Google Play», перейдите к разделу «Управление ключами подписи приложения» и следуйте инструкциям по настройке подписки на Google Play.

Основные положения электронной подписи приложений

  1. Основные положения электронной подписи приложений
  2. Способы генерации ключей подписи и хранилища ключей
  3. Разница между хранилищами *.jks и *.keystore
  4. Ручная подписка APK
  5. Подписка APK на Google Play
  6. Соображения подписи, безопасности и удаление подписки из сборки APK
  7. Автоматизация процесса подписи на этапе сборки APK
  8. Автоматизация подписи гибридных приложений Android

Android требует, чтобы все APK — приложения были подписаны с сертификатами перед их установкой. Данный пост описывает то, как происходит процесс подписания APK — файла, используя Android Studio, включая создание и хранение сертификатов, подпись различных конфигураций построений, используя различные сертификаты и настройка процесса построения для автоматизированной подписи APK.

Сертификаты и хранилища ключей

Сертификат с публичным ключом, также называемый, как электронный сертификат или идентификационный сертификат, содержит публичный ключ в паре публичный/приватный ключи, а также некоторые другие матаданные, идентифицирующие владельца ключей (к примеру, имя и место). Собственник сертификата держит при себе соответствующий публичному сертификату приватный ключ.

Когда файл APK подписывается, то инструмент подписи прикрепляет сертификат публичного ключа к приложению с расширением APK. Сертификат публичного ключа обслуживается также, как и отпечаток пальца(«fingerprint» ), который уникально ассоциируется с распространяемым приложением APK и с соответствующему приватному ключу владельца APK. Это помогает Android гарантировать, что будущие обновления приложения с форматом APK можно будет аутентифицировать(владелец может авторизироваться к учетной записи Google Play) и что все изменения приложения придут от оригинального автора, который это приложение разработал. Ключ, используемый для создания сертификата называется ключом подписи приложения.

Хранилище ключей или так называемый keystore — это бинарный файл. который содержит один или нескольких приватных ключей.

Таким образом, каждое приложение должно использовать некоторый сертификат в течении его жизненного цикла, давая иметь возможность сторонним пользователям устанавливать новые версии и обновления в приложении. Для получения дополнительной информации о преимуществах использования одного и того же сертификата для всех ваших приложений на протяжении всей их жизни см. Ниже раздел «Требования к подписи».

 

Подписка отладочной сборки APK (debug build APK)

Когда проект запускается в режиме отладки, то среда Android Studio или Cordova автоматически подписывает наш файл APK с debug — сертификатом, который генерируется инструментами Android SDK. В первый раз, когда запускается проектируемое приложение в режиме debug в Android Studio или через консоль Cordova, то Android SDK автоматически создает хранилище debug — ключей и в него сертификаты ключей, задав им свои пароли. Данное хранилище расположено по пути $HOME/.android/debug.keystore.

Из-за того, что debug — сертификаты созданы инструментами построения и они небезопасны для проектирования полноценного приложения, то большинство магазинов приложений, включая и Google Play не принимают APK — файлы, подписанные с debug — сертификатом для публикации.

Android Studio и Cordova автоматически сохраняет вашу информацию debug — подписки в конфигурации подписки приложения, поэтому вам не нужно вводить его каждый раз, когда вы отлаживаете приложение. Конфигурация подписки — это объект, содержащий всю необходимую информацию для подписания APK, включая путь к хранилищу ключей, пароль к хранилищу ключей, имя ключа и пароль к ключу. Вы не можете напрямую редактировать конфигурацию debug — подписки, но вы можете конфигурировать то, как вы смогли бы подписывать релиз(release) — построение.

Release — конфигурация, при котором приложение не подписывается по умолчанию после построения. APK, полученное в процессе данной конфигурации необходимо настроить на подпись сертификатом подписи, который мы создаем, как распространитель приложения. Debug — это конфигурация, которая подписывается по умолчанию debug-сертификатом автоматически в процессе построения и отладки, поэтому, вы могли бы заметить, что приложение построенное в конфигурации debug при прошествии некоторого времени перестает работать, хотя, вы его год или два назад построили — это все дело подписки. Время debug — подписки ограничено временем разработки и отладки приложения и это время может быть разным у каждого SDK.

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

Истечение срока действия отладочного сертификата

Ваш собственный сертификат используется для подписи вашего же APK и для него можно индивидуально установить время истечения срока жизненного цикла приложения, после чего приложения нельзя будет устанавливать на мобильные устройства, а вот что касается сертификата debug, то его дата истечения около 365 дней с даты его сборки. Когда дата данного сертификата истекает, то выбрасывается ошибка построения приложения.

Для того, чтобы решить проблему истечения времени debug — сертификата просто нужно удалить файл debug.keystore, который расположен по пути:

  • ~/.android/ на OS X и Linux
  • C:\Documents and Settings\<user>\.android\ на Windows XP
  • C:\Users\<user>\.android\ на Windows Vista и Windows 7, 8, и 10

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

Управление вашими ключами подписки

Поскольку ваш ключ подписи приложения используется для проверки вашей личности как разработчика и для обеспечения бесперебойных и безопасных обновлений для ваших пользователей, управление вашим ключом и обеспечение его безопасности очень важны как для вас, так и для ваших пользователей. Вы можете выбрать либо использовать приложение Google Play App Signing для безопасного управления и хранения ключа подписи приложения с помощью инфраструктуры Google, либо управлять и защищать собственное хранилище ключей и ключей подписи приложений.

Использование подписи Google Play App для добавления и обновления приложений APK

При использовании Google Play Signing вы будете иметь 2 ключа: ключ подписи приложения(app signing key) и ключ выгрузки(upload key). Google управляет и защищает ключи подписи приложения у себя на сервере и держит при себе ключ выгрузки и использует его для авторизации разработчика в сервисе Google Play Store для выгрузки приложения.

Когда вы выбираете подписку на Google Play, вы экспортируете и шифруете ключ подписи приложения, используя инструмент «Зашифровать секретный ключ», предоставляемый Google Play, а затем загружайте его в инфраструктуру Google. Затем вы создаете отдельный ключ для загрузки и регистрируете его в Google. Когда вы будете готовы к публикации, вы подписываете свое приложение с помощью загружаемого ключа и загружаете его в Google Play. Затем Google использует сертификат загрузки, чтобы подтвердить вашу личность, и повторно подписывает APK с вашим ключом подписи приложения для распространения, как показано ниже на рисунке . (Если у вас еще нет ключа подписи приложения, вы можете сгенерировать его во время процесса подписывания).

Подписание приложения с подпиской на Google Play
Подписание приложения с подпиской на Google Play

При использовании подписи Google Play App, если вы потеряете свой ключ загрузки или если он взломан, вы можете связаться с Google, чтобы аннулировать старый загрузочный ключ и создать новый. Поскольку ключ для подписки на приложение защищен Google, вы можете продолжать загружать новые версии своего приложения в качестве обновлений исходного приложения, даже если вы меняете ключи загрузки.

Дополнительные сведения о том, как выбрать приложение для входа в Google Play, см. В разделе Управление ключами подписи приложения.

Управление своим собственным хранилищем ключей

Вместо использования Google App Signing вы можете использовать и управлять собственными подписываемыми ключами и хранилищем ключей. Если вы выбираете управление собственными подписываемыми ключами и хранилищем ключей, то вы сами отвечаете за безопасность ключей и хранилищем ключей. Вы должны выбрать строгий пароль для вашего хранилища ключей и разделить строгий пароль для каждого приватного ключа, хранящегося в хранилище ключей. Вы должны держать хранилище ваших ключей в закрытом и безопасном месте. Если вы потеряете доступ к вашим подписываемым ключам, то ваши ключи будут скомпрометированы и Google не сможет вернуть вам ключи подписки приложения и у вас потеряется возможность выпускать новые обновления для оригинального приложения и придется распространять приложение уже под другим идентификатором и названием. Больше об этом можете почитать в разделе «Безопасность ваших ключей».

Если вы сами управляете собственными ключами подписки приложения и хранилищем ключей, когда вы подписываете ваш APK, то вы должны подписать его локально на вашем ПК, используя ваши ключи подписки приложений и загрузить подписанный APK прямо в Google Play Store для распространения сторонним пользователям, как показано на картинке

Подписание приложения при управлении собственным ключом подписи приложения
Подписание приложения при управлении собственным ключом подписи приложения

 

 

При составлении данной статьи использовался официальный ресурс Android Studio по ссылке.