diff --git a/android-client/PLAN.md b/android-client/PLAN.md index c2cfb24..aac4775 100644 --- a/android-client/PLAN.md +++ b/android-client/PLAN.md @@ -138,6 +138,23 @@ confort, ce qui est le mauvais sens pour un gestionnaire de mots de passe. +## 1 ter. Écritures complexes — Skia (2026-08-15) + +Un nom de pièce jointe en arabe s'affichait en désordre. Ce n'était pas un +réglage manqué : le moteur de texte d'origine de FMX ne met pas en forme les +écritures complexes — pas de réordonnancement bidirectionnel, pas de liaison +des lettres. Séparer la taille du nom limitait les dégâts sans les supprimer. + +`GlobalUseSkia := True` avant `Application.Initialize` remplace le moteur de +rendu ; Skia embarque HarfBuzz et fait ce travail. Le prix est `libsk4d.so`, +25 Mo (8,9 Mo compressés), et un **APK qui passe de 13 à 22 Mo**. + +Conséquence sur la fabrication : `Deploy` reconstruit `library\lib` avant +`aapt`, donc la bibliothèque posée à la main disparaît. D'où +[repack-apk.ps1](repack-apk.ps1), qui refait *aapt → zipalign → signature* sur +le dossier déjà prêt. Une entrée `DeployFile` en bonne et due forme a été +tentée d'abord : MSBuild l'ignore, comme il ignore toutes les autres ici. + ## 2. Durcissement — petit, à faire avant tout usage réel Par ordre de gravité, pas de taille. diff --git a/android-client/README.md b/android-client/README.md index c13b9f2..45d6466 100644 --- a/android-client/README.md +++ b/android-client/README.md @@ -207,6 +207,16 @@ Ensuite `msbuild pmserverApk.dproj /p:Platform=Android64 /p:Config=Debug /t:Deploy` produit et signe `bin\pmserverApk.apk`, et `adb install -r` l'installe. Le correctif durable serait d'écrire ces entrées une fois dans le `.dproj`. +Enfin, **le rendu du texte passe par Skia**, ce qui ajoute `libsk4d.so` à +livrer. `Deploy` reconstruit `library\lib` juste avant d'appeler `aapt`, donc +toute bibliothèque posée à la main y disparaît — et les entrées de déploiement +ne fonctionnent pas ici. D'où un dernier passage qui refait *aapt → zipalign → +signature* sur le dossier déjà prêt, sans le vider : + +```bash +android-client\repack-apk.ps1 +``` + > **Place disque.** Le `.so` de debug pèse **91 Mo** (symboles), et le volume > `Z:` n'en fait que 2 Go. Le dépouiller avec le `strip` du NDK le ramène à > 54 Mo, et l'APK final à 16 Mo — mais `strip` écrit sa copie temporaire **à diff --git a/android-client/repack-apk.ps1 b/android-client/repack-apk.ps1 new file mode 100644 index 0000000..1cbdc16 --- /dev/null +++ b/android-client/repack-apk.ps1 @@ -0,0 +1,37 @@ +# Refait les trois dernieres etapes de l'empaquetage Android, sur le dossier +# deja prepare - sans le vider au prealable. +# +# POURQUOI : la cible Deploy de MSBuild reconstruit library\lib avant d'appeler +# aapt, ce qui efface toute bibliotheque native ajoutee a la main. Or ce projet +# n'a pas d'entrees de deploiement fonctionnelles (voir README), donc libsk4d.so +# - le moteur Skia, indispensable au rendu de l'arabe - ne peut y arriver +# autrement. On laisse donc Deploy faire son travail, puis on remet la +# bibliotheque et on refait aapt / zipalign / signature. +# +# A lancer depuis la racine du depot, apres un Deploy reussi. + +$ErrorActionPreference = 'Stop' + +$sdk = 'C:\Users\Public\Documents\Embarcadero\Studio\23.0\CatalogRepository\AndroidSDK-2525-23.0.51511.6924' +$bds = 'C:\Program Files (x86)\Embarcadero\Studio\23.0' +$jdk = 'C:\Program Files\Eclipse Adoptium\jdk-11.0.15.10-hotspot' +$pac = "$bds\bin\paclient.exe" +$p = '.\Android64\Debug\pmserverApk' + +# 1. Remettre Skia, que Deploy vient d'effacer. +Copy-Item "$bds\binandroid64\libsk4d.so" "$p\library\lib\arm64-v8a\libsk4d.so" -Force + +# 2. aapt : reconstruit l'archive non alignee depuis library, classes, res. +& $pac -u8 --aaptpackage="$sdk\build-tools\33.0.2\Aapt.exe,$p\library,$p\classes,$p\res,$p\assets,$p\AndroidManifest.xml,$sdk\platforms\android-33\android.jar,$p\bin\pmserverApk-unaligned.apk" +if ($LASTEXITCODE -ne 0) { throw "aapt a echoue" } + +# 3. zipalign refuse d'ecraser sa sortie : l'APK precedent doit disparaitre. +Remove-Item "$p\bin\pmserverApk.apk" -Force -ErrorAction SilentlyContinue +& $pac -u8 --zipalign="$sdk\build-tools\33.0.2\ZipAlign.exe,$p\bin\pmserverApk-unaligned.apk,$p\bin\pmserverApk.apk,4" +if ($LASTEXITCODE -ne 0) { throw "zipalign a echoue" } + +& $pac -u8 --apksign="$jdk\bin\java.exe,$sdk\build-tools\33.0.2\lib\apksigner.jar,$p\bin\pmserverApk.apk,androiddebugkey,$env:APPDATA\Embarcadero\BDS\23.0\debug.keystore,android,android" +if ($LASTEXITCODE -ne 0) { throw "signature echouee" } + +$apk = Get-Item "$p\bin\pmserverApk.apk" +"APK {0:N1} Mo" -f ($apk.Length / 1MB) diff --git a/pmserverApk.dpr b/pmserverApk.dpr index edbbc44..0dd6b7d 100644 --- a/pmserverApk.dpr +++ b/pmserverApk.dpr @@ -3,6 +3,16 @@ program pmserverApk; uses System.StartUpCopy, FMX.Forms, + // Skia remplace le moteur de rendu de FMX. Ce n'est pas un choix esthetique : + // celui d'origine ne met pas en forme les ecritures complexes - pas de + // reordonnancement bidirectionnel, pas de liaison des lettres arabes - et un + // nom de piece jointe en arabe s'affichait donc en desordre. Skia embarque + // HarfBuzz et fait ce travail correctement. + // + // Le prix est libsk4d.so, 25 Mo, a poser dans lib/arm64-v8a de l'APK. Le + // deploiement automatique s'en chargerait ; ici il ne deploie rien, donc la + // bibliotheque est mise en place a la main comme le manifeste et les .dex. + FMX.Skia, mainApk in 'mainApk.pas' {Form8}, PMA.Crypto in 'android-client\PMA.Crypto.pas', PMA.TestVector in 'android-client\PMA.TestVector.pas', @@ -18,9 +28,12 @@ uses {$R *.res} begin + // AVANT Application.Initialize : le canevas est choisi a l'initialisation, + // et le basculer ensuite ne rattrape pas ce qui est deja construit. + GlobalUseSkia := True; Application.Initialize; - // Avant la creation de la forme : appliquer un style apres coup laisse les - // controles deja construits avec l'ancien. + // Le style se pose apres l'initialisation mais avant la forme : l'appliquer + // plus tard laisserait les controles deja construits avec l'ancien. ApplyDarkTheme; Application.CreateForm(TForm8, Form8); Application.Run; diff --git a/pmserverApk.dproj b/pmserverApk.dproj index 747c126..47a1f89 100644 --- a/pmserverApk.dproj +++ b/pmserverApk.dproj @@ -344,6 +344,18 @@ true + + + libsk4d.so + true + + + + + library\lib\arm64-v8a + 1 + + 1