рдПрдВрдбреНрд░реЙрдЗрдб: рдбрд╛рдпрдирд╛рдорд┐рдХ рдкреНрд░реЛрдбрдХреНрдЯ рдлреНрд▓реЗрд╡рд░ рдФрд░ рд╕рд╛рдЗрдирд┐рдВрдЧ рдХрдиреНрдлрд┐рдЧреНрд╕

рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЬреЛ рд╡реАрдбрд┐рдпреЛ рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╣реИ, рдмрд╛рд╣рд░реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рдЙрддреНрдкрд╛рдж рдЬрд╛рдпрдХреЗ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЧрдпрд╛ред рдХрдЯ рдХреЗ рддрд╣рдд рд╡рд┐рд╡рд░рдгред


рд╕реНрд░реЛрдд рдбреЗрдЯрд╛


рдПрдХ рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ, рдЬреЛ рд╡реАрдбрд┐рдпреЛ рд╕рд╛рдордЧреНрд░реА рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдордВрдЪ рд╣реИред рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЖрдзрд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдЕрдВрддрд░ REST API рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдмреИрдирд░, рд░рдВрдЧ, рдлреЛрдВрдЯ, рдЖрджрд┐) рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рддреАрди рд╕реНрд╡рд╛рдж рдЖрдпрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:


  1. рдмрд╛рдЬрд╛рд░ : рдЧреВрдЧрд▓ рдпрд╛ рдЕрдореЗрдЬрд╝рдиред рдХреНрдпреЛрдВрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ Google Play рдкрд░ рдФрд░ рдЕрдореЗрдЬрд╝рди рдорд╛рд░реНрдХреЗрдЯрдкреНрд▓реЗрд╕ рджреЛрдиреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд┐рддрд░рдг рдХреА рдЬрдЧрд╣ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдЕрдореЗрдЬрд╝реЕрди Google рд╕реЗ рдЗрди-рдРрдк рдЦрд░реАрджрд╛рд░реА рддрдВрддреНрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рддрдВрддреНрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
  2. рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ : "рд╕рдорд░реНрдердХ" рдпрд╛ "рдордВрдЪрди"ред рдЙрддреНрдкрд╛рджрди рдФрд░ рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдиред
  3. рд╕рд╛рдЗрдЯ : рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдпрд╛рдоред ApplicationId рдФрд░ SignConfig рд╕реЗрдЯ рдХрд░реЗрдВред

рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛


рдПрдХ рдирдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп, рдЙрддреНрдкрд╛рдж рд╕реНрд╡рд╛рдж рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛:


application1 { dimension 'site' applicationId 'com.damsols.application1' signingConfig signingConfigs.application1 } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдЪрд┐рдд рд╕рд╛рдЗрдирд┐рдВрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛:


 application1 { storeFile file("path_to_keystore1.jks") storePassword "password1" keyAlias "application1" keyPassword "password1" } 

рд╕рдорд╕реНрдпрд╛рдПрдВ:


  1. рдПрдХ рдЖрд╡реЗрджрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдЪ рд▓рд╛рдЗрдиреЗрдВ, рдХреЗрд╡рд▓ ApplicationId рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рднрд┐рдиреНрдиред рдЬрдм рдЖрд╡реЗрджрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 50 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдИ, рддреЛ рдмрд┐рд▓реНрдб.рдЧреНрд░реЗрдбрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ 500 рд╕реЗ рдЕрдзрд┐рдХ рдЖрд╡реЗрджрди рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рдереАред
  2. рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреАрд╕реНрдЯреЛрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рджреЗ-рдкрд╛рда рдХреА рдЬрд╛рдирдХрд╛рд░реА рдореЗрдВ рднрдВрдбрд╛рд░рдгред

рдмрд┐рд▓реНрдб.рдЧреНрд░реЗрдб рдЙрджрд╛рд╣рд░рдг
 apply plugin: 'com.android.application' android { compileSdkVersion 28 defaultConfig { minSdkVersion 23 targetSdkVersion 28 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false } } flavorDimensions "site", "endpoint", "market" signingConfigs { application1 { storeFile file("application1.jks") storePassword "password1" keyAlias "application1" keyPassword "password1" } application2 { storeFile file("application2.jks") storePassword "password2" keyAlias "application2" keyPassword "password2" } application3 { storeFile file("application3.jks") storePassword "password3" keyAlias "application3" keyPassword "password3" } } productFlavors { pro { dimension 'endpoint' } staging { dimension 'endpoint' } google { dimension 'market' } amazon { dimension 'market' } application1 { dimension 'site' applicationId "com.damsols.application1" signingConfig signingConfigs.application1 } application2 { dimension 'site' applicationId "com.damsols.application2" signingConfig signingConfigs.application2 } application3 { dimension 'site' applicationId "com.damsols.application3" signingConfig signingConfigs.application3 } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' } 

рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдирд╛


рдкрд╣рд▓рд╛ рдХрджрдо рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдХ рдЕрд▓рдЧ json рдлрд╛рдЗрд▓ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдирд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рд╛рджреЗ-рдкрд╛рда рдореЗрдВ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ (рд╣рдо GPG рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ) рдФрд░ рдЗрд╕реЗ рд╕реАрдзреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд┐рд▓реНрдб рдХреЗ рджреМрд░рд╛рди рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рддреЗ рд╣реИрдВред JSON рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рд╕рдВрд░рдЪрдирд╛ рд╣реИ:


 { "signingConfigs":[ { "configName":"application1", "storeFile":"application1.jks", "storePassword":"password1", "keyAlias":"application1", "keyPassword":"password1" }, { "configName":"application2", "storeFile":"application2.jks", "storePassword":"password2", "keyAlias":"application2", "keyPassword":"password2" }, { "configName":"application3", "storeFile":"application3.jks", "storePassword":"password3", "keyAlias":"application3", "keyPassword":"password3" }, ] } 

Build.gradle рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдиреБрднрд╛рдЧ рд╕рд╛рдЗрдирд┐рдВрдЧ рдХреЙрдирдлрд┐рдЧреНрд╕ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдЙрддреНрдкрд╛рдж рдЬрд╛рдпрдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдВ


рдЖрдпрд╛рдо = "рд╕рд╛рдЗрдЯ" рдХреЗ рд╕рд╛рде рдЙрддреНрдкрд╛рдж рд╕реНрд╡рд╛рдж рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдИ рдЧрдИ рдереА, рдФрд░ рдЖрдпрд╛рдо = "рд╕рд╛рдЗрдЯ" рдХреЗ рд╕рд╛рде рд╕рднреА рдЙрддреНрдкрд╛рдж рд╕реНрд╡рд╛рдж рд╣рдЯрд╛ рджрд┐рдП рдЧрдП рдереЗред
рдпрд╣ рдерд╛:


 ... productFlavors { pro { dimension 'endpoint' } staging { dimension 'endpoint' } google { dimension 'market' } amazon { dimension 'market' } application1 { dimension 'site' applicationId "com.damsols.application1" signingConfig signingConfigs.application1 } application2 { dimension 'site' applicationId "com.damsols.application2" signingConfig signingConfigs.application2 } application3 { dimension 'site' applicationId "com.damsols.application3" signingConfig signingConfigs.application3 } } } ... 

