Firma automatica dell'app con Gradle quando si utilizza git
È incredibile quanti modi contorti ci siano per farlo. Ecco la mia strada, in cui provo ad aderire alla raccomandazione di Google . Tuttavia, la loro spiegazione non è completamente chiara, quindi descriverò dettagliatamente la procedura per Linux.
Descrizione:
Le istruzioni predefinite di Google per la firma automatica di un'app durante la compilazione, senza conservare le password e i file delle firme nel percorso di sviluppo dell'app (GIT), sono piuttosto oscure. Ecco le istruzioni dettagliate su come procedere.
Ipotesi iniziali:
Si dispone di un applicazione chiamata "MyApp" in una directory proposta dal seguente percorso:
$HOME/projects/mydev/MyApp
. Tuttavia, la directory MyApp viene utilizzata e controllata con GIT.
Problema
Ovviamente non vogliamo avere i nostri file di firma o password ovunque nella directory controllata da GIT, anche se siamo in grado di usare .gitignore
ecc, è ancora troppo rischioso e facile commettere un errore. Quindi vogliamo che i nostri file keystore e di firma all'esterno.
Soluzione
Dobbiamo fare tre (3) cose:
- Crea un file di password che verrà utilizzato da Android Studio
- Crea file chiave firma
- Modifica il
build.gradle
file del modulo per usare (1) e (2).
Per questo esempio chiamiamo i due file:
keystore.properties
MyApp-release-key.jks
Possiamo inserire entrambi questi file qui:
cd $HOME/projects/mydev/
(1) Creare il file della password del keystore
Il primo file contiene le password in chiaro utilizzate; e percorsi al file della chiave di rilascio in (2). Inizia compilando questo, in quanto faciliterà un'operazione di copia e incolla per il passaggio successivo.
cd $HOME/projects/mydev/
Modifica in keystore.properties
modo che il suo contenuto sia:
storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation
L'unica parte difficile qui, è il myStoreFileLocation
. Questo è il percorso visto dalbuild.gradle
file del modulo durante la compilazione. Ciò significa solitamente un percorso simile e relativa a: $HOME/projects/mydev/MyApp/app/build.gradle
. Quindi, per indicare il MyApp-release-key.jks
file, quello che dobbiamo mettere qui è:
../../../MyApp-release-key.jks
Qui, abbiamo anche scelto l'alias "myapp" per la chiave. Quindi il file finale dovrebbe apparire:
storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myapp
storeFile=../../../MyApp-release-key.jks
(2) Creare il file della firma
Il secondo file viene generato automaticamente quando si crea la chiave della firma. Se non hai altre app e questo è il tuo unico archivio chiavi, crea il file con:
cd $HOME/projects/mydev/
keytool -genkeypair -v -keystore MyApp-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias myapp
Questo ti chiederà due password e un mucchio di informazioni. (Stesse cose come in Android Studio.) Ora copia / incolla le password scelte in precedenza.
(3) Modifica il gradle.build
file del modulo per utilizzare quanto sopra
Le seguenti parti devono essere presenti nel file di build Gradle della tua app / modulo. Innanzitutto, aggiungi le seguenti righe all'esterno e prima del android {}
blocco.
//def keystorePropertiesFile = rootProject.file("$HOME/.android/keystore.properties")
def keystorePropertiesFile = rootProject.file("../../keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
Quindi, all'interno del android {}
blocco, aggiungi:
android {
...
defaultConfig { ... }
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
// Tell Gradle to sign your APK
buildTypes {
release {
signingConfig signingConfigs.release
...
}
}
}
Ora dalla shell, puoi ricostruire la tua app con:
cd $HOME/projects/mydev/MyApp/app/
./gradlew clean build
Ciò dovrebbe generare un'app firmata correttamente che può essere utilizzata in Google Play.
AGGIORNAMENTO: 2019-04-02
Versioni più recenti di keytool
e qualcosa ti sta dicendo che dovresti usare un file di chiavi basato su PKCS12 invece dell'originale / predefinito come uso sopra. Hanno poi andare su di te dicendo si dovrebbe convertire il nuovo formato aperto PKCS12. Tuttavia, sembra che gli strumenti di sviluppo Android non siano ancora pronti per questo, perché se lo fai, otterrai i seguenti strani errori:
com.android.ide.common.signing.KeytoolException:
Impossibile leggere la chiave XXX dall'archivio "F: \ XXX \ XXX.jks": Ottieni chiave non riuscita: dato blocco finale non correttamente riempito. Tali problemi possono sorgere se durante la decodifica viene utilizzata una chiave errata.
Quindi non usare una chiave convertita!