Pasos para generar una APK y ABB firmado en modo Release en Flutter mediante VSC

- Andrés Cruz

In english

En esta entrada veremos varios tips, pasos y consideraciones que debes de tener en cuenta cuando quieres generar el release para producción de tu aplicación en Flutter empleando Visual Studio Code; la app/apk en Android que vamos a generar va a estar firmada, que es el requisito por Google para poder cargar tu app en la Google Play Store.

Estos pasos también los puedes tener en cuenta si empleas Android Studio.

Finalmente, vamos a emplear Windows para realizar estos pasos; esta es la documentación oficial del equipo de Flutter:

https://docs.flutter.dev/deployment/android

 

Para generar un APK firmado en modo Release para una aplicación Flutter en Android utilizando Visual Studio Code (VSC), debes de seguir estos pasos:

1 Generar la Clave (Keystore):

  • Abre una terminal en VSC.
  • Ejecuta el siguiente comando para generar una clave (keystore) utilizando keytool (puedes hacerlo desde cualquier ubicación en tu sistema):

    keytool -genkey -v -keystore release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key-alias
  • Sigue las instrucciones para configurar la clave (contraseña, nombre, etc.); es un formulario como el siguiente que debes de llenar con información básica; del comando anterior, puedes personalizar la ubicación del release-key.jks así como el alias key-alias.
C:\Users\andre\flutter
.\keytool.exe -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key-alias
Introduzca la contraseña del almacén de claves:  
Volver a escribir la contraseña nueva:
¿Cuáles son su nombre y su apellido?
[Unknown]:  Tu Nombre 
¿Cuál es el nombre de su unidad de organización?
[Unknown]:  TuEmpresa
¿Cuál es el nombre de su organización?
[Unknown]:  TuEmpresa
¿Cuál es el nombre de su ciudad o localidad?
[Unknown]:  TuCiudad
¿Cuál es el nombre de su estado o provincia?
[Unknown]:  TuEstado
¿Cuál es el código de país de dos letras de la unidad?
[Unknown]:  (EJ VE)
¿Es correcto CN=andres cruz, OU=desarrollolibre, O=desarrollolibre, L=caracas, ST=distrito capital, C=VE?
[no]: si

Si tienes problemas con el comando de keytool ya lo tratamos en el siguiente apartado.

2 Crear el archivo key.properties:

  • En la carpeta android de tu proyecto Flutter, crea un archivo llamado key.properties.
  • Agrega la siguiente información al archivo:

    storePassword=your_keystore_password
    keyPassword=your_key_password
    keyAlias=my-key-alias
    storeFile=release-key.jks

3 Modificar el archivo build.gradle:

  • Abre el archivo android/app/build.gradle.
  • Agrega la siguiente configuración, los que tienen el simbolo de + son los que debes de agregar

    +   def keystoreProperties = new Properties()
    +   def keystorePropertiesFile = rootProject.file('key.properties')
    +   if (keystorePropertiesFile.exists()) {
    +       keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    +   }
    +
       android {
          ...
       }
       
       +   signingConfigs {
    +       release {
    +           keyAlias keystoreProperties['keyAlias']
    +           keyPassword keystoreProperties['keyPassword']
    +           storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
    +           storePassword keystoreProperties['storePassword']
    +       }
    +   }
       buildTypes {
          release {
             // TODO: Add your own signing config for the release build.
             // Signing with the debug keys for now,
             // so `flutter run --release` works.
    -           signingConfig signingConfigs.debug
    +           signingConfig signingConfigs.release
          }
       }

    En resumen, estamos agregando a nivel de código que empleará el compilador cuales son las los parámetros en base al keystore generado anteriormente para que genere nuestra app firmada.

4 Generar el APK firmado:

  • Finalmente, ejecutamos el comando para generar la app firmada en formato apk:

    flutter build apk
  • o en abb:
  • flutter build appbundle 
  • El archivo APK firmado (app-release.apk) se generará en la carpeta build/app/outputs/apk de tu proyecto de Flutter y este es el que debes de subir a la Google Play, antes de subir, te recomiendo que instales la apk en un dispositivo físico, para eso, lo copias en el dispositivo Android y sigues los pasos de instalación.
  1. No compartas públicamente el archivo del keystore (release-key.jks). Guárdalo de forma segura.

Listo! Ahora tienes un APK firmado en modo Release para tu aplicación Flutter en Android.

 

Problemas al generar la apk firmada

Por supuesto, hay muchas cosas que pueden salir mal al momento de generar tu aplicación firmada, y esto es lo que trataremos a continuación; si al momento de ejecutar el comando de da un error como el siguiente:

Debes de agregar al path de tu sistema la referencia al instalador o simplemente te mueves a la ubicación de la keystore; para esto, primero debemos de ubicar dónde se encuentra el .exe, para eso, podemos emplear el comando de flutter:

flutter doctor -v

Y buscamos algo como:

cd 'C:\Program Files\Android\Android Studio\jbr\bin\\'  
C:\Program Files\Android\Android Studio\jbr\bin\java
Android toolchain - develop for Android devices (Android SDK version 34.0.0)
   • Android SDK at C:\Users\andre\AppData\Local\Android\sdk
   • Platform android-34, build-tools 34.0.0
   • Java binary at: C:\Program Files\Android\Android Studio\jbr\bin\java
   • Java version OpenJDK Runtime Environment (build 17.0.10+0--11572160)
   • All Android licenses accepted.

En donde nos indica donde esta Java:

C:\Program Files\Android\Android Studio\jbr\bin\java

Ahora, movemos la terminal hasta esa ubicación sin incluir la carpeta de java (esta misma dirección puedes agregarla al path de tu sistema si así lo deseas):

cd C:\Program Files\Android\Android Studio\jbr\bin

Y ejecutamos:

keytool -genkey -v -keystore release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key-alias

Probablemente te indique que solo es escritura:

error de herramienta de claves: java.io.FileNotFoundException: my-release-key.jks (Acceso denegado)
java.io.FileNotFoundException: my-release-key.jks (Acceso denegado)
       at java.base/java.io.FileOutputStream.open0(Native Method)
       at java.base/java.io.FileOutputStream.open(FileOutputStream.java:293)
       at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:235)
       at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:123)
       at java.base/sun.security.tools.keytool.Main.doCommands(Main.java:1375)
       at java.base/sun.security.tools.keytool.Main.run(Main.java:423)
       at java.base/sun.security.tools.keytool.Main.main(Main.java:416)

Así que, colocas una ubicación distinta para generar el release-key.jks, por ejemplo:

keytool -genkey -v -keystore C:\Users\andres\release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key-alias

Y ahora, debería de generar el archivo de manera satisfactoria en la ubicación especificada.

El siguiente paso consiste en generar la apk firmada, antes de eso, deberías de actualizar el namespace de tu app, ya que, no puede decir example como parte del nombre, para ello, puedes emplear el siguiente paquete:

https://pub.dev/packages/change_app_package_name

Hay muchos errores que pueden ocurrir si no estableces correctamente los parámetros en el Android Studio como al momento de ejecutar el proyecto en Android quede en un bucle o que al generar la apk firmada indique pir ejemplo que te equivocastes al momento de definir el alias:

e: C:/Users/andre/.gradle/caches/transforms-3/c1e3cec58f97b65c118bb2f68fab94a8/transformed/jetified-core-ktx-1.10.1/jars/classes.jar!/META-INF/core-ktx_release.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.8.0, expected version is 1.6.0.
e: C:/Users/andre/.gradle/caches/transforms-3/a3842a17fe7307c5bcdac869078c73a0/transformed/core-1.10.1/jars/classes.jar!/META-INF/core_release.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.8.0, expected version is 1.6.0.        
e: C:/Users/andre/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.8.22/636bf8b320e7627482771bbac9ed7246773c02bd/kotlin-stdlib-1.8.22.jar!/META-INF/kotlin-stdlib-jdk7.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.8.0, expected version is 1.6.0.
e: C:/Users/andre/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.8.22/636bf8b320e7627482771bbac9ed7246773c02bd/kotlin-stdlib-1.8.22.jar!/META-INF/kotlin-stdlib.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.8.0, expected version is 1.6.0.
e: C:/Users/andre/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.8.22/636bf8b320e7627482771bbac9ed7246773c02bd/kotlin-stdlib-1.8.22.jar!/META-INF/kotlin-stdlib-jdk8.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.8.0, expected version is 1.6.0.
e: C:/Users/andre/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.8.22/1a8e3601703ae14bb58757ea6b2d8e8e5935a586/kotlin-stdlib-common-1.8.22.jar!/META-INF/kotlin-stdlib-common.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.8.0, expected version is 1.6.0.
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:packageRelease'.
> A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable
  > com.android.ide.common.signing.KeytoolException: Failed to read key upload from store "C:\Users\andre\flutter\release-key-flutter.jks": No key with alias 'upload' found in keystore C:\Users\andre\flutter\release-key-flutter.jks
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 11s
Running Gradle task 'assembleRelease'...                           12,5s

Es decir:

key.properties

storePassword=your_keystore_password
keyPassword=your_key_password
keyAlias=my-key-alias
storeFile=release-key.jks

Que obviamente debe de corresponder con el alias especificado al momento de generar el keystore.

Otro error común es si la app requiere de conexión a internet para funcionar, en AndroidManifest.xml, debes de dejar los permisos:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
   <uses-permission android:name="android.permission.INTERNET" />
   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
   <application

Ya que al abrir la misma, verías que toda la data que se trae de internet no cargaría.

Finalmente, la app se generará en tu proyecto:

C:\Users\andre\OneDrive\Escritorio\proyectos\flutter\desarrollolibre\build\app\outputs\flutter-apk
Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.