Cómo generar un Android App Bundle con Delphi


Android App Bundle es el nuevo formato oficial de publicación de archivos de Android.
Al utilizar este formato Google Play lo que hace es optimizar el archivo apk que se envía al usuario cuando quiere descargar nuestra app desde la tienda de Google, reduciendo su tamaño y enviando al usuario sólo los recursos que necesita para que funcione en su dispositivo, con lo que su descarga es mucho más rápida.
En pruebas que he estado haciendo un apk de 20 Mb se me reduce hasta los 11 Mb.
El sistema que utiliza se llama Dynamic Delivery y permite aumentar el tamaño del apk hasta los 150 Mb sin tener que usar archivos de expansión.
El Android App Bundle es un archivo con extensión ".aab" que se sube a Google Play para dar compatibilidad con Dynamic Delivery.

El formato es el siguiente:
Los directorios de color azul, como drawable/, values/ y lib/, representan el código y los recursos que usa Google Play cuando crea un apk de configuración para cada módulo.

Los paquetes de aplicaciones organizan tu app en directorios, y cada directorio representa un módulo. Dentro de cada directorio de módulo, el código y los recursos se organizan de manera similar al contenido de un APK típico. 

Cómo generar un Android app bundle desde RAD STUDIO

Todo lo siguiente está realizado con RAD STUDIO Tokyo 10.3 Update 3
Primero hay que comprobar que se puede generar un apk de 32 bits y de 64 bits y que funciona correctamente.
Después accedemos al menú Project - Options - Building -Delphi Compiler - Compiling



En target marcamos All configurations - Android 64 bit platform

En el apartado Other options marcamos el check:
Generate Android App Bundle file (arm + arm64)

Si posteriormente ejecutamos nuestra app, nos aparecerá un aviso diciendo que se ha creado el archivo con extensión .aab en la carpeta Android64-Release--Bin

Para comprobar que esta apk la pueden abrir usuarios que tengan dispositivos de 32 y de 64 bits lo que hay que hacer es cambiar la extensión "aab" a "zip", después se descomprime el zip y se verifica que existen las siguientes carpetas armeabi-v7a y arm64-v8a en la ruta:

-base-lib


Dentro de cada de una de ellas tienen que encontrarse los archivos con extensión ".so" que son las bibliotecas que utiliza nuestra app y que se descargarán automáticamente según el tipo de dispositivo del usuario.

Hasta ahora lo que hacíamos los desarrolladores es crear una app de 32 o 64 bits y subirla a Google Play para que lo ejecutasen los usuarios, pero después de la prohibición de Google de subir a su tienda apps de 32 bits,  es imprescindible usar los Android App Bundle si se requiere que los usuarios con dispositivos antiguos de 32 bits puedan ejecutar las actualizaciones de las apps.

Como ven de nuevo Embarcadero con Delphi, Rad Studio, Firemonkey nos ponen las cosas muy fáciles, simplemente activando un check conseguimos solucionarlo.

















Rutinas para utilizar ficheros y carpetas con Firemonkey




A continuación les relaciono una serie de rutinas basadas en Firemonkey, asociadas con la utilización de ficheros y carpetas.
Realmente hay muchas más, pero como lo que quiero es que esta página les pueda ser útil, sólamente he puesto las que mas se usan cuando se programa.
Algunas realmente simplifican lo que antes teníamos en la VCL, como por ejemplo el obtener los ficheros de una carpeta, ya que con Firemonkey se puede hacer con una única instrucción:  TDirectory.GetFiles

Recordar que hay que añadir en el apartado "uses" la unit System.IOUtils 

- Obtener los ficheros de una carpeta
VAR
  DirList: TStringDynArray;
  S:String;
BEGIN

    DirList := TDirectory.GetFiles(DirPath, '*.jpg');
    IF Length(DirList) = 0 THEN
    BEGIN
    // showmessage('No hay ficheros en ' + DirPath)
    END
    ELSE // Ficheros encontrados
    BEGIN
      FOR S IN DirList DO
        BEGIN
             listbox1.items.add(S);
        END;
    END;
END;

- Obtener el tamaño de un fichero
FilesizeByName esta en la unit  IDGlobalProtocols


