[FIX] todo qemu: find the APK where AGP writes it, and install it as it is

The app runs in the emulator now, and two of my own checks were wrong. With an
injected ABI, AGP writes to intermediates/apk/debug, not outputs/apk/debug: a
SUCCESSFUL build was reported "no APK produced" because only the second path
was searched. That same mode marks the APK testOnly, so adb refuses it without
-t — INSTALL_FAILED_TEST_ONLY. Both measured on the emulator, where
ca.erplibre.home then installed, launched, and ran its SQLite migrations.

The manifest also stops tracking sentencepiece at master, which made the build
non-reproducible and, since August, unbuildable: master fetches protobuf and
compiles protoc for the Android target before running it on the host. v0.2.1
ships its .pb.cc pre-generated. Its own absl subset still lacks
flags/flag.cc, so that library remains to be sorted out upstream.

--- FR ---

L'application tourne dans l'émulateur, et deux de mes propres contrôles étaient
faux. Avec une ABI injectée, AGP écrit dans intermediates/apk/debug et non dans
outputs/apk/debug : une compilation RÉUSSIE était rapportée « aucun APK
produit » parce que je ne regardais que le second chemin. Ce même mode marque
l'APK testOnly, et adb le refuse sans -t — INSTALL_FAILED_TEST_ONLY. Les deux
mesurés sur l'émulateur, où ca.erplibre.home s'est ensuite installé, lancé, et
a joué ses migrations SQLite.

Le manifeste cesse aussi de suivre sentencepiece à master, ce qui rendait la
compilation non reproductible et, depuis août, impossible : master récupère
protobuf et compile protoc pour la cible Android avant de l'exécuter sur
l'hôte. La v0.2.1 livre ses .pb.cc pré-générés. Son propre sous-ensemble absl
manque encore flags/flag.cc : cette bibliothèque reste à régler en amont.

Assisted-by: Claude Opus 5
This commit is contained in:
Mathieu Benoit 2026-08-18 02:53:17 -04:00
parent 9ad2048bbb
commit 07b4c81207
3 changed files with 30 additions and 4 deletions

View file

@ -12,12 +12,20 @@
groups="mobile"
/>
<!-- sentencepiece : tokeniseur SentencePiece pour MarianMT (NDK JNI) -->
<!-- sentencepiece : tokeniseur SentencePiece pour MarianMT (NDK JNI)
Version PUBLIÉE, et non « master ». Deux raisons, la seconde
bloquante : « master » fait de ce dépôt une cible mouvante, et deux
VM construites le même jour peuvent ne pas contenir le même code ;
surtout, le master d'août 2026 récupère protobuf par FetchContent et
bâtit son « protoc » POUR LA CIBLE Android avant de l'exécuter sur
l'hôte — « Exec format error », la compilation s'arrête là. Mesuré sur
une VM Ubuntu 24.04. La v0.2.1 livre au contraire ses .pb.cc
pré-générés (src/builtin_pb) et n'a besoin d'aucun protoc. -->
<project
name="sentencepiece"
path="mobile/erplibre_home_mobile/android/app/src/main/cpp/sentencepiece"
remote="google"
revision="master"
revision="refs/tags/v0.2.1"
clone-depth="1"
groups="mobile"
/>

View file

@ -5859,8 +5859,16 @@ class TODO:
f"'cd {el_dir}/mobile/erplibre_home_mobile && npm test' && "
# L'APK est la preuve, pas le code de sortie de Gradle : une tâche
# peut rendre 0 sans avoir rien produit.
# DEUX emplacements, et il faut les deux. Avec une ABI injectée,
# AGP écrit dans « intermediates/apk/debug » et non dans
# « outputs/apk/debug » : mesuré, une compilation RÉUSSIE était
# rapportée « aucun APK produit » parce que je ne regardais que le
# second. Un contrôle qui cherche au mauvais endroit ne vaut pas
# mieux que pas de contrôle.
f"apk=$(ls {el_dir}/mobile/erplibre_home_mobile/android/app/build"
"/outputs/apk/debug/*.apk 2>/dev/null | head -1); "
"/outputs/apk/debug/*.apk "
f"{el_dir}/mobile/erplibre_home_mobile/android/app/build"
"/intermediates/apk/debug/*.apk 2>/dev/null | head -1); "
'if [ -n "$apk" ]; then '
f'echo " ✅ {t("APK built:")} $apk"; '
# Capacitor sert la même application dans un navigateur : sur une
@ -5948,7 +5956,10 @@ class TODO:
f'echo " {t("open it from your workstation:")} '
'ssh -X erplibre@$ip \\"$HOME/android/emulator/emulator -avd erplibre -no-audio\\""; '
f'echo " {t("then install the APK:")} '
'ssh erplibre@$ip \\"$HOME/android/platform-tools/adb install -r '
# « -t » : l'ABI injectée fait marquer l'APK « testOnly » par AGP,
# et adb le refuse sans ce drapeau — « INSTALL_FAILED_TEST_ONLY ».
# Mesuré sur l'émulateur.
'ssh erplibre@$ip \\"$HOME/android/platform-tools/adb install -r -t '
f"{el_dir}/mobile/erplibre_home_mobile/android/app/build"
'/outputs/apk/debug/app-debug.apk\\""'
)

View file

@ -339,6 +339,13 @@ class TestMobileBuild(unittest.TestCase):
cmd = self.todo._qemu_mobile_remote_cmd()
self.assertIn("outputs/apk/debug/*.apk", cmd)
def test_both_apk_locations_are_searched(self):
"""Avec une ABI injectée, AGP écrit dans intermediates et non dans
outputs : mesuré, une compilation RÉUSSIE était rapportée « aucun APK
produit » parce qu'un seul des deux chemins était regardé."""
cmd = self.todo._qemu_mobile_remote_cmd()
self.assertIn("intermediates/apk/debug/*.apk", cmd)
def test_no_apk_means_non_zero(self):
"""Éprouvé plutôt que relu : sans APK, le bloc DOIT rendre non nul.
Une ligne d'information placée après le « fi » suffisait à rendre 0 et