¿Cómo crear un archivo apk firmado con Gradle?

9 minutos de lectura

¿Como crear un archivo apk firmado con Gradle
Jan-Terje Sorensen

Me gustaría tener mi compilación Gradle para crear un archivo apk firmado de lanzamiento usando Gradle.

No estoy seguro si el código es correcto o si me falta un parámetro al hacer gradle build?

Este es parte del código en mi archivo gradle:

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

La compilación de gradle termina CON ÉXITO, y en mi build/apk carpeta solo veo la ...-release-unsigned.apk y ...-debug-unaligned.apk archivos

¿Alguna sugerencia sobre cómo resolver esto?

  • desarrollador.android.com/studio/publish/…

    – LF00

    7 de junio de 2017 a las 10:48

  • ¿firmar con la versión v1 (firma de jar) o v2 (firma de apk completa) del archivo gradle? solución aquí: stackoverflow.com/questions/57943259/…

    – usuario1506104

    15/09/2019 a las 18:00

  • stackoverflow.com/a/61028214/5733853

    – Vahid Hoseini

    4 de abril de 2020 a las 12:40

¿Como crear un archivo apk firmado con Gradle
Jan-Terje Sorensen

Logré resolverlo agregando este código y construyendo con gradle build:

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

Esto genera un archivo apk de lanzamiento firmado.

  • ¿Hay alguna manera de hacer que me pida las contraseñas? ¿U otras sugerencias para mantener las contraseñas fuera de mis repositorios de git?

    – usuario672009

    18/09/2013 a las 23:38

  • Edito mi build.gradle para que se parezca al suyo, pero al ejecutar “Creado> Generar APK firmado…” todavía aparece ese cuadro de diálogo (“Consulte la Guía del usuario de Gradle para obtener más información”, etc.) y no hay APK.

    – Semántico

    5 oct 2013 a las 18:21

  • @Semanticer Ejecutar gradle build o gradlew build en el comando Terminal/Prompt

    – Phillip Kamikaze

    5/10/2013 a las 21:50


  • @ user672009 puede poner contraseñas en un archivo de propiedades y excluirlo de los repositorios con .gitignore. Puedes ver este enlace.gist.github.com/gabrielemariotti/6856974

    – Gabriele Mariotti

    06/10/2013 a las 17:51

  • @GabrieleMariotti Eso todavía deja un repositorio incompleto. Una mejor manera sería crear un esqueleto de firma.propiedades y, después de comprometerse, emitir “git update-index –assume-unchanged signature.properties”. Sin embargo, eso evita que se confirmen ediciones futuras. Algo como la primera opción que sugiere sdqali parece aún mejor.

    – usuario672009

    06/10/2013 a las 19:19


  • Después de implementar esto, installRelease desapareció de la lista de tareas… ¿Por qué?

    – Kaarel

    17/10/2013 a las 18:32

  • @caspase Ojalá me hubiera tomado más en serio tu comentario sobre la “contraseña de tienda” y la “contraseña clave” falsas. Sin inicializar estas propiedades (“” por ejemplo), el *-release.apk firmado no se crea, no se muestra ningún error y queda completamente desconcertado con solo *-release-unsigned.apk en su directorio PROJECT_NAME/build/apk/ . Hombre… :/

    – vizZ

    2 de diciembre de 2013 a las 16:40

  • Gracias por la nota sobre la adición de signatureConfig en buildTypes -> Release. ¡Eso resolvió la firma automática para mí!

    – mm2001

    14 de diciembre de 2013 a las 4:28

  • Hice un complemento de gradle simple que solicita contraseñas al compilar la versión de lanzamiento (usando el método descrito en esta publicación, pero no necesitará definir storePassword y keyPassword falsos). También está disponible en maven central. github.com/alexvasilkov/AndroidGradleSignPlugin

    – Alex Vasilkov

    28 de febrero de 2014 a las 7:40

  • Esto es genial. Tenga en cuenta que la variable de entorno KEYSTORE debe definirse incluso para compilaciones de depuración y para “sincronización de gradle” dentro de Android Studio; de lo contrario, dará un error sobre la ruta nula.

    – Jerry101

    31 de marzo de 2014 a las 8:07

