Home > 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.
| 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 comebMultiThread:Cliente.Get('/rota', AoResponder, ebMultiThread).
Ver O cliente.
1.2 🚧java\ ao lado do .dpr os dois jars desrc\engine\okhttp\java: okhttp-4.11.0.jar e ralokhttp.jar.Project > Add... > Libraries (plataforma Android) e adicione os dois.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.
1.2 🚧external, pasta msquic/, os zipsmsquic-2.6.1-android_arm64-v8a.zip e ..._armeabi-v7a.zip.libmsquic.so em lib\arm64-v8a\ e lib\armeabi-v7a\ ao lado do.dpr.Project > Deployment, adicione os arquivos com Remote Pathlibrary\lib\arm64-v8a\ (Android 64) e library\lib\armeabi-v7a\ (Android 32).LibPath vazio. No código: Cliente.EngineType := ENGINEMSQUIC; eRALMsQuicClient 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');
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.
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.
| 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 |
Wiki: Home
Wiki: _Sidebar
Wiki: cliente
Wiki: guia_dependencias
Wiki: http2
Wiki: licencas
Wiki: qual motor
Wiki: quic
Wiki: roadmap