Ich versuche, den Signaturprozess so einzurichten, dass das Schlüsselspeicherkennwort und das Schlüsselkennwort nicht in der Projektdatei build.gradle
gespeichert werden.
Derzeit habe ich folgendes in build.gradle
:
android {
...
signingConfigs {
release {
storeFile file("my.keystore")
storePassword "store_password"
keyAlias "my_key_alias"
keyPassword "key_password"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
Es funktioniert einwandfrei, aber ich darf die Werte für storePassword
und keyPassword
in mein Repository nicht einfügen. Ich würde es vorziehen, nicht storeFile
und keyAlias
dort auch nicht zu setzen .
Gibt es eine Möglichkeit, das build.gradle
so zu ändern , dass Kennwörter von einer externen Quelle abgerufen werden (z. B. eine Datei, die sich nur auf meinem Computer befindet)?
Und natürlich build.gradle
sollte die Änderung auf jedem anderen Computer verwendbar sein (auch wenn der Computer keinen Zugriff auf Passwörter hat).
Ich verwende Android Studio und Mac OS X Maverics, wenn es wichtig ist.
quelle
build.gradle
sind, müssen Sie etwas anderes haben alsbuild.gradle
, ob Dies ist eine Anpassung an Umgebungsvariablen (pro Antwort), einer Eigenschaftendatei (pro Antwort) oder auf andere Weise. Wenn Sie nicht bereit sind, Dinge außerhalb von zu habenbuild.gradle
, müssen per Definition alle Signaturinformationen innerhalb seinbuid.gradle
.Antworten:
Das Schöne an Groovy ist, dass Sie Java-Code frei mischen können und es ziemlich einfach ist, eine Schlüssel- / Wertedatei mit zu lesen
java.util.Properties
. Vielleicht gibt es eine noch einfachere Möglichkeit, idiomatisches Groovy zu verwenden, aber Java ist immer noch ziemlich einfach.Erstellen Sie eine
keystore.properties
Datei (in diesem Beispiel im Stammverzeichnis Ihres Projekts nebensettings.gradle
, können Sie sie jedoch beliebig ablegen:Fügen Sie dies zu Ihrem hinzu
build.gradle
:quelle
storeFile file('AndroidManifest.xml')
) und das spätere Überschreiben dazu führt, dass der Signaturprozess stattfindet.Error:(24, 0) Could not find property 'android' on root project 'RootProjectName'
bei dem Zeile 24 diejenige mit dem if-Block ist. Durch Hinzufügenapply plugin: 'com.android.application'
zum Root-Build.g.gle schlägt der Build ebenfalls fehl. Was mache ich falsch?Could not get unknown property 'android' for root project
Wenn Sie die Antwort von Scott Barta auf eine Weise anwenden möchten, die dem automatisch generierten Gradle-Code ähnlicher ist, können Sie alternativ eine
keystore.properties
Datei in Ihrem Projektstammordner erstellen :und ändern Sie Ihren Gradle-Code zu:
Sie können diese Eigenschaftendatei im Stammverzeichnis Ihres Moduls speichern. In diesem Fall können Sie sie einfach weglassen
rootProject
. Sie können diesen Code auch so ändern, dass mehrere Eigenschaftensätze für verschiedene Schlüsselspeicher und Schlüsselaliasnamen vorhanden sind.quelle
if ( keystorePropertiesFile.exists() )
sichergestellt, dass die Datei vorhanden ist, bevor ich versucht habe, die Attribute abzurufen und zu signieren..txt
am Ende derkeystore.properties
Datei eine Erweiterung hinzuzufügen ..txt
Erweiterung für diekeystore.properties
Datei benötigen .Am einfachsten ist es, eine
~/.gradle/gradle.properties
Datei zu erstellen .Dann kann Ihre
build.gradle
Datei folgendermaßen aussehen:quelle
Nach dem Lesen einiger Links:
http://blog.macromates.com/2006/keychain-access-from-shell/ http://www.thoughtworks.com/es/insights/blog/signing-open-source-android-apps-without-disclosing- Passwörter
Da Sie Mac OSX verwenden, können Sie Ihre Kennwörter über den Schlüsselbundzugriff speichern.
Dann in Ihren Gradle-Skripten:
Verwenden Sie wie folgt:
quelle
So mache ich es. Umgebungsvariablen verwenden
quelle
Neither path nor baseDir may be null or empty string. path='null'
Es ist möglich, ein vorhandenes Android Studio-Gradle-Projekt über die Befehlszeile zu erstellen / zu signieren, ohne Dateien zu bearbeiten. Dies macht es sehr schön, Ihr Projekt in der Versionskontrolle zu speichern, während Sie Ihre Schlüssel und Kennwörter getrennt und nicht in Ihrer build.gradle-Datei aufbewahren:
quelle
Die akzeptierte Antwort verwendet eine Datei, um zu steuern, welcher Schlüsselspeicher zum Signieren der APK verwendet werden soll, die sich im selben Stammordner des Projekts befindet. Wenn wir VCS wie Git verwenden , kann dies eine schlechte Sache sein, wenn wir vergessen, die Eigenschaftendatei hinzuzufügen, um die Liste zu ignorieren. Weil wir unser Passwort der Welt mitteilen werden. Die Probleme bestehen weiterhin.
Anstatt die Eigenschaftendatei in demselben Verzeichnis innerhalb unseres Projekts zu erstellen, sollten wir sie außerhalb erstellen. Wir schaffen es nach draußen, indem wir die Datei gradle.properties verwenden.
Hier die Schritte:
1.Bearbeiten oder erstellen Sie gradle.properties in Ihrem Stammprojekt und fügen Sie den folgenden Code hinzu. Denken Sie daran, den Pfad mit Ihrem eigenen zu bearbeiten:
2.Erstellen Sie androidproject.properties in / your / path / und fügen Sie den folgenden Code hinzu. Vergessen Sie nicht, /your/path/to/android.keystore in Ihren Keystore-Pfad zu ändern:
3. Fügen Sie in Ihrem App-Modul build.gradle (nicht in Ihrem Projekt root build.gradle) den folgenden Code hinzu, falls nicht vorhanden, oder passen Sie ihn an:
4. Fügen Sie den folgenden Code unter dem Code in Schritt 3 hinzu:
Dieser Code sucht ab Schritt 1 in gradle.properties nach der Eigenschaft AndroidProject.signing . Wenn die Eigenschaft gefunden wird, wird der Eigenschaftswert als Dateipfad übersetzt, der auf androidproject.properties verweist, die wir in Schritt 2 erstellt haben . Dann wird der gesamte Eigenschaftswert daraus als Signaturkonfiguration für unser build.gradle verwendet.
Jetzt müssen wir uns nicht mehr um das Risiko kümmern, unser Keystore-Passwort preiszugeben.
Lesen Sie mehr bei Signing Android apk, ohne Keystore-Informationen in build.gradle zu setzen
quelle
Für diejenigen, die ihre Anmeldeinformationen in eine externe JSON-Datei einfügen und aus dem Gradle lesen möchten, habe ich Folgendes getan:
my_project / credentials.json:
my_project / android / app / build.gradle
Der Grund, warum ich einen
.json
Dateityp und keinen.properties
Dateityp gewählt habe (wie in der akzeptierten Antwort), ist, dass ich auch andere Daten (andere benutzerdefinierte Eigenschaften, die ich benötigte) in derselben Datei speichern wollte (my_project/credentials.json
) und trotzdem gradle parse the Signieren von Informationen auch aus dieser Datei.quelle
Diese Frage hat viele gültige Antworten erhalten, aber ich wollte meinen Code teilen, was für Bibliotheksverwalter nützlich sein kann , da das Original dadurch
build.gradle
ziemlich sauber bleibt .Ich füge dem Modulverzeichnis einen Ordner hinzu, den ich
gitignore
. Es sieht aus wie das:keystore.jks
undsigning.properties
sollte selbsterklärend sein. Undsigning.gradle
sieht so aus:Und das Original
build.gradle
Wie Sie sehen, müssen Sie die buildTypes überhaupt nicht angeben. Wenn der Benutzer Zugriff auf ein gültiges
signing
Verzeichnis hat, legt er es einfach in das Modul und kann eine gültige signierte Release-Anwendung erstellen, andernfalls funktioniert es nur für ihn es würde normalerweise tun.quelle
apply from
sollte nach demandroid
Block kommenSie können Kennwörter über die Befehlszeile anfordern:
Diese Antwort wurde zuvor angezeigt: https://stackoverflow.com/a/33765572/3664487
quelle
Mein Passwort enthielt ein Sonderzeichen, das Dollarzeichen $ und ich musste es in der Datei gradle.properties umgehen. Danach hat das Signieren für mich funktioniert.
quelle