Al desarrollar un proyecto para la plataforma Android, incluso el más pequeño, tarde o temprano, tiene que lidiar con el entorno de desarrollo. Además del SDK de Android, necesita la última versión de Kotlin, Gradle, herramientas de plataforma, herramientas de compilación. Y si en la máquina del desarrollador todas estas dependencias se resuelven en mayor medida utilizando el IDE de Android Studio, entonces en el servidor CI / CD cada actualización puede convertirse en un dolor de cabeza. Y si en el desarrollo web, Docker se convirtió en la solución estándar para el problema del medio ambiente, entonces ¿por qué no tratar de resolver un problema similar en el desarrollo de Android ...
Para aquellos que no saben qué es Docker, si es muy simple, entonces esta es una herramienta para crear el llamado Docker. “Contenedores” donde están contenidos el núcleo mínimo del sistema operativo y el conjunto de software necesario, que podemos implementar donde queramos, preservando el medio ambiente. Lo que exactamente estará en nuestro contenedor se define en el Dockerfile, que luego se ensambla en una imagen lanzada en cualquier lugar y que posee propiedades de idempotencia.
El proceso de instalación y los conceptos básicos de Docker se describen perfectamente en su
sitio web oficial . Por lo tanto, corriendo un poco por delante, aquí tenemos un Dockerfile
# .. Android- Gradle, # Docker- # Gradle FROM gradle:5.4.1-jdk8 # Android SDK # ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip" \ ANDROID_HOME="/usr/local/android-sdk" \ ANDROID_VERSION=28 \ ANDROID_BUILD_TOOLS_VERSION=28.0.3 # , SDK , # RUN mkdir "$ANDROID_HOME" .android \ && cd "$ANDROID_HOME" \ && curl -o sdk.zip $SDK_URL \ && unzip sdk.zip \ && rm sdk.zip \ # # . . Android # # # && mkdir "$ANDROID_HOME/licenses" || true \ && echo "24333f8a63b6825ea9c5514f83c2829b004d1" > "$ANDROID_HOME/licenses/android-sdk-license" \ && echo "84831b9409646a918e30573bab4c9c91346d8" > "$ANDROID_HOME/licenses/android-sdk-preview-license" # SDK build-tools, platform-tools RUN $ANDROID_HOME/tools/bin/sdkmanager --update RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \ "platforms;android-${ANDROID_VERSION}" \ "platform-tools"
Lo guardamos en la carpeta con nuestro proyecto de Android e iniciamos el ensamblaje del contenedor con el comando
docker build -t android-build:5.4-28-27 .
La
opción -t especifica la etiqueta o el nombre de nuestro contenedor, que generalmente consiste en su nombre y versión. En nuestro caso, lo llamamos android-build, y en la versión especificamos un conjunto de versiones de gradle, android-sdk y platform-tools. En el futuro, será más fácil para nosotros buscar la imagen que necesitamos por nombre usando esta "versión".
Después de que el ensamblaje haya pasado, podemos usar nuestra imagen localmente, podemos subirla con el
comando push docker a un repositorio de imágenes público o privado para descargarla en otras máquinas.
Como ejemplo, recopilamos el proyecto localmente. Para hacer esto, ejecute el comando en la carpeta del proyecto
docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 gradle assembleDebug
Veamos que significa:
docker run : el comando de lanzamiento de la imagen en sí
-rm : significa que después de detener el contenedor, elimina todo lo que se creó en el proceso de su vida.
-v "$ PWD": / home / gradle / - monta la carpeta actual con nuestro proyecto de Android en la carpeta interna del contenedor / home / gradle /
-w / home / gradle : establece el directorio de trabajo del contenedor
android-build: 5.4.1-28-27 : el nombre de nuestro contenedor que recopilamos
gradle assembleDebug - en realidad el equipo de construcción que construye nuestro proyecto
Si todo va bien, luego de un par de segundos / minutos, verá en su pantalla algo como ¡
CONSTRUIR CON ÉXITO en 8m 3s ! Y en la carpeta app / build / output / apk estará la aplicación ensamblada.
De la misma manera, puede realizar otras tareas de gradle: verificar el proyecto, ejecutar pruebas, etc. La principal ventaja es que si necesita construir el proyecto en cualquier otra máquina, no tenemos que preocuparnos por instalar todo el entorno y será suficiente para descargar la imagen necesaria y ejecutar el ensamblaje en él.
El contenedor no almacena ningún cambio, y cada ensamblaje comienza desde cero, lo que por un lado garantiza la identidad del ensamblaje independientemente de dónde se lanzó, por otro lado, cada vez que tiene que descargar todas las dependencias y compilar todo el código nuevamente, y esto a veces puede llevar un tiempo considerable. Por lo tanto, además del inicio "en frío" habitual, tenemos la opción de iniciar el ensamblaje mientras se mantiene el llamado. "Caché", donde guardamos la carpeta ~ / .gradle simplemente copiándola en la carpeta de trabajo del proyecto, y al comienzo de la próxima compilación la devolvemos. Ponemos todos los procedimientos de copia en scripts separados y el comando de lanzamiento comenzó a verse así
docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 /bin/bash -c "./pre.sh; gradle assembleDebug; ./post.sh"
Como resultado, el tiempo promedio de ensamblaje del proyecto para nosotros se redujo varias veces (dependiendo del número de dependencias del proyecto, pero el proyecto promedio comenzó a ensamblarse en 1 minuto en lugar de 5 minutos).
Todo esto por sí solo tiene sentido solo si tiene su propio servidor interno de CI / CD, cuyo soporte está involucrado. Pero ahora hay muchos servicios en la nube en los que se han resuelto todos estos problemas y no tiene que preocuparse por esto y también puede especificar las propiedades de ensamblaje necesarias en la configuración del proyecto.