Si desea evitar codificar su almacén de claves y contraseña en construir.gradlepuede usar un archivo de propiedades como se explica aquí: MANEJO DE CONFIGURACIONES DE FIRMA CON GRADLE

Básicamente:

1) crear un archivo myproject.properties en /casa/[username]/.firma con tales contenidos:

keystore=[path to]\release.keystore
keystore.password=*********
keyAlias=***********
keyPassword=********

2) cree un archivo gradle.properties (quizás en la raíz del directorio de su proyecto) con el contenido:

MyProject.properties=/home/[username]/.signing/myproject.properties

3) referirse a él en su construir.gradle Me gusta esto:

    if(project.hasProperty("MyProject.properties")
        && new File(project.property("MyProject.properties")).exists()) {

    Properties props = new Properties()
    props.load(new FileInputStream(file(project.property("MyProject.properties"))))

    signingConfigs {
        release {
            storeFile file(props['keystore'])
            storePassword props['keystore.password']
            keyAlias props['keyAlias']
            keyPassword props['keyPassword']
        }
    }
}

  • ¡Funciona genial! Gracias. Este código debe agregarse antes de la sección buildTypes {} y la sección debe declarar la signatura Config signaConfigs.release como normal.

    – la sensación checa

    23 de junio de 2014 a las 4:09

  • Finalmente encontré una solución para este problema. ¡Lo único que realmente me ayudó! Esta debería ser la respuesta aceptada …

    – devnull69

    3 mayo 2016 a las 11:13


  • ¿Cómo usar esto en el archivo build.gradle?

    – Bhoomi Zalavadiya

    1 de noviembre de 2021 a las 6:51

Firma automática de aplicaciones con Gradle cuando se usa git

Es sorprendente cuántas formas complicadas hay para hacer esto. Aquí está mi propio camino, donde trato de adherirme a los propios de Google. recomendación. Sin embargo, su explicación no es del todo clara, por lo que describiré el procedimiento para Linux en detalle.


Descripción:

El valor por defecto Instrucciones de Google para firmar automáticamente una aplicación durante la compilación, sin guardar las contraseñas y los archivos de firma en la ruta de desarrollo de su aplicación (GIT), es bastante oscuro. Aquí están las instrucciones paso a paso aclaradas sobre cómo hacerlo.

Supuestos iniciales:

Tiene una aplicación llamada “MyApp” en un directorio dado por la siguiente ruta:
$HOME/projects/mydev/MyApp. Sin embargo, el directorio MyApp se usa y controla con GIT.

ingrese la descripción de la imagen aquí

Problema

Obviamente, no queremos tener nuestros archivos de firma o contraseña en ningún lugar del directorio controlado por GIT, incluso si somos muy capaces de usar .gitignore etc, todavía es demasiado arriesgado y fácil cometer un error. Así que queremos que nuestro almacén de claves y archivos de firma estén fuera.

Solución

Necesitamos hacer tres (3) cosas:

  1. Crear un archivo de contraseña para ser utilizado por Android Studio
  2. Crear archivo de clave de firma
  3. Editar el módulo build.gradle archivo para usar (1) y (2).

Para este ejemplo llamamos a los dos archivos:

  1. keystore.properties
  2. MyApp-release-key.jks

Podemos poner ambos archivos aquí:

cd $HOME/projects/mydev/

(1) Crear el archivo de contraseñas del almacén de claves

El primer archivo contiene las contraseñas de texto claro utilizadas en; y rutas al archivo de clave de versión en (2). Comience completando esto, ya que facilitará la operación de copiar y pegar para el siguiente paso.

cd $HOME/projects/mydev/

Editar keystore.properties por lo que su contenido es:

storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

La única parte difícil aquí, es el myStoreFileLocation. este es el camino visto desde el módulo build.gradle archivo durante la compilación. Esto generalmente significa una ruta similar y relativa a: $HOME/projects/mydev/MyApp/app/build.gradle. Entonces, para señalar el MyApp-release-key.jks
archivo, lo que tenemos que poner aquí es:

../../../MyApp-release-key.jks

