Найти тему
IT-предприниматель

Тонкости настройки Huawei Mobile Services (AppGallery)

Оглавление

Доброго времени суток, уважаемый читатель. В этой статье я расскажу про свой опыт работы с HMS, как настроить In-App Purchases, Huawei ID (Account Kit) и Crash.

HMS
HMS

Эта статья является одной из цикла статей про публикацию приложения в AppGallery:

  1. Тонкости настройки Huawei Mobile Services (AppGallery)

Зависимости Gradle

В этом разделе я сначала опишу то, каким образом я разделил проект на несколько вариантов, чтобы можно было без труда переключаться между вариантом для Google Play и для AppGallery, аналогично можно добавить и другие варианты, например для Amazon Store. Во второй части — выжимка из инструкции от самой huawei (советую сначала изучить инструкцию).

Разделяй и властвуй - flavors и как я их использовал

Flavors - механизм Gradle, позволяющий создавать несколько вариантов программы. Чаще всего в Android используется, чтобы создать ограниченную/полноценную версии или разделить для разных версий API. Добавляем в раздел android {} файла конфигурации на уровне модуля:

flavorDimensions "store"
productFlavors {
amazon {
versionCode 1
versionName
"1"
}
google {
}
appGalleryKnr {
applicationIdSuffix ".knr"
versionNameSuffix "-appg_knr"
resValue "string", "appGallery_publicKey", ""
versionCode 1
versionName
"1.0"
minSdkVersion 19
}
appGalleryRussia {
applicationIdSuffix ".russia"
versionNameSuffix "-appg_russia"
resValue "string", "appGallery_publicKey", ""
versionCode 1
versionName
"1.0"
minSdkVersion 19
}
appGalleryEurope {
applicationIdSuffix ".europe"
versionNameSuffix "-appg_europe"
resValue "string", "appGallery_publicKey", ""
versionCode 1
versionName
"1.0"
minSdkVersion 19
}
}

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

Для каждого региона AppGallery я создал свой flavor. Выделить можно то, что при помощи flavors можно отдельно вести учет versionCode, versionName. Также для каждого региона к applicationId я добавляю соответствующий суффикс, чтобы не путаться. И отдельно стоит сказать о строчке

resValue "string", "appGallery_publicKey", ""

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

Также прописываем строки, которые укажут Gradle, что файлы java классов будут лежать в определённой директории (чтобы не дублировать файлы классов для каждого из регионов, отличаться будет только используемый публичный ключ):

sourceSets{
appGalleryKnr {
java.srcDirs = ['src/appGallery/java']
}
appGalleryRussia {
java.srcDirs = ['src/appGallery/java']
}
appGalleryEurope {
java.srcDirs = ['src/appGallery/java']
}
}

Инструкция по подключению HMS Core

В файл Gradle проекта добавляем строки для того, где искать библиотеки, которые нам нужно будет подключать в блок repositories:

maven {url 'http://developer.huawei.com/repo/'}

и в блок dependencies:

classpath 'com.huawei.agconnect:agcp:1.3.2.301'
Пример
Пример

Дальше перемешаемся в Gradle файл модуля и добавляем плагин и зависимости нужные. Я буду рассматривать свой вариант, я сделал так, чтобы плагин подключался только когда выбраны flavor AppGallery и зависимости подгружались только для версий AppGallery, но вы можете и не разделять, если не стремитесь уменьшить объем APK.

За место просто строки

apply plugin: 'com.huawei.agconnect'

я проверяю, есть ли в названии flavor текст "appgallery" (appGalleryRussia например) и только тогда подключаю:

if (getGradle().getStartParameter().getTaskRequests()
.toString().toLowerCase().contains(
"appgallery")){
apply
plugin: 'com.huawei.agconnect'
}

Аналогично и для версии Google Play, иначе во время сборки будут вылезать ошибки, что не найден какой-то код или файл конфигураций.

Вопрос с зависимостями решают следующим образом, объявляю именной массив со всеми зависимостями AppGallery, что мне потребуются перед разделом dependencies:

def depForAppGallery = [
core : 'com.huawei.agconnect:agconnect-core:1.4.0.300',
iap : 'com.huawei.hms:iap:5.0.1.300',
hwid : 'com.huawei.hms:hwid:5.0.1.301',
crash : 'com.huawei.agconnect:agconnect-crash:1.4.1.300',
game : 'com.huawei.hms:game:5.0.1.302',
hanalytics : 'com.huawei.hms:hianalytics:5.0.3.300'
]

А потом в разделе dependencies, используя уже стандартные инструменты flavors объявляю зависимости только для нужных вариантов сборки:

dependencies {
...
appGalleryEuropeImplementation(depForAppGallery.values())
appGalleryRussiaImplementation(depForAppGallery.values())
appGalleryKnrImplementation(depForAppGallery.values())
}

Таким образом зависимости будут подтягиваться только для flavor, которые предназначены для AppGallery.

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

Как и в случае с Google Play и их сервисами в AppGallery есть файл конфигурация для каждого проекта будет отдельный, используя flavors можно легко их разделить. В папке src вашего проекта создаем папки с названиями flavors в моём случае это

  • src/appGalleryEurope/
  • src/appGalleryKnr/
  • src/appGalleryRussia/

И если не забыли, мы объединили java код вариантов для AppGallery в одну папку, создаем ещё такую структуру папок src/appGallery/java/.

Соответственно для создания классов java для версии Google создаётся ещё src/google/java/,это есть в инструкции от Google про flavors.

Файлы конфигурации находятся в разделе Мои проекты консоли разработчика huawei, если выбрать конкретный проект, нужен файл agconnect-services.json его и закидываем в папки для flavors

agconnect-services.json
agconnect-services.json

Не забудьте подключить там же все необходимые SDK, в том числе перейти на вкладку In-App Purchases и включить его. В случае если вы подключаете новые SDK или меняете данные проекта/приложения бывает необходимо обновить этот файл.

Структура java классов - пару слов

На предыдущем шаге я рассказал о созданий папок для java-классов. Так как я не подключаю в варианте для AppGallery библиотеки Google Play и наоборот, то может возникнуть ситуация, когда какие-то классы будут не найдены, поэтому их нужно выделять в отдельные папки конкретных flavor.

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

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

Подпись приложения, чтобы сервисы работали как надо

При публикации приложения вы можете столкнуться с проблемами при подключении к сервисам Huawei или даже при отладке, если не добавили в проект "Отпечаток сертификата SHA-256", делается это на странице проекта, там же где скачивается файл конфигураций:

Отпечатки сертификатов
Отпечатки сертификатов

Процедура получения этих отпечатков стандартная, один я получил для своего .jks файла, которым подписываю приложение при помощи команды:

keytool -list -v -keystore E:\example.jks

Keytool — утилита для работы с ключами находится в папке с Java (пример G:\Program Files 86\Java\jre1.8.0_101\bin)

Если вы планируете загружать Android App Bundle за место обычных apk, то вам нужна вторая подпись. Для этого перейдите в раздел "Мои приложения", здесь выберите нужное приложение, перейдите во вкладку "Службы - Подпись приложения". Здесь вам нужно выбрать один из вариантов, который вам наиболее подходит, я выбираю тот, где нужно создать .pem файл и загрузить его для вашего хранилища ключей. После этого вверху "Сертификат подписи приложения" появится отпечаток, который и нужно добавить на странице редактирования Проекта.

Заключение

Опять огромная статья получилась, но постарался всё как можно подробнее описать, если что-то непонятно или столкнулись с проблемами — спрашивайте, постараюсь помочь и ответить.

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

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