рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рдЧреНрд░реИрдбрд▓ рдЖрдкрдХреЛ рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдкреИрдХреЗрдЬ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ Google Play рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╢рд╛рдпрдж рд╣реА рдХреБрдЫ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдВрдбрд╛рд░ рдореЗрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдПрдХ рд▓реЗрдЦ рдореЗрдВ, рд▓реЗрдЦрдХ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди рдкрд╛рд╕рд╡рд░реНрдб рдЬреИрд╕реЗ рдирд┐рдЬреА рдЬрд╛рдирдХрд╛рд░реА рдХреИрд╕реЗ рджрд░реНрдЬ рдХрд░реЗрдВред
Gradle рдЖрдкрдХреЛ System.console () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдВрд╕реЛрд▓ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХрдВрд╕реЛрд▓ рдкрд╛рд╕рд╡рд░реНрдб рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
def password = System.console().readPassword("\nPlease enter key passphrase: ")
рдЕрдм рдЖрдк рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд╣реАрдВ рднреА рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ ... рдУрд╣, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдкреЛрд╕реНрдЯ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЕрдм рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
рд╕рдорд╕реНрдпрд╛ рдирдВрдмрд░ 1 - рдореБрдЭреЗ рд▓рдЧрд╛рддрд╛рд░ рдкрд╛рдЗрд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рдЖрдк рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдЕрдкрдиреЗ build.gradle рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдХреБрдЫ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЪрд▓рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рдХреБрдЫ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд╡реИрд╕реЗ рднреА рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд╛рд░реНрдп рдХреЛ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП
рдЯрд╛рд╕реНрдХрдЧреНрд░рд╛рдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рдХреБрдВрдЬреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЯрд╛рд╕реНрдХрдЧреНрд░рд╛рдл рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рднрд░рд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рднрд░рдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
gradle.taskGraph.whenReady { taskGraph ->
рдмрд╕ рдЗрд╕ рдХреЛрдб рдХреЛ рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд░рдЦреЗрдВ рдФрд░ рдЧреНрд░рд╛рдл рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдХрд╛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдХрд╛рд░реНрдп рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЯрд╛рд╕реНрдХрдЧреНрд░рд╛рдл рдореЗрдВ рдПрдХ рд╣реИрдЯрд╕реНрдХ () рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдирд╛рдо рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдХреЛрд▓рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдХрд╛рд░реНрдп рдХреБрдЫ рд╕рдмрдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ), рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рднреА рдмрддрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЙрдбреНрдпреВрд▓ рд╣реЛрдиреЗ рджреЗрдВ рдФрд░ рдЬрдм рд╣рдо рдЕрд╕реЗрдВрдмрд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рддреЛ рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
gradle.taskGraph.whenReady { taskGraph -> if(taskGraph.hasTask(':app:assembleRelease')) { // , def pass = System.console().readPassword("\nPlease enter key passphrase: ") // readPassword char[], String pass = new String(pass) // pass } }
рдЕрдм рдЬрдм рддрдХ рд╡рд╣ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрдЧреА рддрдм рддрдХ рдЖрдкрдХреЛ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рдорд╕реНрдпрд╛ рд╕рдВрдЦреНрдпрд╛ 2 - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдВрд╕реЛрд▓ рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рдЖрдк IDE (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ) рдХреЗ рдКрдкрд░ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛
gradle.daemon рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдВрд╕реЛрд▓ (System.console () рд╡рд╛рдкрд╕ рд╢реВрдиреНрдп) рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреА рдФрд░ рдЕрдкрд╡рд╛рдж рдХреЗ рдХрд╛рд░рдг рдЕрд╕реЗрдВрдмрд▓реА рдЯреВрдЯ рдЬрд╛рдПрдЧреАред рд▓реЗрдХрд┐рди рдШрдмрд░рд╛рдЗрдП рдирд╣реАрдВ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдВрд╕реЛрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рдпреВрдЖрдИ рд╣реИред рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд╛рд╕рд╡рд░реНрдб рдбрд╛рдпрд▓реЙрдЧ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП Groovy рд╕реЗ SwngBuilder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдкрдиреЗ build.gradle рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рд░рдЦреЗрдВ:
import groovy.swing.SwingBuilder
рдЕрдм рдЖрдк рд╕рд░рд▓ рдЗрдирдкреБрдЯ рд╕рдВрд╡рд╛рдж рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП SwingBuilder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
def pass = '' new SwingBuilder().edt { dialog(modal: true, // , . title: 'Enter password', alwaysOnTop: true, resizable: false, locationRelativeTo: null, // . pack: true, show: true ) { vbox { label(text: "Please enter key passphrase:") input = passwordField() button(defaultButton: true, text: 'OK', actionPerformed: { pass = input.password; dispose(); }) } } }
рдЗрд╕ рдХреЛрдб рдХреЛ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдЬреЛрдбрд╝реЗрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдкрд╛рд╕ рдЪрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред
рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛ред
рдЪрд▓рд┐рдП рдЕрдм рдЗрд╕реЗ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦ рджреЗрддреЗ рд╣реИрдВред рдпреВрдЖрдИ рдЕрдЪреНрдЫрд╛ рд╣реИ (рдареАрдХ рд╣реИ, рдЬреЛ рд╣рдо рдкрд╣рд▓реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рдереЗ рд╡рд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
рд╕реНрд╡рд┐рдВрдЧрдмрд░реНрд╕реНрдЯ рдбреЙрдХреНрд╕ ), рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдПрдХ рдРрд╕реА рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдХреЗрд╡рд▓ рдПрдХ рдХрдВрд╕реЛрд▓ рд╣реИ рдФрд░ рдХреЛрдИ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реИ (рдмрд┐рд▓реНрдб рд╕рд░реНрд╡рд░ рдХреА рддрд░рд╣) рдФрд░ рдХрднреА-рдХрднреА рдЕрдкрдиреА рдЖрдИрдбреАрдИ рд╕реЗред рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рд░рджреНрдж рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдЖрдкрдХреА рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП:
gradle.taskGraph.whenReady { taskGraph -> if(taskGraph.hasTask(':app:assembleRelease')) { def pass = '' if(System.console() == null) { new SwingBuilder().edt { dialog(modal: true, title: 'Enter password', alwaysOnTop: true, resizable: false, locationRelativeTo: null, pack: true, show: true ) { vbox { label(text: "Please enter key passphrase:") input = passwordField() button(defaultButton: true, text: 'OK', actionPerformed: { pass = input.password dispose(); }) } } } } else { pass = System.console().readPassword("\nPlease enter key passphrase: ") pass = new String(pass) } if(pass.size() <= 0) { throw new InvalidUserDataException("You must enter a password to proceed.") }
рдЧреНрд░реВрд╡реА рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдбреБрдмрдХреА рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдЗрд╕ UI рдХреЛ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░ рд╕рдХрддреЗ рд╣реИрдВред