Aquí, también elegimos el alias “myapp” para la clave. Entonces el archivo final debería verse:

storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myapp
storeFile=../../../MyApp-release-key.jks

(2) Crear el archivo de firma

El segundo archivo se genera automáticamente cuando crea la clave de firma. Si no tiene otras aplicaciones y este es su único almacén de claves, cree el archivo con:

cd $HOME/projects/mydev/
keytool -genkeypair -v -keystore MyApp-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias myapp

Esto le pedirá dos contraseñas y un montón de información. (Lo mismo que en Android Studio). Ahora copie y pegue las contraseñas elegidas anteriormente.

(3) Edite su módulo gradle.build archivo para usar lo anterior

Las siguientes partes deben estar presentes en el archivo de compilación Gradle de su aplicación/módulo. Primero, agregue las siguientes líneas fuera de y antes de tu android {} cuadra.

//def keystorePropertiesFile = rootProject.file("$HOME/.android/keystore.properties")
def keystorePropertiesFile = rootProject.file("../../keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

Luego, en el interior los android {} bloquear, añadir:

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
            ...
        }
    }
}

Ahora desde Shell, puede reconstruir su aplicación con:

cd $HOME/projects/mydev/MyApp/app/
./gradlew clean build

Esto debería generar una aplicación debidamente firmada que se pueda usar en Google Play.


ACTUALIZAR: 2019-04-02

Versiones más recientes de keytool y algo te está diciendo que debes usar un PKCS12 archivo de claves basado en lugar del original/predeterminado como uso arriba. Ellos luego continúe diciéndole que debe convertir al nuevo formato abierto PKCS12. Sin embargo, parece que las herramientas de desarrollo de Android aún no están listas para esto, porque si lo hace, obtendrá los siguientes errores extraños:

com.android.ide.common.signing.KeytoolException: No se pudo leer la clave XXX de la tienda “F:\XXX\XXX.jks”: error al obtener la clave: el bloque final dado no se completó correctamente. Tales problemas pueden surgir si se usa una clave incorrecta durante el descifrado.

¡Así que no uses una clave convertida!

  • ¡Funciona genial! Gracias. Este código debe agregarse antes de la sección buildTypes {} y la sección debe declarar la signatura Config signaConfigs.release como normal.

    – la sensación checa

    23 de junio de 2014 a las 4:09

  • Finalmente encontré una solución para este problema. ¡Lo único que realmente me ayudó! Esta debería ser la respuesta aceptada …

    – devnull69

    3 mayo 2016 a las 11:13


  • ¿Cómo usar esto en el archivo build.gradle?

    – Bhoomi Zalavadiya

    1 de noviembre de 2021 a las 6:51

1646752935 825 ¿Como crear un archivo apk firmado con Gradle
Pablo Verest

Como dijo @Destil, pero permita que otros que no tienen la clave construyan: una forma más fácil que las respuestas anteriores:

pon esto en ~/.gradle/gradle.properties

RELEASE_STORE_FILE={path to your keystore}
RELEASE_STORE_PASSWORD=*****
RELEASE_KEY_ALIAS=*****
RELEASE_KEY_PASSWORD=*****

Modifica tu build.gradle Me gusta esto:

...    
if(project.hasProperty("RELEASE_STORE_FILE")) {
    signingConfigs {    
       release {
           storeFile file(RELEASE_STORE_FILE)
           storePassword RELEASE_STORE_PASSWORD
           keyAlias RELEASE_KEY_ALIAS
           keyPassword RELEASE_KEY_PASSWORD
       }
    }
}

buildTypes {
    if(project.hasProperty("RELEASE_STORE_FILE")) {
        release {
            signingConfig signingConfigs.release
        }
    }
}
....

Entonces puedes correr gradle assembleRelease
O
gradle build

  • Cómo configurar la ruta en Windows: ruta a su almacén de claves

    – reza_khalafi

    11 de abril de 2020 a las 6:48

  • storeFile file(“C:\\Users\\xxxx\\Documents\\yyyy\\mykey.jks”) ¿es correcto?

    – reza_khalafi

    11 de abril de 2020 a las 6:49

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad