LIBGDX Empaquetado distribución.
UNIDADE 2: Empaquetado e distribución
Sumario
Introdución
Nesta sección imos ver como podemos crear o arquivo que vai ser descargado polos xogadores para instalar o xogo no seu computador / tablet.
Información na wiki: https://github.com/libgdx/libgdx/wiki/Gradle-on-the-Commandline#packaging-the-project
Vídeo explicativo: https://www.youtube.com/watch?v=shxHON23qNo
O proceso é moi sinxelo. Temos que ir ó cartafol onde se atopa o noso proxecto dende a consula de ms-dos (Windows) ou dende un terminal en Linux.
Tamén podemos ir dende o propio AndroidStudio. Será esta a opción a escoller:
Unha vez nel, e dependendo da plataforma, faremos:
Desktop
Windows:
1 gradlew desktop:dist
Linux:
1 ./gradlew desktop:dist
Unha vez xerado teremos o arquivo coa extensión jar no cartafol desktop/build/libs/ do proxecto.
Android
As aplicación Android poder xerarse firmadas ou non. A firma consiste nun proceso polo que 'asociamos' un certificado cunha información (persoa ou empresa que publica a aplicación / xogo, data de validez do certificado,....) ó xogo desenvolto.
Se quixeramos levar o xogo o Market de Android teríamos que firmar a aplicación. Dito certificado serviríanos despois para subir novas versións do xogo ao Market.
Nota: Se vos da un erro ao intentar instalar a aplicación sen firmar, teredes que xerala firmada. Nas últimas versión pasaba isto.
Graficamente
- Para xerar unha APK certificada temos que ter un almacén de claves (keystore) onde gardar os certificados das diferentes aplicacións firmadas. Dito almacén terá asociado un contrasinal.
- Posteriormente cada certificado creada de cada aplicación poderá ser gardado no mesmo almacén e tamén dito certificado terá unha clave asociada.
Nota: Os datos do almacén-certificado son:
- Key Store Path: Ruta onde gardar o almacén de claves.
- Password / Confirm: Password e confirmación da password do almacén de claves. Ten que ter a lo menos 6 caracteres.
- Alias: Un alias para o keystore. Pode ser o mesmo que o nome ou unha abreviación do mesmo.
- Validity (years): Aquí indicamos o tempo que vai ser válida a nosa keystore en anos.
- Isto vai crear unha clave (certificado_xogo no exemplo) que vai ser gardada nun almacén de claves de nome almacen.keystore (un almacén pode ter moitas claves gardadas).
- Os datos a pedir serán:
- Contrasinal da key (dúas veces). Ten que ter a lo menos 6 caracteres.
- Nome e apelidos.
- Nome da unidade da organización (por exemplo Compras, Ventas, ...)
- Nome da organización.
- Cidade.
- Provincia.
- Código do país: ES.O campo de Country Code, se pode consultar no listado da ISO 3166-1
- Se agora queremos engadir unha nova Key (certificado) ao almacén de claves, teremos que repetir o proceso, pero na primeira pantalla, deberemos:
Dende consola/terminal
Sen firmar
Windows:
1 gradlew android:assembleRelease
Linux:
1 ./gradlew android:assembleRelease
Unha vez xerado teremos o arquivo coa extensión apk no cartafol android/build/outputs/apk do proxecto.
Se agora intentades instalar dita aplicación nun dispositivo móbil vos avisará que tedes que permitir instalar aplicación dende fontes descoñecidas. Isto é así xa que a aplicación que se xera non está firmada.
Nota: Parece ser que dende que se cambiou a Gradle a xeración de proxectos Android sen firmar leva consigo que cando intentedes instalalo nun dispositivo móbil vos dea o erro de Aplicación no instalada. Se é ese o caso probade a firmar a aplicación.
Firmada
- Primeiro temos que ir cunha consola / terminal ó cartafol onde se atope o JDK ou JRE instalado no equipo. Ó cartafol bin (jre/bin ou jdk/bin). Se a ruta xa está engadida ó path non faría falla facer este paso.
- Despois temos que teclear o seguinte:
1 keytool -genkey -v -keystore almacen.keystore -alias xogoplatega -keyalg RSA -keysize 2048 -validity 10000
- Isto vai crear unha clave (xogoplatega) que vai ser gardada nun almacén de claves de nome almacen.keystore (un almacén pode ter moitas claves gardadas).
- Os datos a pedir serán:
- Contrasinal do almacén de datos (dúas veces).
- Nome e apelidos.
- Nome da unidade da organización.
- Nome da organización.
- Cidade.
- Provincia.
- Código do país: ES
NOTA: Coidado en Windows 7 xa que se abrides unha consola de ms-dos en modo non administrador non terá permiso para crear o almacén. Podedes ir a outro cartafol con permisos de escritura e referenciar o keytool coa ruta completa: c:\archivos de programa\java\jreXXXX\bin\keytool ....
Confirmaremos e xa teremos xerado a clave coa que imos 'firmar' o noso xogo.
Podemos verificar que o almacén e a clave son correctos:
1 keytool -list -v -keystore almacen.keystore
A partir de aquí dispoñemos de dúas opcións:
Opción a)
Firmar a aplicación de forma manual.
Primeiro debemos xerar o apk sen firmar. Podemos facelo como está indicado nun punto anterior, dende a consola/terminal ou outra forma de facelo é graficamente:
Despois debemos executar esta orde dende un terminal:
1 jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ruta_e_arquivo_almacen_datos omeuxogo.apk nome_do_alias
Nota: O executable jarsigner se atopa no cartafol bin do SDK instalado.
Para verificar se todo está correcto:
1 jarsigner -verify -verbose -certs nome_xogo.apk
Opción b)
- Agora debemos modificar o arquivo build.gradle que se atopa no raíz do proxecto. O podemos facer dende o propio AndroidStudio se prememos dúas veces sobre o arquivo.
- Debemos ir ás sección proyect(":android") e escribir o marcado:
1 project(":android") { 2 apply plugin: "android" 3 4 configurations { natives } 5 6 dependencies { 7 compile project(":core") 8 compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" 9 natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi" 10 natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" 11 natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" 12 } 13 android { 14 //... 15 signingConfigs { 16 releaseSigning { 17 storeFile file("willBeReplaced") 18 storePassword "" 19 keyAlias "" 20 keyPassword "" 21 } 22 } 23 buildTypes { 24 release { 25 signingConfig signingConfigs.releaseSigning 26 } 27 } 28 } 29 }
- Agora debemos de poñer este código o comezo do arquivo:
1 import groovy.swing.SwingBuilder
- E este código ó final do arquivo.
1 gradle.taskGraph.whenReady { taskGraph -> 2 if(taskGraph.hasTask(':android:assembleRelease')) { 3 def _store = '' 4 def _storePassword = '' 5 def _keyPassword = '' 6 def _keyAlias = '' 7 if(System.console() == null) { 8 new SwingBuilder().edt { 9 def inputStore 10 def inputStorePass 11 def inputKey 12 def inputKeyPass 13 dialog(modal: true, 14 title: 'Key Store', 15 alwaysOnTop: true, 16 resizable: false, 17 locationRelativeTo: null, 18 pack: true, 19 show: true 20 ) { 21 vbox { 22 label(text: "Key store:") 23 inputStore = textField(text: "myKeyStore.keystore") 24 label(text: "Key store password:") 25 inputStorePass = passwordField() 26 label(text: "Key alias:") 27 inputKey = textField(text: "myAlias") 28 label(text: "Key password:") 29 inputKeyPass = passwordField() 30 button(defaultButton: true, text: 'OK', actionPerformed: { 31 _store = inputStore.text 32 _storePassword = new String(inputStorePass.password); 33 _keyAlias = inputKey.text 34 _keyPassword = new String(inputKeyPass.password) 35 dispose(); 36 }) 37 } 38 } 39 } 40 } else { 41 _store = System.console().readLine("\nLocation of the key store: ") 42 _storePassword = System.console().readPassword("\nKey store password: ") 43 _storePassword = new String(_storePassword) 44 _keyAlias = System.console().readLine("\nKey alias: ") 45 _keyPassword = System.console().readPassword("\nKey password: ") 46 _keyPassword = new String(_keyPassword) 47 } 48 if(_storePassword.size() <= 0 || _keyPassword.size() <= 0 || 49 _store.size() <= 0 || _keyAlias.size() <= 0) { 50 throw new InvalidUserDataException("You must enter a key store password and key password.") 51 } 52 if(!file(_store).exists()){ 53 throw new InvalidUserDataException("Could not find key store ["+_store+"]") 54 } 55 //set signing values to android project 56 project("android").android.signingConfigs.releaseSigning.storeFile = file(_store) 57 project("android").android.signingConfigs.releaseSigning.storePassword = _storePassword 58 project("android").android.signingConfigs.releaseSigning.keyAlias = _keyAlias 59 project("android").android.signingConfigs.releaseSigning.keyPassword = _keyPassword 60 } 61 }
- Unha vez cambiado o arquivo build.gradle será necesario sincronilzalo proxecto:
- Agora só queda xerar a apk firmada, como fixemos antes:
- Windows:
1 gradlew android:assembleRelease
- Linux:
1 ./gradlew android:assembleRelease
- Durante o proceso se nos pedirá:
- A ruta e nome onde se atopa o almacén de datos. Debemos indicar a ruta xunto có nome do almacén (incluída extensión).
- O password do almacén.
- A nome da clave gardada (o alias).
- O password da clave.
- Unha vez xerado teremos o arquivo coa extensión apk no cartafol android/build/outputs/apk do proxecto e xa poderíamos subilo ao Appstore. Lembrar que se o facemos graficamente a ruta é diferente, xa que o xera no cartafol indicado no asistente (por defecto Ruta_do_proxecto/android).
TAREFA 2.15 A FACER: Esta parte está asociada á realización dunha tarefa.
IOS
Windows:
1 gradlew ios:createIPA
Linux:
1 ./gradlew ios:createIPA
Unha vez xerado teremos o arquivo coa extensión IPA no cartafol ios/build/robovm do proxecto.
HTML
Windows:
1 gradlew html:dist
Linux:
1 ./gradlew html:dist
Unha vez xerado teremos os arquivos HTML, javascript e arquivos do cartafol assets no cartafol html/build/dist/ do proxecto. Este é o contido que hai que subir ó servidor web (por exemplo Apache).
Nova ferramenta de empaquetado
A partires de Maio do 2014 é posible distribuír o xogo coa máquina virtual de java 'incrustada' dentro do arquivo, de tal forma que podemos xogar en computadores onde o software de java non estea instalado.
O tamaño do arquivo aumenta considerablemente (sobre 12MB, pero depende do xogo).
Enlace á nova: http://www.badlogicgames.com/wordpress/?p=3428 Enlace como usala: https://github.com/libgdx/packr
-- Ángel D. Fernández González -- (2015).