Files
Password-Manager/android-client/build-apk.ps1
T
r-zakarya 68df2dd7e7 feat(android): read the snapshot from a Gitea repo, and close cleartext
PMA.SyncClient now speaks two transports, told apart by the URL:
/api/v1/repos/ means the Gitea contents API, anything else the old PHP
endpoint. The PHP path stays until the Windows side publishes to the repo
too - without it the migration would need both ends flipped at once, with
no way back.

Three things differ on the Gitea side and nothing else: the header is
"token <PAT>" not "Bearer" (swapping them gives a silent 401), the body is
JSON carrying base64 content, and the fingerprint comparison happens in the
client since the API has no If-None-Match. The body is re-downloaded, which
is cheap; the four-second key derivation is still avoided. The result's
ETag field carries the sha, so the caller cannot tell which transport
answered.

usesCleartextTraffic is replaced by a network config that permits cleartext
to 127.0.0.1 and localhost BY NAME and forbids it everywhere else. The
attribute drew no such line: a mistyped URL sent the bearer token over the
network in the clear with nothing to signal it. Now it fails immediately,
which is the behaviour worth having.

Verified in the built APK: res/xml/network_security_config.xml is present
and the manifest attribute resolves to a real resource id. NOT verified
against a real repo - that needs a private repo, a published
vault-sync.json and a token, none of which exist yet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 11:55:24 +01:00

71 lines
3.6 KiB
PowerShell

# Compile, empaquette, installe et lance le client Android.
#
# POURQUOI CE SCRIPT. La chaine a quatre etapes qui ne s'appellent pas entre
# elles, et en sauter une donne un APK qui s'installe sans porter la
# modification - le symptome se lit alors comme un bug applicatif. La premiere,
# web.res, s'est deja fait oublier une fois : la page embarquee etait celle
# d'avant l'edition, et le pont echouait pour une raison qui n'existait plus.
#
# -NoInstall compile et empaquette sans toucher au telephone.
param([switch]$NoInstall)
$ErrorActionPreference = 'Stop'
$root = Split-Path $PSScriptRoot -Parent
$bin = 'C:\Program Files (x86)\Embarcadero\Studio\23.0\bin'
$sdk = 'C:\Users\Public\Documents\Embarcadero\Studio\23.0\CatalogRepository'
$adb = "$sdk\AndroidSDK-2525-23.0.51511.6924\platform-tools\Adb.exe"
$strip = "$sdk\AndroidNDK-21-23.0.51511.6924\android-ndk-r21\toolchains\" +
'aarch64-linux-android-4.9\prebuilt\windows-x86_64\aarch64-linux-android\bin\strip.exe'
$out = "$root\Android64\Debug"
$stage = "$out\pmserverApk"
# 1. La page HTML -> ressource liee dans l'executable.
Push-Location "$PSScriptRoot\web"
& "$bin\brcc32.exe" web.rc -foweb.res | Out-Null
Pop-Location
# 2. Compilation Delphi.
$msbuild = "`"$bin\rsvars.bat`" && msbuild `"$root\pmserverApk.dproj`""
$log = cmd /c "$msbuild /p:Platform=Android64 /p:Config=Debug /t:Build /v:minimal /nologo" 2>&1
$err = $log | Select-String -Pattern 'error'
if ($err) { $err | ForEach-Object { $_.Line }; throw 'compilation echouee' }
$log | Select-String -Pattern 'lines,' | ForEach-Object { $_.Line.Trim() }
# 3. Mise en place a la main de ce que le deploiement ne place pas : manifeste,
# .dex, et la bibliotheque native ALLEGEE - la version de debogage pese
# 91 Mo, plus que la place libre sur ce volume.
Copy-Item "$out\AndroidManifest.xml" "$stage\AndroidManifest.xml" -Force
Copy-Item "$out\pmserverApk.classes\*.dex" "$stage\classes\" -Force
& $strip --strip-debug -o "$stage\library\lib\arm64-v8a\libpmserverApk.so" "$out\libpmserverApk.so"
# L'AAPT DE DEPLOY ECHOUE, ET C'EST ATTENDU. Le manifeste reference
# @xml/network_security_config, que la generation de ressources de Delphi ne
# contient pas ; poser le fichier avant Deploy ne sert a rien, Deploy reconstruit
# res\ juste avant d'appeler aapt. L'etape suivante repose nos ressources et
# refait l'archive entiere, donc l'APK livre est complet - verifie a
# "aapt list" : res/xml/network_security_config.xml y est, et l'attribut du
# manifeste resout vers un identifiant reel.
#
# On ne masque donc que CETTE erreur, nommement, et tout autre message remonte.
$deploy = cmd /c "$msbuild /p:Platform=Android64 /p:Config=Debug /t:Deploy /v:minimal /nologo" 2>&1
$deploy | Select-String -Pattern 'error' |
Where-Object { $_.Line -notmatch 'network_security_config|Unable to execute.*Aapt\.exe' } |
ForEach-Object { $_.Line }
# 4. aapt + zipalign + apksigner, et remise en place de ce que Deploy efface.
& "$PSScriptRoot\repack-apk.ps1" | Select-Object -Last 1
if ($NoInstall) { return }
# adb ecrit sa progression sur la sortie d'erreur, ce que PowerShell prend pour
# un echec. Sans ce relachement, une installation reussie interrompt le script.
$ErrorActionPreference = 'Continue'
& $adb install -r "$stage\bin\pmserverApk.apk" 2>&1 |
Select-String -Pattern 'Success|Failure' | ForEach-Object { $_.Line }
# Le telephone voit le poste comme 127.0.0.1 par ce renvoi.
& $adb reverse tcp:8080 tcp:80 | Out-Null
& $adb shell am force-stop com.embarcadero.pmserverApk
& $adb shell am start -n com.embarcadero.pmserverApk/com.embarcadero.firemonkey.FMXNativeActivity | Out-Null