{"id":385784,"date":"2024-06-29T06:19:01","date_gmt":"2024-06-29T06:19:01","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=385784"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=385784","title":{"rendered":"<span>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 Android \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 Google Play \u0438 Huawei AppGallery \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043e\u0442 \u0410 \u0434\u043e \u042f<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u043b\u0438\u0437\u043e\u0432 Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 <strong>Google Play<\/strong> \u0438 <strong>Huawei AppStore<\/strong> (\u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0431\u0435\u0437 RuStore). \u0412\u044b \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u0431\u0443\u0434\u0435\u0442\u0435 \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, \u044d\u043a\u043e\u043d\u043e\u043c\u044f \u0441\u043e\u0442\u043d\u0438 \u0447\u0430\u0441\u043e\u0432 \u0432 \u0433\u043e\u0434.<\/p>\n<h2>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h2>\n<ul>\n<li>\n<p><a href=\"#structure\" rel=\"noopener noreferrer nofollow\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 Gradle\u2011\u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#aab-apk\" rel=\"noopener noreferrer nofollow\">Android App Bundles (AAB) vs Android Packages (APK)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#versions\" rel=\"noopener noreferrer nofollow\">\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0432\u0435\u0440\u0441\u0438\u0439<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#gplay-credentials\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043e\u0442\u00a0Google Play<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#gplay-upload\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0431\u043e\u0440\u043e\u043a \u0432\u00a0Google Play<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#gplay-metadata\" rel=\"noopener noreferrer nofollow\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 Google Play<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#appgallery-credentials\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043e\u0442\u00a0Huawei AppGallery<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#appgallery-upload\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0431\u043e\u0440\u043e\u043a \u0438 release notes \u0432\u00a0Huawei AppGallery<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#ci-cd\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 CI\/CD<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#conclusion\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 Gradle-\u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h2>\n<p><a class=\"anchor\" name=\"structure\" id=\"structure\"><\/a><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0432\u0435\u0434\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432 \u0441\u0430\u043c\u043e\u043c Android \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0412<code>build.gradle<\/code> \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0438\u0437 flavors <code>x<\/code> buildTypes:<\/p>\n<pre><code class=\"scala\">  android {   \/\/ &lt;REDACTED>    flavorDimensions 'default'    productFlavors {     google {       dimension \"default\"       versionName = android.defaultConfig.versionName + '-Google'     }      huawei {       dimension \"default\"       versionName = android.defaultConfig.versionName + '-Huawei'     }   }    \/\/ &lt;REDACTED>    buildTypes {     debug {       applicationIdSuffix '.debug'       versionNameSuffix '-debug'       signingConfig signingConfigs.debug       \/\/ &lt;REDACTED>     }     beta {       applicationIdSuffix '.beta'       versionNameSuffix '-beta'       signingConfig signingConfigs.release       \/\/ &lt;REDACTED>     }     release {       signingConfig signingConfigs.release       minifyEnabled true       shrinkResources true       \/\/ &lt;REDACTED>     } }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0434\u0430\u0435\u0442 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e \u0438\u0437 GoogleDebug, GoogleBeta, GoogleRelease, HuaweiDebug, \u0438 \u0442.\u0434. \u0412 \u0446\u0435\u043b\u043e\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e stores \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430, \u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0442\u0430\u043a\u0438\u043c \u043a\u0430\u043a in-app. \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0439\u0442\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0432\u0430\u0448\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439. <\/p>\n<p><strong>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/organicmaps\/organicmaps\/blob\/master\/android\/build.gradle\" rel=\"noopener noreferrer nofollow\">build.gradle<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developer.android.com\/build\/build-variants\" rel=\"noopener noreferrer nofollow\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 build variants<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>Android App Bundles (AAB) vs Android Packages (APK)<\/h2>\n<p><a class=\"anchor\" name=\"aab-apk\" id=\"aab-apk\"><\/a><\/p>\n<p>\u0421 \u0441\u0430\u043c\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0437\u0430\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f Android \u0432\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u043b\u0438\u0441\u044c \u0432 \u0432\u0438\u0434\u0435 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 <code>.apk<\/code> \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f ZIP \u0430\u0440\u0445\u0438\u0432\u044b \u0441 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u043f\u043e\u0434 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 API-levels. \u0412\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0435 \u0441\u0432\u043e\u0439 \u043a\u043e\u0434 \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u0430\u0440\u0445\u0438\u0432, \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 \u0435\u0433\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043e\u0439. \u0410 \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c \u0445\u043e\u0442\u044c \u0447\u0435\u0440\u0435\u0437 Google Play, \u0445\u043e\u0442\u044c \u0447\u0435\u0440\u0435\u0437 RuStore, \u0445\u043e\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c. <\/p>\n<p>\u0421\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u0432 2021 \u0433\u043e\u0434\u0443. Google \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 Google Play \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 API-level \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0418 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0437\u0430\u0447\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>armeabi-v7a<\/code> \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 <code>arm64-v8a<\/code>? \u0417\u0430\u0447\u0435\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0441 API level = 31 \u043d\u0443\u0436\u043d\u044b compatibility \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f API level = 21? \u0417\u0430\u0447\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 30 \u044f\u0437\u044b\u043a\u0430\u0445, \u0435\u0441\u043b\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d? \u0412 \u0446\u0435\u043b\u043e\u043c \u0438\u0434\u0435\u044f \u043d\u0435\u043f\u043b\u043e\u0445\u0430\u044f, \u043d\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, Google \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 <a href=\"https:\/\/developer.android.com\/guide\/app-bundle\" rel=\"noopener noreferrer nofollow\">Android App Bundles<\/a> (<code>.aab<\/code>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e <code>.apk<\/code> \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 \u0441\u0432\u043e\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c. \u041e\u0434\u043d\u0430\u043a\u043e, <code>.aab<\/code> \u0444\u0430\u0439\u043b\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. Google Play \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0438\u0437 .aab \u0444\u0430\u0439\u043b\u0430 .apk \u0444\u0430\u0439\u043b \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u0434\u0435\u0432\u0430\u0439\u0441. \u0412\u043c\u0435\u0441\u0442\u043e, \u0443\u0441\u043b\u043e\u0432\u043d\u043e, 50 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 <code>.apk<\/code> \u0444\u0430\u0439\u043b\u0430 \u0432\u044b \u043a\u0430\u0447\u0430\u0435\u0442\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 20 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u0442\u0430\u0440\u0433\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e <code>.apk<\/code> \u0444\u0430\u0439\u043b\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434 \u0432\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. Profit!<\/p>\n<p><strong>\u0412\u0430\u0436\u043d\u043e!<\/strong> \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <a href=\"https:\/\/developer.android.com\/guide\/app-bundle\" rel=\"noopener noreferrer nofollow\">Android App Bundles<\/a>, \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044c APK \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 Google (\u0438, \u0442\u0435\u043f\u0435\u0440\u044c \u0438 Huawei). <u>\u041a\u0430\u0436\u0434\u044b\u0439 app store \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0432\u043e\u0438 \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0438<\/u>. Google &#8212; \u0441\u0432\u043e\u0438, Huawei &#8212; \u0441\u0432\u043e\u0438. Android \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c, \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0431\u0435\u0437 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043c\u0435\u0441\u0442\u0438 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442 bundle \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0437 Google Play, \u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 Huawei. <\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 APK \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041e\u0434\u043d\u0430\u043a\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 2021 \u0443 \u0432\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u0432\u0441\u0435 <strong>\u043d\u043e\u0432\u044b\u0435<\/strong> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <a href=\"https:\/\/developer.android.com\/guide\/app-bundle\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u0434\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c<\/a> \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <code>.aab<\/code>, \u043e\u0442\u0434\u0430\u0432\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 Google Play. \u0422\u0435\u043f\u0435\u0440\u044c \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u0438\u0442\u044c \u043d\u0430 \u0432\u0441\u0435 \u044d\u0442\u0438 split APK, \u0430 \u0442\u0430\u043a\u0436\u0435 APK expansion files \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043a\u043e\u0441\u0442\u044b\u043b\u0438. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043a\u0430\u0447\u0430\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u043d\u043e\u0439 EDGE^W5G \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442. \u0411\u043e\u043b\u044c\u0448\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435! \u0418, \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0441 Google Play \u043d\u0430 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. <a href=\"https:\/\/youtu.be\/heRbyUAuyKo?t=43\" rel=\"noopener noreferrer nofollow\">Win-win-win.<\/a><\/p>\n<p><strong>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/developer.android.com\/guide\/app-bundle\" rel=\"noopener noreferrer nofollow\">Android App Bundles<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0432\u0435\u0440\u0441\u0438\u0439<\/h2>\n<p><a class=\"anchor\" name=\"versions\" id=\"versions\"><\/a><\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0432\u0430\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 continuous deployment \u0445\u043e\u0442\u044c \u0434\u043b\u044f \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0445\u043e\u0442\u044c \u0434\u043b\u044f package software &#8212; \u044d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f <strong>\u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e<\/strong> \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0435\u0440\u0441\u0438\u0439. \u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435: \u0434\u043b\u044f <strong>\u043a\u0430\u0436\u0434\u043e\u0433\u043e <\/strong>git commit<strong> <\/strong>\u0432 \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438. \u041f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u044c\u0442\u0435 \u0443\u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c &#171;bump versions&#187;  (1.0.2 -> 1.0.3 -> 1.0.4 \u0438 \u0442.\u0434.) \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u041d\u0443\u0436\u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0433\u0434\u0435 \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438 (\u0445\u043e\u0442\u044f \u0431\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0435\u0433\u043e .patch-level \u0447\u0430\u0441\u0442\u044c) \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. <\/p>\n<p>\u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u043d\u0435\u043f\u043b\u043e\u0445\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0440\u0430\u0437 \u0438 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e. <\/p>\n<h4>\u041f\u043e\u0434\u0445\u043e\u0434 1. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 git describe<\/h4>\n<p>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c Android (\u0438 Google Play \u0438 AppGallery \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e) \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e downgrade \u0432\u0435\u0440\u0441\u0438\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d. \u041a\u043e\u0434 \u043d\u043e\u043c\u0435\u0440\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0442\u044c. \u041d\u043e \u0432\u0435\u0434\u044c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0441\u0442\u0451\u0442 git \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0438, \u0435\u0441\u043b\u0438 \u0436\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u044b \u043d\u0435 \u0445\u0443\u043b\u0438\u0433\u0430\u043d\u0438\u0442\u0435 \u0441 rewrite \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0438 force-pushes. <\/p>\n<p>\u041a\u0440\u0430\u0439\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e git commit \u0432 \u0432\u0435\u0442\u043a\u0435 \u0434\u043b\u044f \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u0438. \u041c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e \u0432\u044b \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u0435 annotated tag  \u0432\u0438\u0434\u0430 <code>v$major.$minor<\/code> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, v1.0, v2.0), \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0442\u0440\u0435\u0442\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 (patch) \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0447\u0438\u0441\u043b\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0442\u0435\u0433\u0430. <\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>git describe --long<\/code>:<\/p>\n<pre><code>> git tag -a v1.0 -m \"New minor release\" > git describe --long v1.0-0-gbc2d1a8  > touch test2.txt > git add . > git commit -m \"Add some changes\" > git describe --long v1.0-1-gaa7263d ...  > touch test3.txt > git add . > git commit -m \"Add some more changes\" > git describe --long v1.0-2-g6a48c84<\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0430\u0435\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435 semver v1.0.0, v1.0.1, v1.0.2 \u0438 \u0442.\u0434, \u0433\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0446\u0438\u0444\u0440\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 (patch) \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0430 major.minor \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0430\u043c\u0438. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e git commit \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438. \u041d\u0430\u0439\u0442\u0438 git \u043a\u043e\u043c\u043c\u0438\u0442 \u043f\u043e \u0442\u0435\u0433\u0443 \u0438 \u0447\u0438\u0441\u043b\u0443 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u043e\u0442 \u043d\u0435\u0433\u043e \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u043c. \u041f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u043e.<\/p>\n<h4>\u041f\u043e\u0434\u0445\u043e\u0434 2. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u0442\u044b<\/h4>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u0442\u044b git \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0435\u0440\u0441\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 2023.04.23-2. \u0410 \u043a\u0430\u043a \u0436\u0435 semver, \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u0435 \u0432\u044b? \u041d\u0443 \u0430 \u0432\u043e\u0442 \u0430 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u0432\u0430\u043c \u0432 \u043c\u0438\u0440\u0435 Android \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0438\u0434\u0435\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u0437 Google Play \u0438 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0437\u0430\u0434 \u0438\u043b\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439? \u041c\u043e\u0436\u0435\u0442\u0435 \u0436\u0430\u0440\u043a\u043e \u043f\u043e\u0441\u043f\u043e\u0440\u0438\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p>\u0412 git \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0434\u0430\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><strong>Author Date<\/strong> &#8212; \u0442\u043e, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043b \u0430\u0432\u0442\u043e\u0440  \u0438 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0438\u0434\u0435\u0442\u044c \u0432 git log \u0438 git show. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043c\u0435\u0440\u0436\u0438\u0442\u0435 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c PR \u0433\u043e\u0434\u043e\u0432\u0430\u043b\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438. <\/p>\n<\/li>\n<li>\n<p><strong>Commit Date<\/strong> &#8212; \u0434\u0430\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043c\u043c\u0438\u0442 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u0431\u0440\u0430\u043d\u0447. \u041e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 merge \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u0432 \u0431\u0440\u0430\u043d\u0447. \u0412\u0440\u0435\u043c\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0434\u0435\u0442 \u0432\u043f\u0435\u0440\u0435\u0434 \u0438 Commit Date \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0436\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u0442\u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0432\u0430\u0448\u0438\u0445 \u0447\u0430\u0441\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Commit Date, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>%cd<\/code> \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u043d\u0433 \u0432 git log:<\/p>\n<pre><code>TZ=UTC0 git log --max-count=128 --pretty=format:%cd --date=iso-local<\/code><\/pre>\n<blockquote>\n<p>2023-04-23 10:37:01 +0000<br \/>2023-04-23 09:02:18 +0000<br \/>2023-04-19 14:43:21 +0000<br \/>2023-04-19 14:43:21 +0000<br \/>2023-04-19 01:39:03 +0000<\/p>\n<p>&lt;REDACTED><\/p>\n<\/blockquote>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0434\u0430\u0442\u044b \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0435\u0441\u043b\u0438 \u0436\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0435\u0431\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c \u0432 \u0434\u0435\u043d\u044c. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043d\u044f. \u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 2023.04.23-1, 2023.04.23-3, 2023.04.23-4 \u0438 \u0442.\u0434. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0446\u0438\u0444\u0440\u044b \u0447\u0430\u0441 x 60 + \u043c\u0438\u043d\u0443\u0442\u044b \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0430\u0441 (up to you). \u041d\u043e \u043d\u0430\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0447\u0438\u0441\u043b\u043e\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043d\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u043c. <\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435, \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e \u043d\u0430\u0434\u043e \u0437\u0430\u043f\u0438\u0445\u0430\u0442\u044c \u0432 \u0442.\u043d. <code>versionCode<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 <a href=\"https:\/\/developer.android.com\/studio\/publish\/versioning\" rel=\"noopener noreferrer nofollow\">\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d<\/a> \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u043c  0 &#8212; 2_100_000_000 (\u0447\u0443\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 31 \u0431\u0438\u0442\u0430). Version Code &#8212; \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0441 \u0447\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 Android \u0438 stores \u0434\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a Version Name \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0433\u0434\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u0441\u0451, \u0447\u0442\u043e \u0432\u044b \u043f\u043e\u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e.<\/p>\n<p> \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0432 Gradle (\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438):<\/p>\n<pre><code class=\"scala\">def getVersion() {   def time = Integer.parseInt(run(['git', 'log', '-1', '--format=%ct']).trim())   def cal = Calendar.getInstance(TimeZone.getTimeZone(\"UTC\"), Locale.ENGLISH)   cal.setTimeInMillis((long) time * 1000)   def year = cal.get(Calendar.YEAR)   def month = cal.get(Calendar.MONTH) + 1   def day = cal.get(Calendar.DAY_OF_MONTH)   def date_of_last_commit = String.format(\"%04d-%02d-%02d\", year, month, day)   def build = Integer.parseInt(run(['git', 'rev-list', '--count', '--after=\"' + date_of_last_commit + 'T00:00:00Z\"', 'HEAD']).trim())    \/\/ Use the last git commit date to generate the version code:   \/\/ RR_yy_MM_dd_CC   \/\/ - RR - reserved to identify special markets, max value is 21.   \/\/ - yy - year   \/\/ - MM - month   \/\/ - dd - day   \/\/ - CC - the number of commits from the current day   \/\/ 21_00_00_00_00 is the the greatest value Google Play allows for versionCode.   \/\/ See https:\/\/developer.android.com\/studio\/publish\/versioning for details.   def versionCode = (year - 2000) * 1_00_00_00 + month * 1_00_00 + day * 1_00 + build    \/\/ Use the current date to generate the version name:   \/\/ 2021.04.11-12-Google (-Google added by flavor)   def versionName = String.format(\"%04d.%02d.%02d-%d\", year, month, day, build)    return new Tuple2(versionCode, versionName)  }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0435 <code>versionCode<\/code> \u0438 <code>versionName<\/code> \u0438\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 <code>getVersion()<\/code>: <\/p>\n<pre><code class=\"scala\">android {   \/\/ &lt;REDACTED>   defaultConfig {     def ver = getVersion()     versionCode = ver.V1     versionName = ver.V2     println('Version: ' + versionName)     println('VersionCode: ' + versionCode)     \/\/ &lt;REDACTED>   }   \/\/ &lt;REDACTED> }<\/code><\/pre>\n<p>\u041c\u043e\u0436\u0435\u0442\u0435 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a gradle \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e git \u043a\u043e\u043c\u043c\u0438\u0442\u0430. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0438 \u0432\u044b \u043d\u0435 \u0434\u0443\u043c\u0430\u0435\u0442\u0435 \u043f\u0440\u043e \u044d\u0442\u043e.<\/p>\n<h2>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043e\u0442 Google Play<\/h2>\n<p><a class=\"anchor\" name=\"gplay-credentials\" id=\"gplay-credentials\"><\/a><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u0432 Google Play \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e, \u043d\u0430\u0434\u043e \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432 API. \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e Google Play \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043b\u043e\u0442\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0441 IAM Google Cloud \u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 Service Account \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>.json<\/code> \u0444\u0430\u0439\u043b \u0441 credentials. \u041d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443.<\/p>\n<h4>\u0428\u0430\u0433 1. \u0421\u0432\u044f\u0437\u044c Google Play Developer account Google Cloud project<\/h4>\n<p>\u0412\u0440\u043e\u0434\u0435 \u043a\u0430\u043a \u043d\u043e\u0432\u044b\u0435  Google Play Developer Accounts \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441 Google Cloud \u043a\u0430\u043a-\u0442\u043e \u043f\u043e\u043b\u0443\u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 Firebase. <\/p>\n<p>\u0418\u0434\u0435\u0442\u0435 \u0432 Google Play Console -> Setup -> API Access. \u0415\u0441\u043b\u0438 Linked Project \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0442\u043e \u0443 \u0432\u0430\u0441 \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0432 <a href=\"https:\/\/console.cloud.google.com\/\" rel=\"noopener noreferrer nofollow\">Google Cloud Console<\/a> \u043a\u0430\u043a\u0438\u0435 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0438, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043d\u043e\u0432\u044b\u0439. Firebase \u043d\u0435\u044f\u0432\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 Google Cloud \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0436\u0435. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/43d\/5d0\/07b\/43d5d007b0f670fd8ec0723bf73fcadc.png\" alt=\"\u0421\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 Google Play Console \u0438 Google Cloud Console (\u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0443\u0442\u0430\u0439\u0442\u0435)\" title=\"\u0421\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 Google Play Console \u0438 Google Cloud Console (\u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0443\u0442\u0430\u0439\u0442\u0435)\" width=\"2482\" height=\"1578\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/43d\/5d0\/07b\/43d5d007b0f670fd8ec0723bf73fcadc.png\"\/><\/p>\n<div><figcaption>\u0421\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 Google Play Console \u0438 Google Cloud Console (\u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0443\u0442\u0430\u0439\u0442\u0435)<\/figcaption><\/div>\n<\/figure>\n<h4>\u0428\u0430\u0433 2. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Google Service Account<\/h4>\n<p>Service Account \u044d\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f &#171;\u0440\u043e\u0431\u043e\u0442\u043e\u0432&#187;, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u0435\u0442 credentials \u0438 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u0440\u043e\u043b\u0438 \u0438 \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c robot Service Account, \u0430 \u043d\u0435 \u0441\u0432\u043e\u0439 human Google Account.<\/p>\n<p>\u041a\u043b\u0438\u043a\u0430\u0439\u0442\u0435 \u043d\u0430 &#171;View in Google Cloud Platform&#187; \u0438\u043b\u0438 \u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u0432 <a rel=\"noopener noreferrer nofollow\">Google Cloud Console<\/a> \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u043d\u0443\u0436\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b &#171;<a href=\"https:\/\/console.cloud.google.com\/iam-admin\/serviceaccounts\" rel=\"noopener noreferrer nofollow\">Service Accounts<\/a>&#171;. \u041a\u043b\u0438\u043a\u0430\u0439\u0442\u0435 <a href=\"https:\/\/console.cloud.google.com\/iam-admin\/serviceaccounts\/create\" rel=\"noopener noreferrer nofollow\">&#171;Create Service Account&#187;<\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a8c\/049\/733\/a8c0497331c13cd0b09d8d37915f6774.png\" alt=\"Service Accounts \u0432 Google Cloud\" title=\"Service Accounts \u0432 Google Cloud\" width=\"2468\" height=\"840\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a8c\/049\/733\/a8c0497331c13cd0b09d8d37915f6774.png\"\/><\/p>\n<div><figcaption>Service Accounts \u0432 Google Cloud<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u0434\u043b\u044f Service Account, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Google Play Automatic Upload. \u0412\u0432\u0435\u0434\u0438\u0442\u0435 ID (email) \u0434\u043b\u044f Service Account, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>google-play-uploaded<\/code>. \u0416\u043c\u0438\u0442\u0435 &#171;CREATE AND CONTINUE&#187;.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0fd\/94b\/4b4\/0fd94b4b4ff0e8952db1237b46098468.png\" alt=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Service Account \u0432 Google Cloud COnsole\" title=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Service Account \u0432 Google Cloud COnsole\" width=\"2440\" height=\"1310\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0fd\/94b\/4b4\/0fd94b4b4ff0e8952db1237b46098468.png\"\/><\/p>\n<div><figcaption>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Service Account \u0432 Google Cloud COnsole<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0440\u043e\u043b\u044c Viewer, \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e Service Account \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 Google Play Console. \u0416\u043c\u0438\u0442\u0435 &#171;DONE&#187;, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044f \u0442\u0440\u0435\u0442\u0438\u0439 \u0448\u0430\u0433 ( Grant users access to this service account (optional)).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eea\/b76\/251\/eeab76251584024933e2dd5283757028.png\" alt=\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 Viewer\" title=\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 Viewer\" width=\"2420\" height=\"1554\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eea\/b76\/251\/eeab76251584024933e2dd5283757028.png\"\/><\/p>\n<div><figcaption>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 Viewer<\/figcaption><\/div>\n<\/figure>\n<h4>\u0428\u0430\u0433 3. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430<\/h4>\n<p> \u041a\u043b\u0438\u043a\u0430\u0439\u0442\u0435 \u043f\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c\u0443 Service Account. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 &#171;Keys&#187;. \u041d\u0430\u0436\u0438\u043c\u0430\u0439\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 &#171;ADD KEY&#187; -> &#171;Create new&#187; -> JSON.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5c8\/aa2\/864\/5c8aa28648cebd0a655345b30f95c64f.png\" alt=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 JSON \u043a\u043b\u044e\u0447\u0430\" title=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 JSON \u043a\u043b\u044e\u0447\u0430\" width=\"2444\" height=\"1164\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5c8\/aa2\/864\/5c8aa28648cebd0a655345b30f95c64f.png\"\/><\/p>\n<div><figcaption>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 JSON \u043a\u043b\u044e\u0447\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043a\u043b\u0438\u043a\u0430 \u043d\u0430 &#171;CREATE&#187; \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0430\u0447\u0430\u043d JSON \u0444\u0430\u0439\u043b \u0441 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c Service Account:<\/p>\n<pre><code>{   \"type\": \"service_account\",   \"project_id\": \"&lt;YOUR GCLOUD PROJECT>\",   \"private_key_id\": \"&lt;REDACTED>\",   \"private_key\": \"-----BEGIN PRIVATE KEY-----\\n&lt;REDACTED>\\n-----END PRIVATE KEY-----\\n\",   \"client_email\": \"google-play-uploaded@&lt;YOUR GCLOUD PROJECT>.iam.gserviceaccount.com\",   \"client_id\": \"&lt;SOME BIG NUMBER>\",   \"auth_uri\": \"https:\/\/accounts.google.com\/o\/oauth2\/auth\",   \"token_uri\": \"https:\/\/oauth2.googleapis.com\/token\",   \"auth_provider_x509_cert_url\": \"https:\/\/www.googleapis.com\/oauth2\/v1\/certs\",   \"client_x509_cert_url\": \"https:\/\/www.googleapis.com\/robot\/v1\/metadata\/x509\/google-play%40&lt;YOUR GCLOUD PROJECT>.iam.gserviceaccount.com\" }<\/code><\/pre>\n<p>\u0425\u0440\u0430\u043d\u0438\u0442\u0435 \u044d\u0442\u043e\u0442 \u043a\u043b\u044e\u0447 \u0432 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u043c \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435!<\/p>\n<h4>\u0428\u0430\u0433 4. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Google Cloud Service Account \u0432 Google Play Console<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0433 &#8212; \u0434\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e Service Account. \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u043a\u0430 \u0435\u0449\u0435 \u043d\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0441 Google Cloud \u0438 \u043f\u0440\u0430\u0432\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0432 Google <strong>Play<\/strong> Console.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u0432 <a rel=\"noopener noreferrer nofollow\">Google Play Console<\/a>, \u0440\u0430\u0437\u0434\u0435\u043b &#171;Users and permissions&#187;. \u0416\u043c\u0435\u0442\u0435 \u043d\u0430 \u043c\u0435\u043d\u044e \u0441 \u0442\u0440\u0451\u043c\u044f \u0442\u043e\u0447\u043a\u0430\u043c\u0438, \u0434\u0430\u043b\u044c\u0448\u0435 &#171;Invite new users&#187;.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dea\/38b\/f80\/dea38bf80c6637c5ac3d844fbb7b23da.png\" alt=\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Google Cloud Service Account \u0432 Google Play Console\" title=\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Google Cloud Service Account \u0432 Google Play Console\" width=\"1804\" height=\"978\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dea\/38b\/f80\/dea38bf80c6637c5ac3d844fbb7b23da.png\"\/><\/p>\n<div><figcaption>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Google Cloud Service Account \u0432 Google Play Console<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0432\u043e\u0434\u0438\u0442\u0435 <code>google-play-uploaded@&lt;YOUR GCLOUD PROJECT>.iam.gserviceaccount.com<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d63\/53d\/b7c\/d6353db7c52597b2756ec3b7fff3f45c.png\" alt=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u0430\u0432 \u0434\u043b\u044f Google Service Account \u0432 Google Play Consol\u0435\" title=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u0430\u0432 \u0434\u043b\u044f Google Service Account \u0432 Google Play Consol\u0435\" width=\"1788\" height=\"1346\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d63\/53d\/b7c\/d6353db7c52597b2756ec3b7fff3f45c.png\"\/><\/p>\n<div><figcaption>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u0430\u0432 \u0434\u043b\u044f Google Service Account \u0432 Google Play Consol\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u0449\u0438\u0435 \u043f\u0440\u0430\u0432\u0430<\/p>\n<ul>\n<li>\n<p><strong>View app information and download bulk reports (read only)<br \/><\/strong>View  all app information, including any associated Play Games services  projects \u2013 but not financial data. Users with this permission can also  download bulk reports, and will be able to view any new apps that you  add to Play Console in the future. <\/p>\n<\/li>\n<li>\n<p><strong>Create, edit and delete draft apps<br \/><\/strong>This permission does not allow users to publish apps on Google Play<\/p>\n<\/li>\n<li>\n<p><strong>Release to production, exclude devices and use Play app signing<br \/><\/strong>Create,  edit and roll out releases to production, unpublish and republish apps,  exclude devices in the device catalogue, and use app signing by Google  Play to sign APKs. Users with this permission can publish apps to users on Google Play.<\/p>\n<\/li>\n<li>\n<p><strong>Release apps to testing tracks<\/strong><br \/>Upload draft apps;  create, edit and rollout releases to testing tracks; unpublish and  republish apps that have already been published to a testing track;  upload and modify .obb files; edit release notes for apps which are not  active in production; and upload app bundles for internal sharing. This permission does not allow users to publish apps to production on Google Play.<\/p>\n<\/li>\n<\/ul>\n<p>\u0413\u043e\u0442\u043e\u0432\u043e. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0443 \u0432\u0430\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f <code>.json<\/code> \u0444\u0430\u0439\u043b \u0441 credentials \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a Google Play, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p><strong>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/developers.google.com\/android-publisher\/getting_started\" rel=\"noopener noreferrer nofollow\">Google Play Developers API<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0431\u043e\u0440\u043e\u043a \u0432 Google Play<\/h2>\n<p><a class=\"anchor\" name=\"gplay-upload\" id=\"gplay-upload\"><\/a><\/p>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0432 Google Play \u0431\u0443\u0434\u0435\u043c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/Triple-T\/gradle-play-publisher\" rel=\"noopener noreferrer nofollow\">Triple T Gradle Play Publisher<\/a> \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f Gradle. \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 <a href=\"https:\/\/fastlane.tools\/\" rel=\"noopener noreferrer nofollow\">Fastlane<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0442\u043e\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f iOS. Triple-T Play Publisher \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0437\u0430 \u0441\u0447\u0435\u0442 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 Gradle \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u043e\u0440\u0442\u044f\u043d\u043e\u043a \u043d\u0430 Ruby. <\/p>\n<h4>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/h4>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>build.gradle<\/code> Gradle \u043f\u043b\u0430\u0433\u0438\u043d <a href=\"https:\/\/plugins.gradle.org\/plugin\/com.github.triplet.play\" rel=\"noopener noreferrer nofollow\">com.github.triplet.gradle:play-publisher<\/a>:<\/p>\n<pre><code class=\"scala\">buildscript {   repositories {     google()     mavenCentral()   }    \/\/ &lt;REDACTED>    dependencies {     classpath 'com.android.tools.build:gradle:7.4.2'      \/\/ &lt;REDACTED>      classpath(\"com.github.triplet.gradle:play-publisher:3.8.1\")   } }<\/code><\/pre>\n<p>\u0412\u0435\u0440\u0441\u0438\u044f \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u0435\u0442. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <a href=\"https:\/\/plugins.gradle.org\/plugin\/com.github.triplet.play\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e<\/a> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e.<\/p>\n<h4>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/h4>\n<p>\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0432\u044b\u0437\u043e\u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 <code>com.github.triplet.play<\/code> \u0432 <code>build.gradle<\/code> \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u0435\u043a\u0446\u0438\u0438 `android {}`:<\/p>\n<pre><code class=\"scala\">android {   \/\/ &lt;REDACTED> } apply plugin: 'com.github.triplet.play'<\/code><\/pre>\n<h4>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/h4>\n<p>\u041f\u043b\u0430\u0433\u0438\u043d \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 <code>play {}<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u043c flavor:<\/p>\n<pre><code class=\"scala\">android {   defaultConfig {   \/\/ &lt;REDACTED>    } \/\/ defaultConfig    \/\/ &lt;REDACTED>    playConfigs {     googleRelease {       enabled.set(true)     }   } \/\/ playConfigs  } \/\/ android  play {   enabled.set(false)   track.set(\"production\")   userFraction.set(Double.valueOf(0.10)) \/\/ 10%   defaultToAppBundles.set(true)   releaseStatus.set(ReleaseStatus.DRAFT)   serviceAccountCredentials.set(file(\"google-play.json\")) }<\/code><\/pre>\n<ul>\n<li>\n<p><code>track<\/code> &#8212; \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0432 \u043a\u0430\u043a\u043e\u0439 track \u0437\u0430\u043b\u0438\u0432\u0430\u0442\u044c. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0441\u0440\u0430\u0437\u0443 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d!<\/p>\n<\/li>\n<li>\n<p><code>userFraction<\/code> &#8212; \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c <a href=\"https:\/\/support.google.com\/googleplay\/android-developer\/answer\/6346149?hl=en\" rel=\"noopener noreferrer nofollow\">stage rollout<\/a> \u043d\u0430 10% \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u0442\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u0441\u0443\u043c\u0430\u0448\u0435\u0434\u0448\u0438\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p><code>defaultToAppBundles<\/code> &#8212; \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c Android App Bundles (AAB)  \u0432\u043c\u0435\u0441\u0442\u043e Android Packages (APK).<\/p>\n<\/li>\n<li>\n<p><code>releaseStatus.set(ReleaseStatus.DRAFT)<\/code> &#8212; \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a, \u043d\u043e \u043f\u043e\u043a\u0430 \u0441\u0440\u0430\u0437\u0443 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430 \u0440\u0435\u0432\u044c\u044e. \u041f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430 <code>ReleaseStatus.IN_PROGRESS<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0410 \u0432\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u0435\u043b\u0430\u0435\u0442\u0435 stage rollout? \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0438\u0442\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<h4>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 Google Play<\/h4>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0441\u043a <code>bundleGoogleRelease<\/code> \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 <code>aab<\/code> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438:<\/p>\n<pre><code>gradle bundleGoogleRelease<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0441\u043e\u0431\u0440\u0430\u043b\u043e\u0441\u044c:<\/p>\n<pre><code>ls build\/outputs\/bundle\/googleRelease OrganicMaps-23043001-google-release.aab<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0441\u043a\u0443 <code>publishGoogleReleaseBundle<\/code> \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 c\u043e\u0431\u0440\u0430\u0432\u0448\u0435\u0433\u043e\u0441\u044f <code>aab<\/code> \u0432 Google Play:<\/p>\n<pre><code>gradle publishGoogleReleaseBundle<\/code><\/pre>\n<pre><code>> Task :publishGoogleReleaseBundle Starting App Bundle upload: OrganicMaps-23043001-google-release.aab Uploading App Bundle: 10% complete Uploading App Bundle: 19% complete Uploading App Bundle: 29% complete Uploading App Bundle: 39% complete Uploading App Bundle: 49% complete Uploading App Bundle: 58% complete Uploading App Bundle: 68% complete Uploading App Bundle: 78% complete Uploading App Bundle: 88% complete Uploading App Bundle: 97% complete App Bundle upload complete Updating [completed, inProgress] release (app.organicmaps:[23030505, 23040207]) in track 'production'<\/code><\/pre>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u0447\u0430\u0441\u0442\u044c \u0441 \u0437\u0430\u043b\u0438\u0432\u043a\u043e\u0439 \u0433\u043e\u0442\u043e\u0432\u0430 \u0438  \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a \u0440\u0435\u043b\u0438\u0437\u0430 Google Play Console \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 review. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/065\/594\/f53\/065594f5311887d4fbc4a799b891a11e.png\" alt=\"\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0432 Google Play\" title=\"\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0432 Google Play\" width=\"1600\" height=\"1076\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/065\/594\/f53\/065594f5311887d4fbc4a799b891a11e.png\"\/><\/p>\n<div><figcaption>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0432 Google Play<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f\u043c\u0438, \u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c <code>releaseStatus.set(ReleaseStatus.DRAFT)<\/code>\u043d\u0430 <code>releaseStatus.set(ReleaseStatus.IN_PROGRESS) <\/code>\u0447\u0442\u043e\u0431\u044b \u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0437 \u043d\u0435 \u0431\u0435\u0433\u0430\u0442\u044c \u0432 Google Play Console \u0434\u043b\u044f \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438. \u041a\u043d\u043e\u043f\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u0432 \u0432\u0430\u0448\u0435\u043c CI\/CD, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u0442\u0430\u043c \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438.<\/p>\n<p><strong>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/organicmaps\/organicmaps\/blob\/master\/android\/build.gradle\" rel=\"noopener noreferrer nofollow\">build.gradle<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/Triple-T\/gradle-play-publisher#readme\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Triple-T Gradle Play Publisher<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 Google Play<\/h2>\n<p><a class=\"anchor\" name=\"gplay-metadata\" id=\"gplay-metadata\"><\/a><\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 &#8212; \u044d\u0442\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0438 \u0442.\u043f.) \u0432 Google Play.  \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u043e Google Play. \u0420\u0430\u0431\u043e\u0442\u0443 \u043f\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044e \u0432 Google Play \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u043b\u0430\u0433\u0438\u043d. <\/p>\n<h4>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Google Play<\/h4>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0432 Google Play \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 `bootstrapGoogleReleaseListing`:<\/p>\n<pre><code>gradlew bootstrapGoogleReleaseListing<\/code><\/pre>\n<p>\u041f\u043e\u0448\u0443\u0440\u0448\u0430\u0432 \u0434\u0438\u0441\u043a\u043e\u043c, gradle \u0432\u044b\u043a\u0430\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439.<\/p>\n<pre><code>> Configure project : Building with Google Mobile Services Building without Google Firebase Services Version: 2023.04.23-2 VersionCode: 23042302 Building for [armeabi-v7a, arm64-v8a, x86_64] archs. Create separate apks: false  > Task :bootstrapGoogleReleaseListing Downloading app details Downloading listings Downloading in-app products Downloading release notes Downloading en-US listing Downloading tr-TR listing &lt;REDACTED>  Downloading en-US listing graphics for type 'featureGraphic' Downloading en-US listing graphics for type 'icon' Downloading en-US listing graphics for type 'phoneScreenshots' Downloading en-US listing graphics for type 'tenInchScreenshots' Downloading en-US listing graphics for type 'sevenInchScreenshots' Downloading tr-TR listing graphics for type 'sevenInchScreenshots' Downloading tr-TR listing graphics for type 'phoneScreenshots' &lt;-&lt;----&lt; BUILD SUCCESSFUL in 44s 1 actionable task: 1 executed<\/code><\/pre>\n<p>\u041d\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u0432 <code>src\/&lt;FLAVOR>\/play<\/code>:<\/p>\n<pre><code>contact-email.txt contact-website.txt default-language.txt listings\/   en-US     full-description.txt     graphics\/       icon\/         1.png       phone-screenshots\/         1.jpg         2.jpg         3.jpg         4.jpg     release-notes.txt     short-description.txt     title.txt     video-url.txt release-notes\/   en-US\/     default.txt<\/code><\/pre>\n<h4>\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Google Play \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0438\u0445 \u0432 git \u0438 \u0434\u0430\u043b\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 git \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u043e\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u0438\u0437\u0431\u0435\u0433\u0430\u044f \u0440\u0443\u0447\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 Google Play Console. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u043b\u044e\u0441\u043e\u0432, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0433\u043e \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0434\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/habr.com\/ru\/articles\/732390\/\" rel=\"noopener noreferrer nofollow\">Weblate<\/a> \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0439 Google Play \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u044f\u0437\u044b\u043a\u0438. \u0414\u0430\u043d\u043d\u044b\u0435 Google Play \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u0430\u043b\u0435\u0435 \u0434\u043b\u044f Huawei AppGallery.<\/p>\n<h4>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Google Play<\/h4>\n<p>\u0414\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 Google Play \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 <code>publishGoogleReleaseListing<\/code> (\u0433\u0434\u0435 GoogleRelease &#8212; \u0432\u0430\u0448 flavor):<\/p>\n<pre><code>.\/gradlew publishGoogleReleaseListing  &lt;REDACTED>  > Configure project : Building with Google Mobile Services Building without Google Firebase Services Version: 2023.05.01-1 VersionCode: 23050101 Building for [armeabi-v7a, arm64-v8a, x86_64] archs. Create separate apks: false  > Task :publishGoogleReleaseListing Uploading app details Uploading ar listing &lt;REDACTED> Uploading zh-TW listing<\/code><\/pre>\n<p><strong>\u0412\u0430\u0436\u043d\u043e. <\/strong>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Google Play \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u043a \u0432\u044b\u043f\u0443\u0441\u043a\u0443 \u0440\u0435\u043b\u0438\u0437\u043e\u0432. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f review \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. Review \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e!<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/33a\/6a5\/459\/33a6a5459ed6d0866e3146632c2de5c4.png\" alt=\"\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 Google Play Console\" title=\"\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 Google Play Console\" width=\"2470\" height=\"1604\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/33a\/6a5\/459\/33a6a5459ed6d0866e3146632c2de5c4.png\"\/><\/p>\n<div><figcaption>\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 Google Play Console<\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0432\u0441\u0435\u0445 59 \u044f\u0437\u044b\u043a\u0430\u0445, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 Google Play Console \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p><strong>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/organicmaps\/organicmaps\/blob\/master\/android\/build.gradle\" rel=\"noopener noreferrer nofollow\">build.gradle<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/Triple-T\/gradle-play-publisher#readme\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Triple-T Gradle Play Publisher<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043e\u0442 Huawei AppGallery<\/h2>\n<p><a class=\"anchor\" name=\"appgallery-credentials\" id=\"appgallery-credentials\"><\/a><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432 Huawei AppGallery \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a Huawei AppGallery Connect. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Huawei AppGallery Connect, \u0441\u043a\u0430\u0436\u0435\u043c \u0442\u0430\u043a, \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0432\u0435\u0441\u044c\u043c\u0430 \u0437\u0430\u043f\u0443\u0442\u0430\u043d. \u041d\u043e \u043d\u0430\u0434\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0447\u0442\u043e\u0431\u044b \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0442\u0443\u0434\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c.<\/p>\n<p>\u0417\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0432\u00a0<a href=\"https:\/\/developer.huawei.com\/consumer\/en\/service\/josp\/agc\/index.html\" rel=\"noopener noreferrer nofollow\">AppGallery Connect<\/a>\u00a0\u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0439\u0442\u0435 <strong>Users and permissions<\/strong>. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u043a <strong>API key<\/strong>\u00a0>\u00a0<strong>Connect API<\/strong>\u00a0\u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0439\u0442\u0435\u00a0<strong>Create:<\/strong><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5f7\/3ea\/c30\/5f73eac30cce26ac6abbab7082f197af.png\" alt=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 API client \u0434\u043b\u044f Huawei App Gallery Connect\" title=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 API client \u0434\u043b\u044f Huawei App Gallery Connect\" width=\"1885\" height=\"476\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5f7\/3ea\/c30\/5f73eac30cce26ac6abbab7082f197af.png\"\/><\/p>\n<div><figcaption>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 API client \u0434\u043b\u044f Huawei App Gallery Connect<\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u043e\u0436\u0435\u0442\u0435 \u0432\u0432\u0435\u0441\u0442\u0438 \u043b\u044e\u0431\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435. \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u043e\u043b\u0438:<\/p>\n<ul>\n<li>\n<p>Development<\/p>\n<\/li>\n<li>\n<p>Operations<\/p>\n<\/li>\n<li>\n<p>Customer service (\u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438)<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d53\/f69\/48b\/d53f6948bd35d46493430dc434dac1fd.png\" alt=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e API Client\" title=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e API Client\" width=\"1620\" height=\"870\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d53\/f69\/48b\/d53f6948bd35d46493430dc434dac1fd.png\"\/><\/p>\n<div><figcaption>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e API Client<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u0430\u0447\u0430\u0442\u044c <code>.json<\/code> \u043a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a Huawei AppGallery Connect:<\/p>\n<pre><code class=\"json\">{         \"type\":\"team_client_id\",         \"developer_id\":\"&lt;BIG NUMBER>\",         \"client_id\":\"&lt;ANOTHER BIG NUMBER>\",         \"client_secret\":\"&lt;REDACATED>\",         \"configuration_version\":\"3.0\" }<\/code><\/pre>\n<p>\u0413\u043e\u0442\u043e\u0432\u043e. \u0414\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<p><strong>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/developer.huawei.com\/consumer\/en\/doc\/development\/AppGallery-connect-Guides\/agcapi-getstarted-0000001111845114\" rel=\"noopener noreferrer nofollow\">AppGallery Connect -> Getting Started -> Creating an API client<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/cianru\/huawei-appgallery-publish-gradle-plugin#readme\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Huawei App Gallery Publishing<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0431\u043e\u0440\u043e\u043a \u0438 release notes \u0432 Huawei AppGallery<\/h2>\n<p><a class=\"anchor\" name=\"appgallery-upload\" id=\"appgallery-upload\"><\/a><\/p>\n<p>\u0414\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 Huawei AppGallery \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Gradle plugin <a href=\"https:\/\/plugins.gradle.org\/plugin\/ru.cian.huawei-publish-gradle-plugin\" rel=\"noopener noreferrer nofollow\">ru.cian:huawei-publish-gradle-plugin<\/a>, \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0439 <a href=\"https:\/\/github.com\/cosic\" rel=\"noopener noreferrer nofollow\">Aleksandr Mirko<\/a> \u0438\u0437 \u041e\u043c\u0441\u043a\u0430. \u0421\u043a\u0430\u0436\u0435\u043c \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0443 \u0437\u0430 \u0441\u0442\u043e\u043b\u044c \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0431\u0435\u0437\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 Huawei AppGallery \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0441\u0442\u0440\u0430\u0434\u0430\u0442\u044c.<\/p>\n<h4>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0432 Gradle<\/h4>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c Gradle-plugin <a href=\"https:\/\/plugins.gradle.org\/plugin\/ru.cian.huawei-publish-gradle-plugin\" rel=\"noopener noreferrer nofollow\">ru.cian:huawei-publish-gradle-plugin<\/a> \u0432 <code>build.gradle<\/code>:<\/p>\n<pre><code class=\"scala\">buildscript {   repositories {     google()     mavenCentral()   }    \/\/ &lt;REDACTED>    dependencies {     classpath 'com.android.tools.build:gradle:7.4.2'      \/\/ &lt;REDACTED>      classpath(\"ru.cian:huawei-publish-gradle-plugin:1.3.6\")   } }<\/code><\/pre>\n<h4>\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/h4>\n<p>\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d <code>ru.cian.huawei-publish-gradle-plugin<\/code> \u0432 <code>build.gradle<\/code> \u043f\u043e\u0441\u043b\u0435 \u0441\u0435\u043a\u0446\u0438\u0438 <code>android {}<\/code>:<\/p>\n<pre><code class=\"scala\">apply plugin: 'ru.cian.huawei-publish-gradle-plugin'<\/code><\/pre>\n<h4>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/h4>\n<p>\u041f\u043b\u0430\u0433\u0438\u043d \u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0446\u0438\u0438 <code>huaweiPublish {}<\/code>. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0432 \u043a\u043e\u043d\u0435\u0446 <code>build.gradle<\/code>:<\/p>\n<pre><code>huaweiPublish {   instances {     huaweiRelease {       credentialsPath = \"$rootDir\/huawei-appgallery.json\"       buildFormat = 'aab'       deployType = 'draft' \/\/ confirm manually       releaseNotes = []       def localeOverride = [           'am' : 'am-ET',           'gu': 'gu_IN',           'iw-IL': 'he_IL',           'kn-IN': 'kn_IN',           'ml-IN': 'ml_IN',           'mn-MN': 'mn_MN',           'mr-IN': 'mr_IN',           'ta-IN': 'ta_IN',           'te-IN': 'te_IN',       ]       def files = fileTree(dir: \"$projectDir\/src\/google\/play\/listings\",           include: '**\/release-notes.txt')       files.each { File file ->         def path = file.getPath()         def locale = file.parentFile.getName()         locale = localeOverride.get(locale, locale)         releaseNotes.add(new ru.cian.huawei.publish.ReleaseNote(locale, path))       }     }   } }<\/code><\/pre>\n<ul>\n<li>\n<p><code>credentialsPath<\/code> &#8212; \u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0441 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u043e\u0442 AppGallery Connect<\/p>\n<\/li>\n<li>\n<p><code>deployType = 'draft'<\/code> &#8212; \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u0443 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a \u0440\u0435\u043b\u0438\u0437\u0430, \u043d\u043e \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 review. \u041f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u043a\u0430\u0442\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430 <code>publish<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>buildFormat = 'aab'<\/code> &#8212; \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 \u0432 Google Play \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f Huawei AppGallery Android App Bundles (AAB)  \u0432\u043c\u0435\u0441\u0442\u043e Android Packages (APK).<\/p>\n<\/li>\n<li>\n<p><code>localeOverride<\/code> &#8212; \u0437\u0434\u0435\u0441\u044c \u0438 \u043d\u0438\u0436\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0433\u0438\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f release notes \u0438\u0437 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043b\u044f Google Play. \u0415\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u043a\u043e\u0434\u043e\u0432 \u043b\u043e\u043a\u0430\u043b\u0435\u0439 \u0434\u043b\u044f Huawei AppGallery \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0441 <code>_<\/code> (underscore) \u0432\u043c\u0435\u0441\u0442\u043e <code>-<\/code> (dash) \u043a\u0430\u043a Google Play. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442. <\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/cianru\/huawei-appgallery-publish-gradle-plugin#plugin-params\" rel=\"noopener noreferrer nofollow\">README \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0430 GitHub<\/a>.<\/p>\n<h4>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/h4>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0441\u043a <code>bundleHuaweiRelease<\/code> \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 <code>aab<\/code> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438:<\/p>\n<pre><code>gradle bundleHuaweiRelease<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0441\u043e\u0431\u0440\u0430\u043b\u043e\u0441\u044c:<\/p>\n<pre><code>ls build\/outputs\/bundle\/huaweiRelease OrganicMaps-23043001-huawei-release.aab<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0441\u043a\u0443 <code>publishHuaweiAppGalleryHuaweiRelease<\/code> \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 c\u043e\u0431\u0440\u0430\u0432\u0448\u0435\u0433\u043e\u0441\u044f <code>aab<\/code> \u0432 Huawei AppGalery Connect:<\/p>\n<pre><code>gradle publishHuaweiAppGalleryHuaweiRelease<\/code><\/pre>\n<p><strong>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435:<\/strong> \u0437\u0430\u0434\u0430\u0447\u0430 <code>publish<\/code> \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u044f\u0432\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0430 bundle, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0434\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c <code>bundle<\/code> \u0437\u0430\u0434\u0430\u0447\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441\u0440\u0430\u0437\u0443 \u0432 \u043e\u0434\u043d\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 gradle:<\/p>\n<pre><code>gradle bundleHuaweiRelease publishHuaweiAppGalleryHuaweiRelease<\/code><\/pre>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u043f\u0438\u0448\u0435\u0442 gradle \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438:<\/p>\n<pre><code>> Task :publishHuaweiAppGalleryHuaweiRelease Huawei AppGallery Publishing API: Prepare input config Huawei AppGallery Publishing API: Found build file: `OrganicMaps-23043001-huawei-release.aab` Huawei AppGallery Publishing API: Get Access Token Huawei AppGallery Publishing API: Get App ID Huawei AppGallery Publishing API: Get Upload Url Huawei AppGallery Publishing API: Upload build file '\/home\/runner\/work\/organicmaps\/organicmaps\/android\/build\/outputs\/bundle\/huaweiRelease\/OrganicMaps-23040207-huawei-release.aab' Huawei AppGallery Publishing API: Upload release notes: 1\/59, lang=et Huawei AppGallery Publishing API: Upload release notes: 2\/59, lang=kk  [REDACTED]  Huawei AppGallery Publishing API: Upload release notes: 59\/59, lang=ar Huawei AppGallery Publishing API: Update App File Info Huawei AppGallery Publishing API: Upload build file draft without submit on users - Successfully Done!  BUILD SUCCESSFUL in 1m 36s 1 actionable task: 1 executed<\/code><\/pre>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 credentials \u0432 \u0444\u0430\u0439\u043b\u0435 <code>huawei-appgallery.json<\/code> \u043f\u043b\u0430\u0433\u0438\u043d \u0437\u0430\u0444\u0435\u0439\u043b\u0438\u0442\u0441\u044f \u0435\u0449\u0435 \u043d\u0430 &#171;Get Access Token&#187;. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1a1\/a49\/715\/1a1a49715ecdd8e1c9d32aa1811e0e34.png\" alt=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0430 \u0440\u0435\u043b\u0438\u0437\u0430\" title=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0430 \u0440\u0435\u043b\u0438\u0437\u0430\" width=\"1113\" height=\"288\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1a1\/a49\/715\/1a1a49715ecdd8e1c9d32aa1811e0e34.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0430 \u0440\u0435\u043b\u0438\u0437\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 release notes \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u0438\u043c\u0438\u0442\u044b, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e draft \u0431\u0435\u0437 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f release notes. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0443\u0434\u0430\u043b\u0438\u0442\u044c draft \u0440\u0435\u043b\u0438\u0437\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432 AppGallery Connect \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0435\u0449\u0435 \u0440\u0430\u0437. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c release notes \u043f\u043e\u0447\u0442\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439, \u0445\u043e\u0442\u044f \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8c4\/c8c\/7f1\/8c4c8c7f13331db5d317bec2adbd99de.png\" alt=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 release notes\" title=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 release notes\" width=\"1600\" height=\"611\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8c4\/c8c\/7f1\/8c4c8c7f13331db5d317bec2adbd99de.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 release notes<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7a3\/869\/4af\/7a38694af341ee6699120c2bc8a06201.png\" alt=\"\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043d\u0430 review\" title=\"\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043d\u0430 review\" width=\"1600\" height=\"1081\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7a3\/869\/4af\/7a38694af341ee6699120c2bc8a06201.png\"\/><\/p>\n<div><figcaption>\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043d\u0430 review<\/figcaption><\/div>\n<\/figure>\n<p>\u0413\u043e\u0442\u043e\u0432\u043e. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0437\u0430\u043b\u0438\u0432\u043a\u0430 \u0432 Huawei AppGallery \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 Gradle.<\/p>\n<p><strong>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/cianru\/huawei-appgallery-publish-gradle-plugin#readme\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Gradle \u043f\u043b\u0430\u0433\u0438\u043d\u0443 \u0434\u043b\u044f Huawei AppGallery<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 CI\/CD<\/h2>\n<p><a class=\"anchor\" name=\"ci-cd\" id=\"ci-cd\"><\/a><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439, \u043d\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u0448\u0430\u0433 &#8212; \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0451 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432 \u0432\u0430\u0448\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 CI\/CD.  \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043e\u0441\u043e\u0431\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u0432 gradle \u0438 \u0432\u0430\u043c \u043d\u0430\u0434\u043e \u043b\u0438\u0448\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c GitHub Actions, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043a\u0440\u0430\u0442\u043a\u043e \u043f\u0440\u043e \u043d\u0438\u0445.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0441 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 <code>google-play.json<\/code> \u0438<code>huawei-appgallery.json<\/code> \u0432 GitHub Actions Secrets. \u0422\u0430\u043a\u0436\u0435 \u0432\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 base64. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u0432 Settings -> Secrets and variables -> Actions \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0434\u0432\u0435 \u043d\u043e\u0432\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/749\/76f\/6ab\/74976f6abb73c67eef9b881a2c02d357.png\" width=\"646\" height=\"468\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/749\/76f\/6ab\/74976f6abb73c67eef9b881a2c02d357.png\"\/><\/figure>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 workflow \u0444\u0430\u0439\u043b <code>.github\/workflows\/android-release.yaml<\/code>:<\/p>\n<pre><code>name: Android Release on:   workflow_dispatch:  # Manual trigger<\/code><\/pre>\n<p> \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 (google, huawei, web):<\/p>\n<pre><code>jobs:   android-release:     name: Android Release     runs-on: ubuntu-latest     environment: production     needs: tag     strategy:       fail-fast: false       matrix:         include:           - flavor: google           - flavor: huawei<\/code><\/pre>\n<p>\u041a\u0430\u0447\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438:<\/p>\n<pre><code>    steps:       - name: Checkout sources         uses: actions\/checkout@v3         with:           fetch-depth: 200 # enough to get all commits for the current day<\/code><\/pre>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 shared GitHub Runners \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0440\u043e\u0434\u0435 Android SDK \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b, \u043d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0435\u0449\u0435, \u043d\u0443\u0436\u043d\u043e\u0435 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code>      - name: Install build tools and dependencies         shell: bash         run: |           sudo apt-get update -y           sudo apt-get install -y ninja-build<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b <code>google-play.json<\/code> \u0438<code>huawei-appgallery.json <\/code>\u0438\u0437 GitHub Secrets:<\/p>\n<pre><code>      - name: Get credenials         shell: bash         run: |           echo \"${{ secrets.GOOGLE_PLAY_JSON }}\" > google-play.json           echo \"${{ secrets.HUAWEI_APPGALLERY_JSON }}\" > huawei-appgallery.json<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043b\u044e\u0447\u0438. \u041c\u043e\u0436\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0432\u0435\u0440\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0432 Google Play \u0438 Huawei AppGallery \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u043d\u0435\u0435 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435:<\/p>\n<pre><code>      - name: Compile and upload to Google Play         shell: bash         working-directory: android         run: |           gradle bundleGoogleRelease publishGoogleReleaseBundle         if: ${{ matrix.flavor == 'google' }}        - name: Compile and upload to Huawei AppGallery         shell: bash         working-directory: android         run: |           gradle bundleHuaweiRelease           gradle publishHuaweiAppGalleryHuaweiRelease         if: ${{ matrix.flavor == 'huawei' }}<\/code><\/pre>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u0433\u043e\u0442\u043e\u0432\u043e. \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ec8\/fcf\/ae8\/ec8fcfae89f5440903508d11a31e6c07.png\" alt=\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0432 GitHub Actions\" title=\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0432 GitHub Actions\" width=\"652\" height=\"470\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ec8\/fcf\/ae8\/ec8fcfae89f5440903508d11a31e6c07.png\"\/><\/p>\n<div><figcaption>\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0432 GitHub Actions<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 Google Play Store. \u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u0442\u043e\u0442 \u0436\u0435 workflow \u0444\u0430\u0439\u043b \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 Google Play \u0434\u0430\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u0430.<\/p>\n<pre><code>      - name: Update Google Play Metadata         shell: bash         run: .\/gradlew publishGoogleReleaseListing         working-directory: android         timeout-minutes: 5<\/code><\/pre>\n<p><strong>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.github.com\/en\/actions\/security-guides\/encrypted-secrets\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 encrypted secrets \u0434\u043b\u044f GitHub Actions<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/organicmaps\/organicmaps\/blob\/0d030515cba52ee994c812bc402d58f2df9f29b1\/.github\/workflows\/android-release.yaml#L120-L133\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043c\u0435\u0440 android-release.yaml \u0434\u043b\u044f GitHub Actions<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p><a class=\"anchor\" name=\"conclusion\" id=\"conclusion\"><\/a><\/p>\n<p>\u0412\u044b\u043f\u0443\u0441\u043a \u043d\u043e\u0432\u044b\u0445 \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u0432 \u0441\u0442\u043e\u0440\u0430\u0445 &#8212; \u044d\u0442\u043e \u0440\u0443\u0442\u0438\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435 &#8212; \u043a\u0430\u0436\u0434\u0443\u044e \u043d\u0435\u0434\u0435\u043b\u044e, \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0441\u044f\u0446, \u0433\u043e\u0434 \u043e\u0442 \u0433\u043e\u0434\u0430. \u0418 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438. \u0420\u0435\u043b\u0438\u0437 \u043e\u0442 \u0440\u0435\u043b\u0438\u0437\u0430. \u0412\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437.<\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e, \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0435 30 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u043e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430\u043c\u0438&#8230; \u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0435 CI\/CD \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u0436\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u0433\u043e\u0434 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0441\u043e\u0442\u043d\u0438 \u0447\u0430\u0441\u043e\u0432 \u0432 \u0433\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0432\u0435\u0449\u0438.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/732550\/\"> https:\/\/habr.com\/ru\/articles\/732550\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u043b\u0438\u0437\u043e\u0432 Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 <strong>Google Play<\/strong> \u0438 <strong>Huawei AppStore<\/strong> (\u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0431\u0435\u0437 RuStore). \u0412\u044b \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u0431\u0443\u0434\u0435\u0442\u0435 \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, \u044d\u043a\u043e\u043d\u043e\u043c\u044f \u0441\u043e\u0442\u043d\u0438 \u0447\u0430\u0441\u043e\u0432 \u0432 \u0433\u043e\u0434.<\/p>\n<h2>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h2>\n<ul>\n<li>\n<p><a href=\"#structure\" rel=\"noopener noreferrer nofollow\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 Gradle\u2011\u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#aab-apk\" rel=\"noopener noreferrer nofollow\">Android App Bundles (AAB) vs Android Packages (APK)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#versions\" rel=\"noopener noreferrer nofollow\">\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0432\u0435\u0440\u0441\u0438\u0439<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#gplay-credentials\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043e\u0442\u00a0Google Play<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#gplay-upload\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0431\u043e\u0440\u043e\u043a \u0432\u00a0Google Play<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#gplay-metadata\" rel=\"noopener noreferrer nofollow\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 Google Play<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#appgallery-credentials\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043e\u0442\u00a0Huawei AppGallery<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#appgallery-upload\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0431\u043e\u0440\u043e\u043a \u0438 release notes \u0432\u00a0Huawei AppGallery<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#ci-cd\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 CI\/CD<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#conclusion\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 Gradle-\u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h2>\n<p><a class=\"anchor\" name=\"structure\" id=\"structure\"><\/a><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0432\u0435\u0434\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432 \u0441\u0430\u043c\u043e\u043c Android \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0412<code>build.gradle<\/code> \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0438\u0437 flavors <code>x<\/code> buildTypes:<\/p>\n<pre><code class=\"scala\">  android {   \/\/ &lt;REDACTED>    flavorDimensions 'default'    productFlavors {     google {       dimension \"default\"       versionName = android.defaultConfig.versionName + '-Google'     }      huawei {       dimension \"default\"       versionName = android.defaultConfig.versionName + '-Huawei'     }   }    \/\/ &lt;REDACTED>    buildTypes {     debug {       applicationIdSuffix '.debug'       versionNameSuffix '-debug'       signingConfig signingConfigs.debug       \/\/ &lt;REDACTED>     }     beta {       applicationIdSuffix '.beta'       versionNameSuffix '-beta'       signingConfig signingConfigs.release       \/\/ &lt;REDACTED>     }     release {       signingConfig signingConfigs.release       minifyEnabled true       shrinkResources true       \/\/ &lt;REDACTED>     } }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0434\u0430\u0435\u0442 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e \u0438\u0437 GoogleDebug, GoogleBeta, GoogleRelease, HuaweiDebug, \u0438 \u0442.\u0434. \u0412 \u0446\u0435\u043b\u043e\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e stores \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430, \u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0442\u0430\u043a\u0438\u043c \u043a\u0430\u043a in-app. \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0439\u0442\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0432\u0430\u0448\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439. <\/p>\n<p><strong>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/organicmaps\/organicmaps\/blob\/master\/android\/build.gradle\" rel=\"noopener noreferrer nofollow\">build.gradle<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developer.android.com\/build\/build-variants\" rel=\"noopener noreferrer nofollow\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 build variants<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>Android App Bundles (AAB) vs Android Packages (APK)<\/h2>\n<p><a class=\"anchor\" name=\"aab-apk\" id=\"aab-apk\"><\/a><\/p>\n<p>\u0421 \u0441\u0430\u043c\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0437\u0430\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f Android \u0432\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u043b\u0438\u0441\u044c \u0432 \u0432\u0438\u0434\u0435 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 <code>.apk<\/code> \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f ZIP \u0430\u0440\u0445\u0438\u0432\u044b \u0441 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u043f\u043e\u0434 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 API-levels. \u0412\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0435 \u0441\u0432\u043e\u0439 \u043a\u043e\u0434 \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u0430\u0440\u0445\u0438\u0432, \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 \u0435\u0433\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043e\u0439. \u0410 \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c \u0445\u043e\u0442\u044c \u0447\u0435\u0440\u0435\u0437 Google Play, \u0445\u043e\u0442\u044c \u0447\u0435\u0440\u0435\u0437 RuStore, \u0445\u043e\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c. <\/p>\n<p>\u0421\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u0432 2021 \u0433\u043e\u0434\u0443. Google \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 Google Play \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 API-level \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0418 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0437\u0430\u0447\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>armeabi-v7a<\/code> \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 <code>arm64-v8a<\/code>? \u0417\u0430\u0447\u0435\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0441 API level = 31 \u043d\u0443\u0436\u043d\u044b compatibility \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f API level = 21? \u0417\u0430\u0447\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 30 \u044f\u0437\u044b\u043a\u0430\u0445, \u0435\u0441\u043b\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d? \u0412 \u0446\u0435\u043b\u043e\u043c \u0438\u0434\u0435\u044f \u043d\u0435\u043f\u043b\u043e\u0445\u0430\u044f, \u043d\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, Google \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 <a href=\"https:\/\/developer.android.com\/guide\/app-bundle\" rel=\"noopener noreferrer nofollow\">Android App Bundles<\/a> (<code>.aab<\/code>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e <code>.apk<\/code> \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 \u0441\u0432\u043e\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c. \u041e\u0434\u043d\u0430\u043a\u043e, <code>.aab<\/code> \u0444\u0430\u0439\u043b\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. Google Play \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0438\u0437 .aab \u0444\u0430\u0439\u043b\u0430 .apk \u0444\u0430\u0439\u043b \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u0434\u0435\u0432\u0430\u0439\u0441. \u0412\u043c\u0435\u0441\u0442\u043e, \u0443\u0441\u043b\u043e\u0432\u043d\u043e, 50 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 <code>.apk<\/code> \u0444\u0430\u0439\u043b\u0430 \u0432\u044b \u043a\u0430\u0447\u0430\u0435\u0442\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 20 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u0442\u0430\u0440\u0433\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e <code>.apk<\/code> \u0444\u0430\u0439\u043b\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434 \u0432\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. Profit!<\/p>\n<p><strong>\u0412\u0430\u0436\u043d\u043e!<\/strong> \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <a href=\"https:\/\/developer.android.com\/guide\/app-bundle\" rel=\"noopener noreferrer nofollow\">Android App Bundles<\/a>, \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044c APK \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 Google (\u0438, \u0442\u0435\u043f\u0435\u0440\u044c \u0438 Huawei). <u>\u041a\u0430\u0436\u0434\u044b\u0439 app store \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0432\u043e\u0438 \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0438<\/u>. Google &#8212; \u0441\u0432\u043e\u0438, Huawei &#8212; \u0441\u0432\u043e\u0438. Android \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c, \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0431\u0435\u0437 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043c\u0435\u0441\u0442\u0438 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442 bundle \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0437 Google Play, \u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 Huawei. <\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 APK \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041e\u0434\u043d\u0430\u043a\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 2021 \u0443 \u0432\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u0432\u0441\u0435 <strong>\u043d\u043e\u0432\u044b\u0435<\/strong> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <a href=\"https:\/\/developer.android.com\/guide\/app-bundle\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u0434\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c<\/a> \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <code>.aab<\/code>, \u043e\u0442\u0434\u0430\u0432\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 Google Play. \u0422\u0435\u043f\u0435\u0440\u044c \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u0438\u0442\u044c \u043d\u0430 \u0432\u0441\u0435 \u044d\u0442\u0438 split APK, \u0430 \u0442\u0430\u043a\u0436\u0435 APK expansion files \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043a\u043e\u0441\u0442\u044b\u043b\u0438. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043a\u0430\u0447\u0430\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u043d\u043e\u0439 EDGE^W5G \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442. \u0411\u043e\u043b\u044c\u0448\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435! \u0418, \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0441 Google Play \u043d\u0430 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. <a href=\"https:\/\/youtu.be\/heRbyUAuyKo?t=43\" rel=\"noopener noreferrer nofollow\">Win-win-win.<\/a><\/p>\n<p><strong>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/developer.android.com\/guide\/app-bundle\" rel=\"noopener noreferrer nofollow\">Android App Bundles<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0432\u0435\u0440\u0441\u0438\u0439<\/h2>\n<p><a class=\"anchor\" name=\"versions\" id=\"versions\"><\/a><\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0432\u0430\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 continuous deployment \u0445\u043e\u0442\u044c \u0434\u043b\u044f \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0445\u043e\u0442\u044c \u0434\u043b\u044f package software &#8212; \u044d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f <strong>\u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e<\/strong> \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0435\u0440\u0441\u0438\u0439. \u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435: \u0434\u043b\u044f <strong>\u043a\u0430\u0436\u0434\u043e\u0433\u043e <\/strong>git commit<strong> <\/strong>\u0432 \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438. \u041f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u044c\u0442\u0435 \u0443\u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c &#171;bump versions&#187;  (1.0.2 -> 1.0.3 -> 1.0.4 \u0438 \u0442.\u0434.) \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u041d\u0443\u0436\u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0433\u0434\u0435 \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438 (\u0445\u043e\u0442\u044f \u0431\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0435\u0433\u043e .patch-level \u0447\u0430\u0441\u0442\u044c) \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. <\/p>\n<p>\u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u043d\u0435\u043f\u043b\u043e\u0445\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0440\u0430\u0437 \u0438 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e. <\/p>\n<h4>\u041f\u043e\u0434\u0445\u043e\u0434 1. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 git describe<\/h4>\n<p>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c Android (\u0438 Google Play \u0438 AppGallery \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e) \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e downgrade \u0432\u0435\u0440\u0441\u0438\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d. \u041a\u043e\u0434 \u043d\u043e\u043c\u0435\u0440\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0442\u044c. \u041d\u043e \u0432\u0435\u0434\u044c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0441\u0442\u0451\u0442 git \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0438, \u0435\u0441\u043b\u0438 \u0436\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u044b \u043d\u0435 \u0445\u0443\u043b\u0438\u0433\u0430\u043d\u0438\u0442\u0435 \u0441 rewrite \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0438 force-pushes. <\/p>\n<p>\u041a\u0440\u0430\u0439\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e git commit \u0432 \u0432\u0435\u0442\u043a\u0435 \u0434\u043b\u044f \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u0438. \u041c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e \u0432\u044b \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u0435 annotated tag  \u0432\u0438\u0434\u0430 <code>v$major.$minor<\/code> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, v1.0, v2.0), \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0442\u0440\u0435\u0442\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 (patch) \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0447\u0438\u0441\u043b\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0442\u0435\u0433\u0430. <\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>git describe --long<\/code>:<\/p>\n<pre><code>> git tag -a v1.0 -m \"New minor release\" > git describe --long v1.0-0-gbc2d1a8  > touch test2.txt > git add . > git commit -m \"Add some changes\" > git describe --long v1.0-1-gaa7263d ...  > touch test3.txt > git add . > git commit -m \"Add some more changes\" > git describe --long v1.0-2-g6a48c84<\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0430\u0435\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435 semver v1.0.0, v1.0.1, v1.0.2 \u0438 \u0442.\u0434, \u0433\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0446\u0438\u0444\u0440\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 (patch) \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0430 major.minor \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0430\u043c\u0438. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e git commit \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438. \u041d\u0430\u0439\u0442\u0438 git \u043a\u043e\u043c\u043c\u0438\u0442 \u043f\u043e \u0442\u0435\u0433\u0443 \u0438 \u0447\u0438\u0441\u043b\u0443 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u043e\u0442 \u043d\u0435\u0433\u043e \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u043c. \u041f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u043e.<\/p>\n<h4>\u041f\u043e\u0434\u0445\u043e\u0434 2. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u0442\u044b<\/h4>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u0442\u044b git \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0435\u0440\u0441\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 2023.04.23-2. \u0410 \u043a\u0430\u043a \u0436\u0435 semver, \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u0435 \u0432\u044b? \u041d\u0443 \u0430 \u0432\u043e\u0442 \u0430 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u0432\u0430\u043c \u0432 \u043c\u0438\u0440\u0435 Android \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0438\u0434\u0435\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u0437 Google Play \u0438 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0437\u0430\u0434 \u0438\u043b\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439? \u041c\u043e\u0436\u0435\u0442\u0435 \u0436\u0430\u0440\u043a\u043e \u043f\u043e\u0441\u043f\u043e\u0440\u0438\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p>\u0412 git \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0434\u0430\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><strong>Author Date<\/strong> &#8212; \u0442\u043e, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043b \u0430\u0432\u0442\u043e\u0440  \u0438 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0438\u0434\u0435\u0442\u044c \u0432 git log \u0438 git show. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043c\u0435\u0440\u0436\u0438\u0442\u0435 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c PR \u0433\u043e\u0434\u043e\u0432\u0430\u043b\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438. <\/p>\n<\/li>\n<li>\n<p><strong>Commit Date<\/strong> &#8212; \u0434\u0430\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043c\u043c\u0438\u0442 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u0431\u0440\u0430\u043d\u0447. \u041e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 merge \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u0432 \u0431\u0440\u0430\u043d\u0447. \u0412\u0440\u0435\u043c\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0434\u0435\u0442 \u0432\u043f\u0435\u0440\u0435\u0434 \u0438 Commit Date \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0436\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u0442\u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0432\u0430\u0448\u0438\u0445 \u0447\u0430\u0441\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Commit Date, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>%cd<\/code> \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u043d\u0433 \u0432 git log:<\/p>\n<pre><code>TZ=UTC0 git log --max-count=128 --pretty=format:%cd --date=iso-local<\/code><\/pre>\n<blockquote>\n<p>2023-04-23 10:37:01 +0000<br \/>2023-04-23 09:02:18 +0000<br \/>2023-04-19 14:43:21 +0000<br \/>2023-04-19 14:43:21 +0000<br \/>2023-04-19 01:39:03 +0000<\/p>\n<p>&lt;REDACTED><\/p>\n<\/blockquote>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0434\u0430\u0442\u044b \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0435\u0441\u043b\u0438 \u0436\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0435\u0431\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c \u0432 \u0434\u0435\u043d\u044c. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043d\u044f. \u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 2023.04.23-1, 2023.04.23-3, 2023.04.23-4 \u0438 \u0442.\u0434. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0446\u0438\u0444\u0440\u044b \u0447\u0430\u0441 x 60 + \u043c\u0438\u043d\u0443\u0442\u044b \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0430\u0441 (up to you). \u041d\u043e \u043d\u0430\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0447\u0438\u0441\u043b\u043e\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043d\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u043c. <\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435, \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e \u043d\u0430\u0434\u043e \u0437\u0430\u043f\u0438\u0445\u0430\u0442\u044c \u0432 \u0442.\u043d. <code>versionCode<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 <a href=\"https:\/\/developer.android.com\/studio\/publish\/versioning\" rel=\"noopener noreferrer nofollow\">\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d<\/a> \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u043c  0 &#8212; 2_100_000_000 (\u0447\u0443\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 31 \u0431\u0438\u0442\u0430). Version Code &#8212; \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0441 \u0447\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 Android \u0438 stores \u0434\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a Version Name \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0433\u0434\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u0441\u0451, \u0447\u0442\u043e \u0432\u044b \u043f\u043e\u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e.<\/p>\n<p> \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0432 Gradle (\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438):<\/p>\n<pre><code class=\"scala\">def getVersion() {   def time = Integer.parseInt(run(['git', 'log', '-1', '--format=%ct']).trim())   def cal = Calendar.getInstance(TimeZone.getTimeZone(\"UTC\"), Locale.ENGLISH)   cal.setTimeInMillis((long) time * 1000)   def year = cal.get(Calendar.YEAR)   def month = cal.get(Calendar.MONTH) + 1   def day = cal.get(Calendar.DAY_OF_MONTH)   def date_of_last_commit = String.format(\"%04d-%02d-%02d\", year, month, day)   def build = Integer.parseInt(run(['git', 'rev-list', '--count', '--after=\"' + date_of_last_commit + 'T00:00:00Z\"', 'HEAD']).trim())    \/\/ Use the last git commit date to generate the version code:   \/\/ RR_yy_MM_dd_CC   \/\/ - RR - reserved to identify special markets, max value is 21.   \/\/ - yy - year   \/\/ - MM - month   \/\/ - dd - day   \/\/ - CC - the number of commits from the current day   \/\/ 21_00_00_00_00 is the the greatest value Google Play allows for versionCode.   \/\/ See https:\/\/developer.android.com\/studio\/publish\/versioning for details.   def versionCode = (year - 2000) * 1_00_00_00 + month * 1_00_00 + day * 1_00 + build    \/\/ Use the current date to generate the version name:   \/\/ 2021.04.11-12-Google (-Google added by flavor)   def versionName = String.format(\"%04d.%02d.%02d-%d\", year, month, day, build)    return new Tuple2(versionCode, versionName)  }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0435 <code>versionCode<\/code> \u0438 <code>versionName<\/code> \u0438\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 <code>getVersion()<\/code>: <\/p>\n<pre><code class=\"scala\">android {   \/\/ &lt;REDACTED>   defaultConfig {     def ver = getVersion()     versionCode = ver.V1     versionName = ver.V2     println('Version: ' + versionName)     println('VersionCode: ' + versionCode)     \/\/ &lt;REDACTED>   }   \/\/ &lt;RE<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-385784","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/385784","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=385784"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/385784\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=385784"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=385784"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=385784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}