Menu ▾ ▴

android

Mobius One

Home > Android

Android

Delphi · Nível: intermediário

Em uma frase: qual motor usar num aplicativo Android, e o que colocar dentro do
APK para ele funcionar.

Qual cliente

Motor Desde Quando Precisa no APK Android mínimo
netHTTP 1.0 HTTP comum, sem nada a instalar nada o do Delphi
OkHttp 1.2 🚧 HTTP/2, ou aceitar só um certificado (SSL.Pins) 2 jars o do Delphi
MsQuic 1.2 🚧 QUIC com servidor RAL MsQuic; também servidor no celular libmsquic.so por arquitetura 9
Kwik 1.2 🚧 QUIC no Android 8, ou sem biblioteca nativa 5 jars 8

O netHTTP no Android não faz HTTP/2 nem lê a impressão digital do certificado:
por isso existe o OkHttp.

[!WARNING]
No Android, rede na thread principal é proibida (NetworkOnMainThreadException).
Chame com ebMultiThread: Cliente.Get('/rota', AoResponder, ebMultiThread).
Ver O cliente.

OkHttp 1.2 🚧

  1. Copie para uma pasta java\ ao lado do .dpr os dois jars de
    src\engine\okhttp\java: okhttp-4.11.0.jar e ralokhttp.jar.
  2. Project > Add... > Libraries (plataforma Android) e adicione os dois.
  3. No código:

    :::pascal
    uses RALClient, RALConsts, RALTypes, RALOkHttpClient; // a unit precisa estar no uses

    Cliente.EngineType := ENGINEOKHTTP; // 'OkHttp'
    Cliente.HTTPVersion := rhv2; // opcional: HTTP/2

Faltou um jar? O erro aparece no primeiro pedido: ClassNotFoundException.

MsQuic 1.2 🚧

  1. Baixe do branch external, pasta msquic/, os zips
    msquic-2.6.1-android_arm64-v8a.zip e ..._armeabi-v7a.zip.
  2. Coloque cada libmsquic.so em lib\arm64-v8a\ e lib\armeabi-v7a\ ao lado do
    .dpr.
  3. Project > Deployment, adicione os arquivos com Remote Path
    library\lib\arm64-v8a\ (Android 64) e library\lib\armeabi-v7a\ (Android 32).
  4. Deixe LibPath vazio. No código: Cliente.EngineType := ENGINEMSQUIC; e
    RALMsQuicClient no uses.

Servidor no celular: o certificado e a chave vão no Deployment com Remote Path
assets\internal\, e no código:

Servidor.SSL.CertificateFile := TPath.Combine(TPath.GetDocumentsPath, 'cert.pem');
Servidor.SSL.PrivateKeyFile  := TPath.Combine(TPath.GetDocumentsPath, 'key.pem');

Kwik 1.2 🚧

Os 5 jars de src\engine\kwik\java (kwik-0.11.jar, agent15-3.3.jar,
hkdf-2.0.0.jar, io.whitfin.siphash-2.0.1.jar, ralkwik.jar) entram como no
OkHttp. Cliente.EngineType := ENGINEKWIK; e RALKwikClient no uses.

[!NOTE]
O Kwik é LGPL v3. Veja o que isso significa para um aplicativo fechado antes
de distribuir. Ver Licenças.

Certificado autoassinado no celular

Desde o Android 7 um app não confia em certificado instalado pelo usuário. A saída
é o app aceitar o certificado pela impressão digital: SSL.Pins, com OkHttp,
MsQuic ou Kwik. Ver HTTPS no cliente.

Erros comuns

O que acontece Causa O que fazer
NetworkOnMainThreadException pedido na thread principal ebMultiThread
ClassNotFoundException o jar não entrou no APK Project > Add > Libraries
MsQuic: erro do linker ao carregar Android 8 ou anterior, ou .so da arquitetura errada Android 9+, ou use Kwik
emCertPinUnsupported SSL.Pins com netHTTP no Android use OkHttp
emOkHttpAndroidOnly OkHttp rodando no Windows no Windows use netHTTP

Veja também


Related

Wiki: Home
Wiki: _Sidebar
Wiki: cliente
Wiki: guia_dependencias
Wiki: http2
Wiki: licencas
Wiki: qual motor
Wiki: quic
Wiki: roadmap