webentwicklung-frage-antwort-db.com.de

Geben Sie die Signatur in gradle.properties für Android frei

Ich versuche also, alle meine Ant-Build-Skripts in Gradle zu konvertieren, und ich habe in der Lage, umfangreiche Ressourcen und Dokumentation dazu zu finden, mit Ausnahme der Konfiguration der Signierung in der Datei gradle.properties.

ant.properties macht es so:

key.alias=alias
key.store.password=password
key.store=keystore.file
key.alias.password=password

Aber wie mache ich das in gradle?

19
Gnathonic

In Ihrer Datei gradle.properties speichern Sie dieselben Werte wie in der Datei ant.properties . Ich denke, Sie müssen einfachere Namen verwenden, wie zum Beispiel keyAlias. Entfernen Sie einfach die Punkte, um sicher zu sein.

dann machen Sie in Ihrer build.gradle -Datei so etwas:

Android {
    signingConfigs {
        release
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

if (project.hasProperty('keyAlias')) {
    Android.signingConfigs.release.keyAlias = keyAlias
}
// do the same for the three other properties
// ...

Auf diese Weise können Sie auf einem Computer mit der Datei gradle.properties bauen oder nicht. Die "keyalias" -Eigenschaft wird nur gelesen, wenn sie vorhanden ist, so dass der Code nicht fehlschlägt, wenn er nicht vorhanden ist.

Wenn alle Eigenschaften vorhanden sind, wird signingConfigs.release vollständig konfiguriert und zum Signieren der apk während des Builds verwendet. Ist dies nicht der Fall, wird der APK erstellt, aber nicht signiert.

33
Xavier Ducrohet

Ich konnte es mit folgendem machen. Ich habe die Lösung von @ Xav ausprobiert, die sich jedoch während des Freigabevorgangs beschweren würde, wenn die Eigenschaften nicht festgelegt wurden. Ich bin mir sicher, dass dies eine kürzliche Änderung ist, weil sich der Rahmen stark verändert hat. Ich wollte nur helfen, indem ich darauf hinwies, dass ich mit der Variablen else ganz am Ende die Freigabe signingConfig auf null setzen konnte. Nun werden sowohl signierte als auch nicht signierte Releases in Abhängigkeit von der Anwesenheit von gradle.properties ausgeführt.

signingConfigs {
    release {
        keyAlias = "blue_sleep"
    }
}

buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}

if (project.hasProperty('storeFile') &&
        project.hasProperty('storePassword') &&
        project.hasProperty('keyPassword')) {
    Android.signingConfigs.release.storeFile = file(storeFile)
    Android.signingConfigs.release.storePassword = storePassword
    Android.signingConfigs.release.keyPassword = keyPassword
} else {
    Android.buildTypes.release.signingConfig = null
}

Einige andere nützliche Hinweise können Sie die gradle.properties in ~/.gradle/einfügen, wenn Sie nicht möchten, dass sie im Projektordner gespeichert wird. Sie können auch die storeFile-Eigenschaft mit einem absoluten Pfad wie folgt festlegen: storePath=file:///Users/nick/Dropbox/mycompany.keystore

22
GrkEngineer

Inspiriert durch die Lösung von Eugens kam ich zu einer etwas kürzeren Varianz. Der Code muss sich in der Android {} Taskkonfiguration befinden.

File signFile = rootProject.file('sign.properties')
if (signFile.exists()) {
    Properties p = new Properties()
    p.load(new FileInputStream(signFile))
    signingConfigs {
        releaseConfig {
            storeFile file(p.storeFile)
            storePassword p.storePassword
            keyAlias p.keyAlias
            keyPassword p.keyPassword
        }
    }
    buildTypes.release.signingConfig signingConfigs.releaseConfig
}
5
Moritz

In Gradle 1.9 können Sie keine Eigenschaften definieren. Sie können sie jetzt nur zu ext hinzufügen. Kleine Ergänzung zu früheren Antworten:

signingConfigs {
    debug {
        project.ext.loadSign = false
    }
    release {
        project.ext.loadSign = true
    }
}

buildTypes {
    debug {
        signingConfig signingConfigs.debug
    }
    release {
        signingConfig signingConfigs.release
    }
}

if ( project.ext.loadSign ) {
    Properties p = new Properties ()
    p.load ( new FileInputStream ( rootProject.file ( 'keys/sign.properties' ) ) )

    Android.signingConfigs.release.storeFile file ( p.file )
    Android.signingConfigs.release.storePassword p.password
    Android.signingConfigs.release.keyAlias p.alias
    Android.signingConfigs.release.keyPassword p.keyPassword
}
3
Eugen Martynov
2
Stan Sidel

Meine Anforderungen waren, dass jeder ohne den Keystore richtig bauen kann. Dies ist der sauberste Weg, den ich finden konnte: 

Android {
    signingConfigs {
        release    //Filled in readSigningConfigIfAvailable()
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-xyz.txt'
            readSigningConfigIfAvailable()
        }
    }
}

private void readSigningConfigIfAvailable() {
    if (hasAllSigningProperties()) {
        Android.signingConfigs.release.storeFile = file(keystore_path)
        Android.signingConfigs.release.storePassword = keystore_password
        Android.signingConfigs.release.keyAlias = key_alias
        Android.signingConfigs.release.keyPassword = key_password
        Android.buildTypes.release.signingConfig = Android.signingConfigs.release
    } else {
        Android.buildTypes.release.signingConfig = null
    }
}

private boolean hasAllSigningProperties() {
    (hasProperty('keystore_path')
    && hasProperty('keystore_password')
    && hasProperty('key_alias')
    && hasProperty('key_password'))
}
0