Доброго времени суток, уважаемый читатель. В этой статье я расскажу про свой опыт работы с HMS, как настроить In-App Purchases, Huawei ID (Account Kit) и Crash.
Эта статья является одной из цикла статей про публикацию приложения в AppGallery:
- Тонкости настройки 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
Не забудьте подключить там же все необходимые 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 файл и загрузить его для вашего хранилища ключей. После этого вверху "Сертификат подписи приложения" появится отпечаток, который и нужно добавить на странице редактирования Проекта.
Заключение
Опять огромная статья получилась, но постарался всё как можно подробнее описать, если что-то непонятно или столкнулись с проблемами — спрашивайте, постараюсь помочь и ответить.
В последней статье из этого цикла расскажу об особенностях публикации приложения, преимущественно больше всего проблем было при публикации для региона Китай, а он меня больше всего и интересовал в этом магазине.
Ставьте лайки, если статья понравилась и помогла, подписывайтесь на блог и группу Вконтакте, чтобы быть в курсе всех новостей и пишите ваши комментарии, не стесняйтесь.