рдпрд╣ рдмрди рдЧрдпрд╛:


 ... productFlavors { pro { dimension 'endpoint' } staging { dimension 'endpoint' } google { dimension 'market' } amazon { dimension 'market' } } def applicationDefinitions = [ ['name': 'application1', 'applicationId': 'com.damsols.application1'], ['name': 'application2', 'applicationId': 'com.damsols.application2'], ['name': 'application3', 'applicationId': 'com.damsols.application3'] ] } ... 

рдЧрддрд┐рд╢реАрд▓ рдЙрддреНрдкрд╛рдж рд╕реНрд╡рд╛рдж рдирд┐рд░реНрдорд╛рдг


рдЕрдВрддрд┐рдо рдЪрд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рдирдбрд┐рдлрд┐рдирд┐рд╢рди рдПрд░реЗ рд╕реЗ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рд╣рд░реА JSON рдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрд╛рдж рдХреЗ рд╕реНрд╡рд╛рдж рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ред


 def applicationDefinitions = [ ['name': 'application1', 'applicationId': 'com.damsols.application1'], ['name': 'application2', 'applicationId': 'com.damsols.application2'], ['name': 'application3', 'applicationId': 'com.damsols.application3'] ] def signKeysFile = file('signkeys/signkeys.json') def signKeys = new JsonSlurper().parseText(signKeysFile.text) def configs = signKeys.signingConfigs def signingConfigsMap = [:] configs.each { config -> signingConfigsMap[config.configName] = config } applicationDefinitions.each { applicationDefinition -> def signingConfig = signingConfigsMap[applicationDefinition['name']] android.productFlavors.create(applicationDefinition['name'], { flavor -> flavor.dimension = 'site' flavor.applicationId = applicationDefinition['applicationId'] flavor.signingConfig = android.signingConfigs.create(applicationDefinition['name']) flavor.signingConfig.storeFile = file(signingConfig.storeFile) flavor.signingConfig.storePassword = signingConfig.storePassword flavor.signingConfig.keyAlias = signingConfig.keyAlias flavor.signingConfig.keyPassword = signingConfig.keyPassword }) } 

рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд╕реНрдЯреЛрд░реЗрдЬ рд╕реЗ рд░реАрдбрд┐рдВрдЧ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реЗрдХреНрд╢рди рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛


 def signKeysFile = file('signkeys/signkeys.json') def signKeys = new JsonSlurper().parseText(signKeysFile.text) def configs = signKeys.signingConfigs 

рдПрдХ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдПред


build.gradle рдкреВрд░рд╛ рдХрд░реЗрдВ
 import groovy.json.JsonSlurper apply plugin: 'com.android.application' android { compileSdkVersion 28 defaultConfig { minSdkVersion 23 targetSdkVersion 28 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false } } flavorDimensions "site", "endpoint", "market" signingConfigs {} productFlavors { pro { dimension 'endpoint' } staging { dimension 'endpoint' } google { dimension 'market' } amazon { dimension 'market' } } } def applicationDefinitions = [ ['name': 'application1', 'applicationId': 'com.damsols.application1'], ['name': 'application2', 'applicationId': 'com.damsols.application2'], ['name': 'application3', 'applicationId': 'com.damsols.application3'] ] def signKeysFile = file('signkeys/signkeys.json') def signKeys = new JsonSlurper().parseText(signKeysFile.text) def configs = signKeys.signingConfigs def signingConfigsMap = [:] configs.each { config -> signingConfigsMap[config.configName] = config } applicationDefinitions.each { applicationDefinition -> def signingConfig = signingConfigsMap[applicationDefinition['name']] android.productFlavors.create(applicationDefinition['name'], { flavor -> flavor.dimension = 'site' flavor.applicationId = applicationDefinition['applicationId'] flavor.signingConfig = android.signingConfigs.create(applicationDefinition['name']) flavor.signingConfig.storeFile = file(signingConfig.storeFile) flavor.signingConfig.storePassword = signingConfig.storePassword flavor.signingConfig.keyAlias = signingConfig.keyAlias flavor.signingConfig.keyPassword = signingConfig.keyPassword }) } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' } 

рдЧрд┐рдЯрд╣рдм рд▓рд┐рдВрдХ


рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/hi434994/


All Articles