Tamano := FilesizeByName('c:\fichero.txt');

- Obtener la fecha de creación de un fichero
fecha := DatetimeToStr(Tfile.GetCreationTime('c:\fichero.txt'));

- Obtener la fecha del último acceso
fecha := DatetimeToStr(Tfile.GetLastAccessTime('c:\fichero.txt'));

- Obtener la fecha de la última modificación
fecha := DatetimeToStr(Tfile.GetLastWriteTime('c:\fichero.txt'));

- Guardar el contenido de un fichero en un string
var
s:string;
S := Tfile.ReadAllText('c:\fichero.txt'));

- Borrar un fichero
Tfile.Delete(TPath.Combine(DirPath, 'fichero.txt'));

- Comprobar que existe un fichero
if tFile.Exists(TPath.Combine(DirPath, 'fichero.txt')) 
then showmessage('Existe') 
else showmessage('NO existe');

- Copiar un fichero
tfile.Copy('c:\origen.jpg','c:\destino.jpg');

- Encriptar y desencriptar un fichero (sólo para Windows)
tfile.Encrypt('c:\fich.jpg');
tfile.Decrypt('c:\fich.jpg');

- Añadir texto a un fichero existente
texto:='texto que se quiere añadir';
TFile.AppendAllText('c:\fichero.txt',texto,tEncoding.utf8);

- Crear una carpeta
TDirectory.CreateDirectory(DirTMP);

- Comprobar que existe una carpeta
  IF TDirectory.Exists(DirTMP) THEN
  BEGIN
    showmessage('existe la carpeta');
  END;

- Copiar el contenido de una carpeta en otra
   TDirectory.Copy('c:\carpetaOrigen','c:\carpetaDestino')

- Borrar recursivamente el contenido de una carpeta
  BorrarRecursivamente:=true;
  tDirectory.Delete('c:\carpetaABorrar',BorrarRecursivamente);

- Obtener la fecha de creación de una carpeta
fecha := DatetimeToStr(TDirectory.GetCreationTime('c:\documentos'));

- Obtener la fecha del último acceso a una carpeta
fecha := DatetimeToStr(TDirectory.GetLastAccessTime('c:\documentos'));

- Obtener la fecha de la última modificación de una carpeta
fecha := DatetimeToStr(TDirectory.GetLastWriteTime('c:\documentos'));

También te puede interesar:

Rutinas gráficas con Firemonkey
Código para programadores Android
El directorio Home en tus aplicaciones Android
Funciones para trabajar con Word

Mercadona selecciona 200 informáticos




Mercadona, para los que no la conozcan, es una de las principales empresas de supermercados físicos y online en España, a fecha de hoy dispone de 1629 tiendas en toda España y una plantilla de 85500 personas. 

Cuenta actualmente con un Departamento de Informática compuesto por setecientos profesionales multidisciplinares especializados en Ingeniería Software, tanto FrontEnd como BackEnd, Cloud, Site Reliability, Jefes de Proyecto, Arquitectura Empresarial, Administradores de Sistemas, Operaciones, Analítica, IoT y Seguridad Informática. 

Actualmente se encuentra en un proceso de transformación digital de todos los procesos de la compañía, por lo que ha abierto un proceso de contratación de 200 personas.
La política de la empresa es que la mayoría de las contrataciones se conviertan en indefinidas pasando un breve período de prueba y el sueldo que ofrece es muy atrayente:

Para puestos técnicos: 
Sueldo hasta de 34.500€ bruto/anual más objetivos (jornada completa). 

Para responsables: 
Sueldo hasta de 69.000€ bruto/anual, más objetivos (jornada completa). 

Formación a cargo de la empresa en todos los puestos. 
Todos los trámites se hacen por vía telemática y los aspirantes deben registrase en la bolsa de trabajo que tienen en internet. 
El código identificativo para solicitar el puesto es el 64071. 
Si en la primera fase de criba eres seleccionado, se te citará para una entrevista personal. 

Guía del candidato 
Ofertas de empleo 

Seguramente muchos de los lectores de este blog cumplen los requisitos que requiere esta oferta de trabajo ¿por qué no se animan a intentarlo?