Guide de dépannage (Troubleshooting)
Cette page recense les problèmes les plus fréquents rencontrés lors de l'intégration ou de l'exploitation du SDK tk_ota_push et du moteur natif, avec leur cause exacte dans le code et la procédure de résolution.
1. Le patch n'est pas téléchargé ou ne s'applique pas
Symptôme A : TkOtaPush.instance.isAvailable retourne false
- Cause : L'application a été lancée en mode Debug (
flutter run) ou compilée avec le SDK Flutter standard au lieu de la toolchain Shorebird (tk-ota-push release). - Solution : Compilez toujours le binaire de base avec
tk-ota-push releaseet installez l'APK/IPA généré en mode Release.
Symptôme B : outcome.executionMode vaut blockedByGatekeeper (networkCallPerformed: false)
- Cause : L'une des 3 conditions cumulatives du
RemoteConfigGatekeepern'est pas remplie. Inspectezoutcome.gatekeeperEvaluation?.verdictetoutcome.message:GatekeeperVerdict.skippedVersionMismatch: la version passée àTkOtaPush.init(appReleaseVersion: ...)ne correspond pas exactement àtarget_release_versiondu JSON Remote Config.GatekeeperVerdict.skippedNoPatchAvailable:patch_availableest àfalsedans le JSON Remote Config.GatekeeperVerdict.skippedAlreadyUpToDate: le numéro de patch déjà installé (currentPatchNumber) est supérieur ou égal àlatest_patch_number.
- Solution : Alignez
appReleaseVersionavec la version exacte depubspec.yaml(ex:'1.0.0+3') et incrémentezlatest_patch_numberdans votre Remote Config.
Symptôme C : Le patch est téléchargé mais l'interface ne change pas immédiatement
- Cause : Par conception, le moteur C++/Rust charge le nouveau snapshot (
binaire d'applicationouartefact de patch) lors de l'initialisation de la VM Dart au démarrage à froid (Cold Start). Mettre l'application en arrière-plan puis la reprendre (Warm Resume) ne recharge pas la bibliothèque partagée. - Solution : Fermez complètement le processus de l'application (ou redémarrez-la après une mise à jour critique où
outcome.restartRequired == true).
2. Erreur Update rejected: hash mismatch ou CorruptPatch
- Cause : Le binaire
binaire d'application(Android) ouApp(iOS) installé sur le téléphone ne possède pas la même empreinte SHA-256 que la Release de référence enregistrée sur le serveur OTA. Cela survient si vous avez recompilé l'APK avecflutter build apkaprès avoir exécutétk-ota-push release, ou si un ancien fichier intermédiaire non strippé a été utilisé. - Solution :
- Utilisez
tk_ota_push>= 0.5.1/1.0.0, oùPublisher._extractLibAppFromPackageextrait directementbinaire d'applicationdepuis l'archive finale.apkou.aab. - Distribuez aux utilisateurs exactement le fichier
.apk,.aabou.ipaproduit par l'exécution detk-ota-push release, sans relancer de build manuel postérieur.
- Utilisez
3. Erreur InvalidSignature (Patch signature could not be verified)
- Cause : Le moteur Rust a rejeté le patch car la signature RSA (
hash_signature) renvoyée parPOST /api/v1/patches/checkne correspond pas à la clépatch_public_keyembarquée dansflutter_assets/shorebird.yaml(catégorie télémétriquefailure_category: "invalid_signature"). - Solution :
- Vérifiez que
shorebird.yamlest bien déclaré dans la sectionflutter.assetsdepubspec.yaml. - Vérifiez que la clé RSA dans moteur cryptographique n'a pas été recréée sous un autre couple clé privée / clé publique depuis la publication de la Release Store.
- Lors de chaque
tk-ota-push release, la CLI synchronise automatiquementpatch_public_keydepuisGET /api/admin/v1/public-key.
- Vérifiez que
4. Crash au démarrage d'un patch (Bootloop) & Alerte Rollback Actif
- Cause : Le code introduit dans le patch provoque une exception fatale dès le démarrage, ou tente de lire un cache local incompatible après une régression de version.
- Comportement automatique :
- Au lancement suivant,
handle_prior_boot_failure_if_necessary()détecte quecurrently_booting_patchn'a pas terminé son amorçage. - Le moteur Rust marque le patch comme
PatchKnownBad, restaure la version saine précédente et envoie__patch_install_failure__(crash_recovery: patch N failed to boot). - Côté Dart,
OtaRollbackTrackerdéclencheonRollbackDetected(OtaRollbackEvent).
- Au lancement suivant,
- Solution :
- Implémentez le callback
onRollbackDetecteddansTkOtaPush.initpour purger vos caches locaux (SharedPreferences, SQLite, Hive) en cas de retour arrière. - Corrigez le bug dans votre code Dart et publiez un nouveau patch avec un numéro supérieur (
N + 1). - Dans la Console Web (
/support), acquittez l'alerte de rollback sur les appareils concernés.
- Implémentez le callback
5. app_id incorrect ou conflit entre environnements (dev / staging / prod)
- Cause : Les patchs publiés ne remontent pas sur le téléphone car l'
app_idembarqué lors de la Release diffère de l'app_idciblé lors dutk-ota-push patch. - Solution :
- Vérifiez la cascade de résolution dans
FlutterProject.resolveEffectiveAppId: si vous avez compilé la Release avec--flavor prod, passez également--flavor prodlors de la commandetk-ota-push patch. - Vérifiez la valeur effective inscrite en tête de votre
shorebird.yamlaprès le build.
- Vérifiez la cascade de résolution dans
6. Serveur OTA injoignable & Blocage HTTP Cleartext sur Android
- Symptôme : Aucune requête n'arrive sur le serveur Serveur TkushPatch (
ShorebirdUpdaterController) lorsque vous testez sur un smartphone Android en Wi-Fi local avecbase_url: "http://192.168.x.x:8080", et la télémétrie enregistrefailure_category: "network". - Causes & Solutions :
- Permission
INTERNETmanquante : ajoutez<uses-permission android:name="android.permission.INTERNET"/>dansandroid/app/src/main/AndroidManifest.xml. - Blocage HTTP Cleartext Android 9+ : pour les tests locaux en
http://(sans TLS), ajoutezandroid:usesCleartextTraffic="true"sur la balise<application>de votreAndroidManifest.xml. - Utilisation de
localhostdansbase_url: sur un smartphone physique,localhostdésigne le téléphone lui-même et non votre ordinateur. Utilisez l'IP LAN de votre machine dansshorebird.yaml(ex:http://192.168.0.199:8080). Le serveur Serveur TkushPatch réécrira automatiquement les URLs de téléchargement d'artefacts grâce àShorebirdUpdaterController.resolveClientReachableUrl.
- Permission
7. Blocage DIVERGENCE DE CODE NATIF DÉTECTÉE lors d'un patch
- Symptôme : La commande
tk-ota-push patchs'arrête avec le message :DIVERGENCE DE CODE NATIF DÉTECTÉE (classes.dex, manifest ou libs C++ modifiés)(ouInfo.plist ou Frameworks modifiéssur iOS). - Cause : Le
NativeIntegrityScannera détecté que le code natif compilé (nativeCodeHash) a changé par rapport à la Release verrouillée sur le serveur (ajout d'un plugin Flutter contenant du code Kotlin/Swift/C++ ou modification deAndroidManifest.xml/Info.plist). - Solution :
- Le moteur OTA ne pouvant patcher que la couche Dart, incrémentez la version dans
pubspec.yamlet publiez une nouvelle Release Store (tk-ota-push release). - Si vous êtes certain que la modification native n'impacte pas l'exécution du code Dart, vous pouvez forcer la publication avec
--force(non recommandé en production).
- Le moteur OTA ne pouvant patcher que la couche Dart, incrémentez la version dans
8. Blocage HTTP 409 CONFLICT - PROTECTION CONTRE LE 'RELEASE OVERWRITE'
- Symptôme :
tk-ota-push releaseéchoue avec une erreurHTTP 409 CONFLICTindiquant que la Release est déjà verrouillée. - Cause : La méthode
Publisher.guardNoOverwriteinterdit d'écraser une Release existante avec un nouveau build, car recompiler sous le même numéro de version modifierait les adresses mémoire du binaire de base et provoquerait des erreurs de segmentation (Segfault) sur les téléphones ayant déjà installé cette Release. - Solution :
- Si vous souhaitez corriger la version déjà en ligne, utilisez
tk-ota-push patch. - Si vous publiez une nouvelle version sur le Store, incrémentez le numéro de build dans
pubspec.yaml(ex:1.0.0+2vers1.0.0+3) avant de lancertk-ota-push release.
- Si vous souhaitez corriger la version déjà en ligne, utilisez