build(android): build and sign a release, without the password touching anything
build-apk.ps1 -Release builds the Release configuration and signs with the user's keystore. Not through Delphi's Provisioning page, for three reasons: the .dproj is versioned, paclient --apksign puts the password ON THE COMMAND LINE where any process on the machine reads it, and tooling belongs in the repository rather than hidden in an IDE setting. apksigner called directly accepts --ks-pass env:. The password is asked for with Read-Host -AsSecureString - nothing echoed, nothing left in console history - handed over through an environment variable, and removed in a finally even when the script fails. It prints the certificate it signed with. A release signed by accident with the debug key installs and runs: nothing tells it apart in use, and one finds out only when the first update is refused. It does not install the release. Android refuses a different signature on an existing package, and uninstalling would wipe the local cache and the device's settings - a deliberate act, not a script's side effect. Keystores are gitignored. The debug path is unchanged and still builds.
This commit is contained in:
+31
-11
@@ -561,24 +561,44 @@ tombstones ni génération d'uuid.
|
||||
devenaient des membres inconnus. Invisible tant qu'on ne construit qu'en
|
||||
débogage — ce qui a été le cas jusqu'ici.
|
||||
|
||||
### Reste : la signature
|
||||
### La signature — outillée le 2026-08-22
|
||||
|
||||
Un magasin de clés dédié, jamais la clé de débogage — celle-ci est partagée par
|
||||
toutes les installations de Delphi, donc n'authentifie rien. Le mot de passe du
|
||||
magasin appartient à l'utilisateur ; il n'a sa place ni ici ni dans le dépôt.
|
||||
`build-apk.ps1` sait construire et signer une release. **Pas par Delphi** :
|
||||
|
||||
```
|
||||
.ndroid-clientuild-apk.ps1 -Release `
|
||||
-Keystore C:\cles\pmserver-release.jks -Alias pmserver
|
||||
```
|
||||
|
||||
Le magasin se crée une fois, hors du dépôt :
|
||||
|
||||
```
|
||||
keytool -genkeypair -v -keystore pmserver-release.jks -alias pmserver -keyalg RSA -keysize 4096 -validity 10000
|
||||
```
|
||||
|
||||
Puis, dans Delphi : *Project > Options > Provisioning*, configuration **Release**,
|
||||
pointer le fichier `.jks` et l'alias. Le magasin se range **hors du dépôt** et
|
||||
se sauvegarde ailleurs : le perdre interdit toute mise à jour de l'application
|
||||
déjà installée, Android refusant une signature différente.
|
||||
**Le mot de passe ne touche rien de durable.** Il est demandé par
|
||||
`Read-Host -AsSecureString` — rien ne s'affiche, rien ne reste dans
|
||||
l'historique de la console —, passé à `apksigner` par une variable
|
||||
d'environnement, et retiré dans un `finally` même si le script échoue.
|
||||
|
||||
Une release se construit ensuite comme le débogage, en changeant la
|
||||
configuration ; `android-client/build-apk.ps1` ne connaît que Debug pour
|
||||
l'instant, et ne saura signer que le jour où le magasin existe.
|
||||
Trois raisons de ne pas passer par *Project > Options > Provisioning* :
|
||||
le `.dproj` est versionné, `paclient --apksign` met le mot de passe **sur la
|
||||
ligne de commande** où n'importe quel processus de la machine le lit, et
|
||||
l'outillage doit rester lisible dans le dépôt plutôt que caché dans un
|
||||
réglage d'IDE. `apksigner` appelé en direct accepte `--ks-pass env:`.
|
||||
|
||||
Le script **affiche le certificat utilisé** après signature. Une release signée
|
||||
par mégarde avec la clé de débogage s'installe et fonctionne : rien ne la
|
||||
distingue à l'usage, et on ne s'en aperçoit qu'au refus de la première mise à
|
||||
jour.
|
||||
|
||||
Il **n'installe pas** la release : Android refuse une signature différente sur
|
||||
un paquet déjà présent, et désinstaller effacerait le cache local et les
|
||||
réglages de l'appareil. À faire sciemment, pas en effet de bord d'un script.
|
||||
|
||||
`*.jks` et `*.keystore` sont ignorés par git. **Le magasin se sauvegarde
|
||||
ailleurs** : le perdre interdit toute mise à jour de l'application déjà
|
||||
installée.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user