LIBGDX Empaquetado distribución.

De Manuais Informática - IES San Clemente.
Ir a la navegación Ir a la búsqueda

UNIDADE 2: Empaquetado e distribución

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.

Unha vez nel, e dependendo da plataforma, faremos:

Desktop

Windows:

gradlew desktop:dist


Linux:

./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 ó Market.

Graficamente

O podemos facer dende o entorno do eclipse. Simplemente nos situamos sobre o proxecto versión de Android. Neste caso imos explicar o proceso para xerar unha versión firmada, tendo que escoller a opción Export UnSigned Application Package se queremos xerar a non firmada.

Nota: Os datos do certificado son:

  • Alias: Un alias para o keystore. Pode ser o mesmo que o nome ou unha abreviación do mesmo.
  • Password: Novamente asinámoslle unha contrasinal. Ten que ter o lo menos 6 caracteres. Esta vai ser a contrasinal da key,
  • Validity (years): Aquí indicamos o tempo que vai ser válida a nosa keystore en anos.
  • Os seguintes campos fan referencia a información persoal e da organización. O campo de Country Code, se pode consultar no listado da ISO 3166-1. No noso caso é ES.

Dende consola/terminal

Sen firmar

Windows:

gradlew android:assembleRelease


Linux:

./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:
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:

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:

LIBGDX UD2 15 Empaquetado 2.jpg


Despois debemos executar esta orde dende un terminal:

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:

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 eclipse se prememos dúas veces sobre o arquivo.
LIBGDX UD2 15 Empaquetado 1.jpg


Debemos ir ás sección proyect(":android") e escribir o marcado:
project(":android") {
    apply plugin: "android"

    configurations { natives }

    dependencies {
        compile project(":core")
        compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
    }
    android {
        //...
        signingConfigs {
            releaseSigning {
                storeFile file("willBeReplaced")
                storePassword ""
                keyAlias ""
                keyPassword ""
            }
        }
        buildTypes {
            release {
                signingConfig signingConfigs.releaseSigning
            }
        }
    }
}


  • Agora debemos de poñer este código o comezo do arquivo:
import groovy.swing.SwingBuilder
  • E este código ó final do arquivo.
gradle.taskGraph.whenReady { taskGraph ->
    if(taskGraph.hasTask(':android:assembleRelease')) {
        def _store = ''
        def _storePassword = ''
        def _keyPassword = ''
        def _keyAlias = ''
        if(System.console() == null) {
            new SwingBuilder().edt {
                def inputStore
                def inputStorePass
                def inputKey
                def inputKeyPass
                dialog(modal: true,
                        title: 'Key Store',
                        alwaysOnTop: true,
                        resizable: false,
                        locationRelativeTo: null,
                        pack: true,
                        show: true
                ) {
                    vbox {
                        label(text: "Key store:")
                        inputStore = textField(text: "myKeyStore.keystore")
                        label(text: "Key store password:")
                        inputStorePass = passwordField()
                        label(text: "Key alias:")
                        inputKey = textField(text: "myAlias")
                        label(text: "Key password:")
                        inputKeyPass = passwordField()
                        button(defaultButton: true, text: 'OK', actionPerformed: {
                            _store = inputStore.text
                            _storePassword =  new String(inputStorePass.password);
                            _keyAlias =  inputKey.text
                            _keyPassword =  new String(inputKeyPass.password)
                            dispose();
                        })
                    }
                }
            }
        } else {
            _store = System.console().readLine("\nLocation of the key store: ")
            _storePassword = System.console().readPassword("\nKey store password: ")
            _storePassword = new String(_storePassword)
            _keyAlias = System.console().readLine("\nKey alias: ")
            _keyPassword = System.console().readPassword("\nKey password: ")
            _keyPassword = new String(_keyPassword)
        }
        if(_storePassword.size() <= 0 || _keyPassword.size() <= 0 ||
                _store.size() <= 0 || _keyAlias.size() <= 0) {
            throw new InvalidUserDataException("You must enter a key store password and key password.")
        }
        if(!file(_store).exists()){
            throw new InvalidUserDataException("Could not find key store ["+_store+"]")
        }
        //set signing values to android project
        project("android").android.signingConfigs.releaseSigning.storeFile = file(_store)
        project("android").android.signingConfigs.releaseSigning.storePassword = _storePassword
        project("android").android.signingConfigs.releaseSigning.keyAlias = _keyAlias
        project("android").android.signingConfigs.releaseSigning.keyPassword = _keyPassword
    }
}


  • Agora só queda xerar a apk firmada, como fixemos antes:
Windows:
gradlew android:assembleRelease


Linux:
./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/apk do proxecto e xa poderíamos subilo ó Appstore.



TAREFA 2.15 A FACER: Esta parte está asociada á realización dunha tarefa.


IOS

Windows:

gradlew ios:createIPA


Linux:

./gradlew ios:createIPA


Unha vez xerado teremos o arquivo coa extensión IPA no cartafol ios/build/robovm do proxecto.


HTML

Windows:

gradlew html:dist


Linux:

./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 -- (2014).