621 Stimmen

Wie erstellt man eine signierte Release-APK-Datei mit Gradle?

Ich möchte, dass mein Gradle-Build eine signierte Release-APK-Datei unter Verwendung von Gradle erstellt.

Ich bin mir nicht sicher, ob der Code korrekt ist oder ob ich einen Parameter vermisse, wenn ich gradle build ausführe?

Dies ist ein Teil des Codes in meiner build.gradle/build.gradle.kts-Datei:

android {
    ...
    signingConfigs {
        release {
            storeFile(file("release.keystore"))
            storePassword("******")
            keyAlias("******")
            keyPassword("******")
        }
    }
}

Der Gradle-Build wird ERFOLGREICH abgeschlossen, und in meinem build/apk-Ordner sehe ich nur die Dateien ...-release-unsigned.apk und ...-debug-unaligned.apk.

Irgendwelche Vorschläge, wie man das lösen kann?

6voto

SRC Punkte 415

Die Antwort von David Vavra erweitern, erstellen Sie eine Datei ~/.gradle/gradle.properties und fügen Sie hinzu

RELEASE_STORE_FILE=/pfad/zum/.keystore
RELEASE_KEY_ALIAS=XXXXX
RELEASE_STORE_PASSWORD=XXXXXXXXX
RELEASE_KEY_PASSWORD=XXXXXXXXX

Dann im build.gradle

  signingConfigs {
    release {
    }
  }

  buildTypes {
    release {
      minifyEnabled true
      shrinkResources true

    }
  }

  // mache dies optional
  if ( project.hasProperty("RELEASE_KEY_ALIAS") ) {
    signingConfigs {
      release {
        storeFile file(RELEASE_STORE_FILE)
        storePassword RELEASE_STORE_PASSWORD
        keyAlias RELEASE_KEY_ALIAS
        keyPassword RELEASE_KEY_PASSWORD
      }
    }
    buildTypes {
      release {
        signingConfig signingConfigs.release
      }
    }
  }

4voto

Ahamadullah Saikat Punkte 3960

Android Studio Gehe zu Datei -> Projektstruktur oder drücke Strg+Alt+Umschalt+S

Siehe das Bild

Gib hier die Bildbeschreibung ein

Klicke auf Ok

Dann wird das signingConfigs in deiner build.gradle-Datei generiert.

Gib hier die Bildbeschreibung ein

4voto

argenkiwi Punkte 1990

Ein weiterer Ansatz für das gleiche Problem. Da es nicht empfohlen wird, jegliche Zugangsdaten im Quellcode zu speichern, haben wir uns entschieden, die Passwörter für den Schlüsselspeicher und den Schlüsselalias in einer separaten Eigenschaftsdatei wie folgt festzulegen:

key.store.password=[SPEICHERPASSWORT]
key.alias.password=[SCHLÜSSEL PASSWORT]

Wenn Sie git verwenden, können Sie eine Textdatei namens, beispielsweise, secure.properties erstellen. Stellen Sie sicher, dass Sie diese aus Ihrem Repository ausschließen (bei Verwendung von git, fügen Sie sie zur .gitignore-Datei hinzu). Anschließend müssten Sie eine Signaturkonfiguration erstellen, wie einige der anderen Antworten bereits erwähnten. Der einzige Unterschied besteht darin, wie Sie die Zugangsdaten laden würden:

android {
    ...
    signingConfigs {
        ...
        release {
            storeFile file('[PFAD ZU]/your_keystore_file.jks')
            keyAlias "your_key_alias"

            File propsFile = file("[PFAD ZU]/secure.properties");
            if (propsFile.exists()) {
                Properties props = new Properties();
                props.load(new FileInputStream(propsFile))
                storePassword props.getProperty('key.store.password')
                keyPassword props.getProperty('key.alias.password')
            }
        }
        ...
    }

    buildTypes {
        ...
        release {
            signingConfig signingConfigs.release
            runProguard true
            proguardFile file('proguard-rules.txt')
        }
        ...
    }
}

Vergessen Sie niemals, die signingConfig manuell dem Release-Build-Typ zuzuweisen (irgendwie gehe ich manchmal davon aus, dass sie automatisch verwendet wird). Außerdem ist es nicht zwingend erforderlich, Proguard zu aktivieren, aber es wird empfohlen.

Wir bevorzugen diesen Ansatz gegenüber der Verwendung von Umgebungsvariablen oder der Anforderung von Benutzereingaben, da dies direkt aus der IDE heraus erfolgen kann, indem Sie zum Release-Build-Typ wechseln und die App ausführen, anstatt den Befehlszeilen zu verwenden.

2voto

Botond Kopacz Punkte 914

Ich hatte mehrere Probleme, weil ich die folgende Zeile an der falschen Stelle platziert habe:

signingConfigs {
    release {
        // Wir können diese in Umgebungsvariablen lassen
        storeFile file("d:\\Fejlesztés\\******.keystore")
        keyAlias "mykey"

        // Diese beiden Zeilen lassen Gradle glauben, dass der signingConfigs
        // Abschnitt vollständig ist. Ohne sie werden Aufgaben wie installRelease
        // nicht verfügbar sein!
        storePassword "*****"
        keyPassword "******"
    }
}

Vergewissern Sie sich, dass Sie die signingConfigs-Teile innerhalb des android-Abschnitts platzieren:

android {
    ....
    signingConfigs {
        release {
          ...
        }
    }
}

anstatt

android {
    ....
}

signingConfigs {
   release {
        ...
   }
}

Es ist einfach, diesen Fehler zu machen.

1voto

user2768 Punkte 734

Sie können Passwörter von der Befehlszeile aus anfordern:

...

signingConfigs {
  if (gradle.startParameter.taskNames.any {it.contains('Release') }) {
    release {
      storeFile file("your.keystore")
      storePassword new String(System.console().readPassword("\n\$ Geben Sie das Keystore-Passwort ein: "))
      keyAlias "key-alias"
      keyPassword new String(System.console().readPassword("\n\$ Geben Sie das Schlüsselpasswort ein: "))
    } 
  } else {
    //Hier sind Drachen: Der unerreichbare else-Zweig zwingt Gradle dazu, 
    //install...Release Aufgaben zu erstellen.
    release {
      keyAlias 'dummy'
      keyPassword 'dummy'
      storeFile file('dummy')
      storePassword 'dummy'
    } 
  }
}

...

buildTypes {
  release {

    ...

    signingConfig signingConfigs.release
  }

  ...
}

...

Der if-then-else-Block verhindert die Aufforderung zur Eingabe von Passwörtern, wenn Sie ein Release erstellen. Obwohl der else-Zweig nicht erreichbar ist, täuscht er Gradle ein, um eine install...Release Aufgabe zu erstellen.

Hintergrundgeschichte. Wie von https://stackoverflow.com/a/19130098/3664487 festgestellt, "Gradle-Skripte können Benutzereingaben mit der Methode System.console().readLine abfragen." Leider fordert Gradle immer ein Passwort an, auch wenn Sie ein Debug-Release erstellen (vgl. Wie erstellt man eine signierte Release-APK-Datei mit Gradle?). Glücklicherweise kann dies, wie ich oben gezeigt habe, überwunden werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X