Package de ejemplo para generar una librería que pueda integrarse con Android.
Para configurar el ambiente, se utilizaron dos imágenes de Docker distintas, una que provee los SDK de Android y el lenguaje Go en sí (ci/Dockerfile.android), y otra que toma esta configuración y ajusta las variables de entorno necesarias para la compilación (ci/Dockerfile.library). Originalmente, la primera imagen se tomó de aquí, y se adaptó a las necesidades del desarrollo (por ej., el Dockerfile aquí visto, no contiene gradle)
Si se quiere desplegar de manera automática este ambiente de desarrollo, el usuario debe contar con VSCode (y Docker desktop). Al abrir este proyecto en dicho IDE, éste detectará la presencia de la carpeta .devcontainer, en la cual se encuentra un archivo de configuración .json, que permite iniciar un contenedor con los Dockerfiles mencionados.
Además, si finalmente se quiere generar una imagen de 🐳 que contenga solamente el paquete generado, en (ci/Dockerfile.library) basta con descomentar las últimas líneas, y ejecutar:
docker build -f ci/Dockerfile.library -t [some-tag] .
La carpeta library contiene todo el código necesario. Se notará que se encuentra todo en una sóla carpeta, y no porque sea un ejemplo, si no porque actualmente gomobile no soporta del todo la importación de distintos paquetes (ver aquí el issue asociado).
En cuanto al código en sí, existen un par de aclaraciones que es necesario realizar:
- Tipos: gomobile admite sólo éstos
- Parámetros: se deben pasar por referencia. Es decir que si normalmente se tendría una función:
func AddUser(userInfo User){
...
}
Para poder tener su "equivalente" en la librería, deberá escribirse como:
func AddUser(userInfo *User){
...
}
- Retornos: aplica la misma condición que para los parámetros. Además, es muy imporante tener en cuenta que no permite el retorno de slices de structs. Para solucionar esto, sí admite el retorno de slices de bytes, como puede observarse en mobile.go
- Uso general: si bien el compilador genera setters y getters para structs, no lo hará para structs de structs, como es el caso de model.go. Es por esto, que para poder manipular este tipo de objeto, se deberá agregar un método adicional para generar dicha asociación.