Hoy vamos a presentar un tutorial para aquellas personas que estén interesadas en utilizar Qt para programar para Android, con la peculiaridad de utilizar Ubuntu 16.04 como sistema operativo.
Posiblemente más de uno se haya encontrado con inconvenientes no solo en el momento de hacer crosscompiling a Android, sino también para hacer funcionar el mismo Qt cuando se emplea la versión descargada del sitio web. Aquí detallaremos todos los pasos a seguir para crosscompilar Qt para Android, empezando por los paquetes necesarios para poder hacer la compilación de forma correcta tanto para el escritorio GNU/Linux como para Android.
Paquetes necesarios
- g++-arm-linux-gnueabihf (si no queréis compilar para Android, instalad g++ en su lugar).
- default-jdk.
- ant.
- libgl1-mesa-dev.
- mesa-utils.
- nvidia-NNN-dev (este solo hay que instalarlo en caso de que se esté utilizado el blob privativo de NVIDIA).
- gradle (opcional).
- cpu-checker (opcional).
- android-tools-adb (opcional).
- android-tools-fastboot (opcional).
- android-tools-fsutils (opcional).
Si en vez de Ubuntu estáis utilizando otra distribución, solo tenéis que buscar los paquetes equivalentes. Por ejemplo, para el compilador GCC para C++ posiblemente haya que buscar por gcc-c++ en vez de g++.
Sobre el paquete de NVIDIA, el NNN corresponde corresponde a la versión del driver que se esté utilizando. En mi caso es la 361, aunque por motivos de compatibilidad o bien por estar usando alguna PPA la versión puede variar, tanto para una superior como una inferior.
Instalación de Qt
Aquí enseñaremos a instalar la versión no comercial de Qt, la cual se puede obtener desde el sitio web oficial del proyecto. Cierto que esta versión también está presente en los repositorios de las distintas distribuciones GNU/Linux, pero en caso de instalarla por esa vía, quedará en manos de los mantenedores de la distribución el poner Qt al día, así como la posibilidad de poder instalar distintas versiones de Qt. En caso de quererse tomar en serio la programación en Qt recomiendo la versión de la web en lugar de la de los repositorios.
Para instalar Qt, solo hay que buscar “qt download” (sin las comillas) en Google y hacer clic en el enlace Qt Open Source.
Después hay que hacer clic en el botón correspondiente (Download now) en la página web para poder descargar el instalador de Qt.
Un vez descargado el instalador hay que otorgarle permisos de ejecución. Para ello se puede emplear la correspondiente opción en las propiedades del fichero (botón secundario del ratón sobre el instalador) o bien aplicar la siguiente línea de comando desde la carpeta en la que se encuentra ubicado.
chmod a+x qt-unified-linux-x64-2.0.03-1-online.run # La parte 2.0.03-1 corresponde al instalador y puede variar
Después hay que ejecutar el instalador, cosa que se puede hacer haciendo doble clic sobre el fichero o bien ejecutando la siguiente línea de comando desde la carpeta en la que se encuentra ubicado:
./qt-unified-linux-x64-2.0.03-1-online.run # La parte 2.0.03-1 corresponde al instalador y puede variar
Si se quiere instalar Qt en una subcarpeta del sistema se tiene ejecutar con permisos de superusuario (root). En caso de estar usando Ubuntu o alguna distribución que utilice sudo para acceder al superusuario habría que escribir la siguiente línea de comando:
sudo ./qt-unified-linux-x64-2.0.03-1-online.run
En otras distribuciones donde sudo no esté configurado y la cuenta de root esté habilitada se tendría que hacer lo siguiente:
su ./qt-unified-linux-x64-2.0.03-1-online.run
Para poder instalar Qt desde su medio oficial se requiere tener una cuenta en Qt, la cual se puede crear desde el propio instalador o bien desde el sitio web. Cuando se tenga una cuenta, se puede iniciar sesión para proceder a la instalación.
Como vemos, la instalación no es muy diferente a la de una aplicación de Windows. Una vez llegado a la parte correspondiente a la ruta de instalación, recomiendo encarecidamente colocarlo en la propia carpeta del usuario y no en el sistema (para instalar en una subcarpeta del sistema se requiere iniciar el instalador con permisos de root), ya que a mi en varias ocasiones la instalación en una subcarpeta del sistema me ha dado problemas a la hora de actualizar o modificar las versiones de Qt.
Después hay que seleccionar las versiones de Qt a instalar. Según la versión de Android para la que se quiera compilar podría cambiar la versión a elegir, aunque es bueno recordar que la versión 5.6 es LTS y recientemente apareció la versión 5.7, la cual ha avanzado hacia la conversión de Qt como tecnología totalmente libre.
El siguiente paso importante es la de aceptar los términos de la licencia para luego proceder a iniciar la instalación propiamente dicha. Recuerdo que se tiene que descargar muchos ficheros que ocupan bastante, por lo que el proceso puede tardar. Por otro lado, a veces los servidores de Qt van bastante lentos y me he que tenido que “tragar” alguna que otra descarga a 100kb/s. Por eso recomiendo realizar la instalación en un momento en el que usuario pueda desentenderse del ordenador por un tiempo.
La herramienta de mantenimiento de Qt
Qt cuenta con una herramienta de mantenimiento que permite actualizar los componentes instalados, modificarlos pudiendo quitar y añadir otras versiones o bien realizar una desinstalación completa. Recomiendo ejecutar esta herramienta para desinstalar Qt en vez de ir borrando manualmente, ya que el proceso es más limpio.
En Ubuntu Unity posiblemente su entrada en el lanzador no aparezca a la primera, aunque para subsanar eso basta con cerrar y volver a iniciar sesión.
Obtención del SDK y del NDK de Android
Para obtener el SDK y el NDK (que se obtienen por separado), solo hace falta buscarlos en Google a través de “android sdk” y “android ndk” (en ambos casos sin comillas) y hacer clic en el primer enlace que aparece.
En primer lugar se puede descargar el NDK (el orden tampoco es relevante). Después de buscarlo en Google hay que hacer clic sobre el enlace NDK Downloads, aunque antes de iniciar la descarga hay que aceptar los términos de la licencia. El NDK tiene que ser colocado en la propia carpeta del usuario al tratarse de un elemento portable (también se podría colocar en una carpeta del sistema, pero sería complicarlo todo de forma innecesaria). Por otro lado es importante mencionar que el proceso de descompresión tarda bastante.
Para descargar el SDK se realiza una búsqueda estándar.
Una vez dentro del sitio web de Android Studio hay que hacer clic sobre Download options.
Luego hay que tener mucho cuidado a la hora de seleccionar el fichero a descargar, ya que hay que hacer clic sobre sobre el SDK solo y NO sobre Android Studio, ya que el IDE de Google no nos interesa para nada. Antes de proceder a la descarga hay que aceptar los términos de la licencia. El SDK de Android también tiene que ser descomprimido en la carpeta del usuario (también por motivos de pragmatismo).
Instalación de las API de Android desde el SDK y creación del AVD
En primer lugar hay que iniciar la herramienta del SDK. Para ello hay que ejecutar un fichero llamado android localizado en la subcarpeta tools dentro del SDK (que por defecto defecto se llama android-sdk-linux).
Luego el usuario tiene que seleccionar las API de las versiones de Android que le interese. Por defecto la herramienta selecciona las dos últimas o la última. Una vez seleccionadas las API necesarias hay que hacer clic sobre el botón Install XX packages. El usuario tendrá que aceptar los términos de la licencia y esperar un buen rato, ya que el proceso de descarga tarda bastante tiempo.
Una vez instalado las API del SDK, se puede proceder a crear los AVD que se crean convenientes para lanzar un entorno de Android para las aplicaciones de Qt. Es importante mencionar aquí que vamos a crear un AVD para Android x86, ya que funcionan mucho mejor sobre una CPU Intel o AMD que los AVD de arquitectura ARM, los cuales funcionan muchísimo más lentos. Eso sí, la compilación de una aplicación para un dispositivo móvil de verdad requiere configurar Qt Creator para que compile para Android ARM.
Antes de empezar con la creación de los AVD, hay que comprobar si se tiene aceleración por hardware para poder ejecutar un AVD con Android x86. En Ubuntu 16.04 se puede realizar la comprobación instalando el paquete cpu-checker y ejecutando luego el siguiente comando:
kvm-ok
Si como resultado se obtiene la frase “KVM acceleration can be used”, significa que se puede hacer uso de los AVD de Android x86 para poder ejecutar sobre estos las aplicaciones y programas realizados con Qt. En caso contrario, el usuario se verá forzado a tener que tirar de AVD de arquitectura ARM, por lo que tendrá que tener paciencia a la hora de desplegar las aplicaciones en el entorno de pruebas (pudiendo ser incluso más recomendable prescindir de los AVD y ejecutar las aplicaciones directamente en el móvil en algunos casos).
También cabe la posibilidad de que los AVD de Android x86 no funcionen a pesar de haberse confirmado la aceleración por hardware. Para ello hay que crear un fichero llamado kvm.conf en /etc/modules-load.d que contenga lo siguiente:
En caso de que la CPU utilizada por la máquina física sea Intel:
kvm_intel
En caso de que la CPU utilizada por la máquina física sea AMD:
kvm_amd
Después de configurar el fichero kvm.conf el usuario puede reiniciar para cargar los módulos o bien ejecutar sudo modprobe kvm_intel o sudo modprobe kvm_amd en una consola para cargar el módulo directamente.
Luego, con la herramienta del SDK de Android abierta, hay que dirigirse a la opción Manage AVD en el menú Tools.
Después hay que hacer clic sobre el botón Create.
Como la configuración del AVD puede variar según las necesidades del usuario, aquí resaltaremos los puntos críticos que tendrían que configurarse igual para todos los AVD (en caso de disponer de aceleración por hardware). Después de establecer las características del AVD hay que pulsar sobre el botón OK.
Configurar Qt Creator para compilar Android
Para configurar Qt Creator para trabajar con las API de Android hay que iniciar el mencionado IDE para luego dirigirse al menú Tools y luego hacer clic sobre Options. Una vez accedido a las opciones, hay que dirigirse al apartado Android y configurarlo de forma que quede igual que en la imagen (OpenJDK y Ant se configuran de forma automática). Para ello solo hay que hacer clic en el botón que aparece a la derecha (Browse) de las rutas del SDK y el NDK para seleccionar las ubicaciones en las que se encuentran, las cuales también se pueden escribir a mano. Después de configurar el SDK y el NDK se puede pulsar sobre el botón Apply u OK. El usuario verá si le conviene usar Graddle o Ant, de hecho también se puede hacer la selección a nivel del proyecto.
¿No consigues desplegar los programas en el AVD aunque compilen correctamente? Sigue este consejo
A la hora de configurar un proyecto de Qt para Android lo suyo es configurarlo para que compile para el escritorio, Android x86 y Android ARM. El primero porque no viene mal desplegar las aplicaciones sobre nuestro sistema antes de proceder a ejecutarlo sobre Android, el segundo para probar las creaciones sobre el AVD y el tercero se utiliza solo para cuando se quiera realizar pruebas directamente sobre un móvil o una tablet, por lo que solo hará la función de compilación.
Sin embargo, posiblemente algunos os encontréis con que la aplicación no se despliega sobre el AVD cuando le dais a ejecutar en Qt Creator. Si pasa eso, sería recomendable iniciar antes el AVD de Android y luego desplegar los programas sobre el AVD en ejecución.
Para cambiar el kit de compilación de Qt Creator solo hay que dirigirse al kit seleccionado en la parte inferior izquierda del IDE y seleccionar el que convenga en ese instante.
Conclusión
Evidentemente, aquí no vamos a dar una clase sobre cómo programar con Qt ni utilizar su IDE oficial, eso lo dejamos en la pericia del programador, aunque siguiendo estos pasos ya tendría que ser capaz de crear aplicaciones que, utilizando las partes estándares de Qt, pueden ser compiladas tal cual tanto para un escritorio (Windows, Mac y Linux) como para Android (una pena que esto no abarque iOS).
Os dejamos con un vídeo que describe todo este proceso de forma más detallada, con la creación de un pequeño programa que se instala y ejecuta sobre un móvil Android de verdad.