kazeia/GUIDE_ROOT_ONEPLUS_PAD3.md

8.2 KiB

Guide Root - OnePlus Pad 3 (OPD2415) pour le projet Kazeia

Pourquoi rooter ?

Le Snapdragon 8 Elite embarque un NPU (Neural Processing Unit) capable d'exécuter les modèles d'IA 10 à 100x plus vite que le CPU. Sans root, Android bloque l'accès aux librairies vendor Qualcomm (libcdsprpc.so, libQnnHtp.so) nécessaires pour communiquer avec le NPU depuis une application tierce.

Impact sur les performances

Composant Sans root (CPU) Avec root (NPU) Gain
STT Whisper-Base ~1500ms ~50ms x30
LLM Qwen3-4B (Genie SDK) Indisponible (erreur -5) ~30 tok/s
TTS Chatterbox OOM crash (1.4 GB RAM) ~1-3s sur NPU Fonctionne
Monitoring GPU/NPU 0% (sysfs inaccessible) Métriques temps réel Visibilité
Pipeline complet (STT→LLM→TTS) Impossible ~4-8s end-to-end Pipeline complet

Composants bloqués sans root

  • Genie SDK : le GenieDialogConfig_createFromJson() retourne le code d'erreur -7 car il ne peut pas ouvrir les devices DSP
  • QNN HTP : libcdsprpc.so nécessite libhidlbase.so du namespace vendor, inaccessible aux apps normales
  • ONNX Runtime QNN EP : le QNN Execution Provider s'initialise mais ne peut pas communiquer avec le HTP
  • Sysfs monitoring : /sys/class/kgsl/ (GPU) et /sys/class/devfreq/ (NPU) sont protégés par SELinux

Ce qui fonctionne sans root

  • Whisper.cpp sur CPU (STT)
  • Android TTS natif (Google)
  • ONNX Runtime sur CPU
  • Silero VAD (ONNX CPU)
  • LiteRT avec NNAPI (délégation partielle, limitée)

Prérequis

  • Tablette : OnePlus Pad 3 (OPD2415)
  • Firmware : OPD2415_16.0.3.500(EX01) — OxygenOS 16 / Android 16 (API 36)
  • SoC : Snapdragon 8 Elite (SM8750, plateforme "sun")
  • Slot actif : A
  • Bootloader : verrouillé (à déverrouiller)
  • PC : avec ADB et Fastboot installés
  • Sauvegarde : aucune donnée critique sur la tablette (le déverrouillage efface tout)

Étape 1 — Activer le déverrouillage OEM

Sur la tablette :

  1. Paramètres → À propos de la tablette
  2. Taper 7 fois sur "Numéro de build" pour activer les Options développeur
  3. Paramètres → Système → Options développeur
  4. Activer Déverrouillage OEM
  5. Vérifier que Débogage USB est activé

Vérification depuis le PC :

adb shell getprop sys.oem_unlock_allowed
# Doit retourner "1"

Étape 2 — Déverrouiller le bootloader

⚠️ ATTENTION : Cette étape efface TOUTES les données de la tablette.

# Redémarrer en mode fastboot
adb reboot bootloader

# Attendre que la tablette soit en mode fastboot (écran avec logo)
# Vérifier la connexion
fastboot devices

# Déverrouiller le bootloader
fastboot flashing unlock

Sur la tablette :

  • Utiliser les boutons volume pour sélectionner "Unlock the bootloader"
  • Confirmer avec le bouton power
  • La tablette va se réinitialiser et redémarrer
# Vérification
adb shell getprop ro.boot.vbmeta.device_state
# Doit retourner "unlocked"

Après le redémarrage :

  • Reconfigurer la tablette (setup minimal)
  • Réactiver les Options développeur + Débogage USB

Étape 3 — Récupérer le firmware stock

Il faut le fichier init_boot.img de la même version de firmware installée.

Option A : Extraire depuis un OTA complet

  1. Télécharger le firmware OPD2415_16.0.3.500 depuis :
  2. Extraire le ZIP
  3. Trouver init_boot.img dans le payload :
    # Si le firmware est un payload.bin
    python3 payload_dumper.py payload.bin --out extracted/
    # init_boot.img sera dans extracted/
    

Option B : Extraire depuis la partition active

# Identifier la partition init_boot
adb shell ls -la /dev/block/by-name/init_boot*

# Extraire (nécessite un accès shell suffisant)
adb shell dd if=/dev/block/by-name/init_boot_a of=/data/local/tmp/init_boot.img
adb pull /data/local/tmp/init_boot.img

Étape 4 — Patcher avec Magisk

  1. Télécharger Magisk : github.com/topjohnwu/Magisk/releases

    • Prendre le fichier Magisk-v28.x.apk (dernière version stable)
  2. Installer Magisk sur la tablette :

    adb install Magisk-v28.x.apk
    
  3. Transférer init_boot.img sur la tablette :

    adb push init_boot.img /data/local/tmp/
    
  4. Patcher avec Magisk :

    • Ouvrir l'app Magisk sur la tablette
    • Appuyer sur "Installer" à côté de "Magisk"
    • Choisir "Sélectionner et patcher un fichier"
    • Naviguer vers /data/local/tmp/init_boot.img
    • Attendre la fin du patching
    • Le fichier patché sera dans /storage/emulated/0/Download/magisk_patched-xxxxx.img
  5. Récupérer l'image patchée :

    adb pull /storage/emulated/0/Download/magisk_patched-28100_xxxxx.img
    

Étape 5 — Flasher l'image patchée

# Redémarrer en fastboot
adb reboot bootloader

# Flasher l'image patchée sur la partition init_boot
fastboot flash init_boot magisk_patched-28100_xxxxx.img

# Redémarrer
fastboot reboot

Étape 6 — Vérification

Après le redémarrage :

# Vérifier que Magisk est actif
adb shell su -c id
# Doit retourner: uid=0(root) gid=0(root)

# Vérifier l'accès aux libs vendor
adb shell su -c "ls /vendor/lib64/libcdsprpc.so"
adb shell su -c "ls /vendor/lib64/libQnnHtp.so"

# Vérifier l'accès au DSP
adb shell su -c "ls /dev/adsprpc-smd"

# Vérifier les sysfs GPU
adb shell su -c "cat /sys/class/kgsl/kgsl-3d0/gpubusy"

Étape 7 — Configuration post-root pour Kazeia

Permissions DSP pour l'app

# Donner accès au DSP à l'app Kazeia
adb shell su -c "chmod 666 /dev/adsprpc-smd"
adb shell su -c "chmod 666 /dev/cdsprpc-smd"

# Ou via Magisk module pour persister après reboot

Module Magisk recommandé

Créer un module Magisk qui :

  • Rend les libs QNN accessibles aux apps
  • Ouvre les permissions DSP au boot
  • Expose les sysfs GPU/NPU

Variables d'environnement

L'app devra setter ces variables avant de charger les libs QNN :

ADSP_LIBRARY_PATH=/vendor/lib64/
LD_LIBRARY_PATH=/vendor/lib64/

Risques et précautions

Ce que le root implique

  • Garantie : techniquement annulée (mais reversible en re-verrouillant le bootloader)
  • Mises à jour OTA : ne fonctionneront plus automatiquement (flash manuel nécessaire)
  • SafetyNet / Play Integrity : certaines apps (banque, Netflix) peuvent refuser de fonctionner
    • Solution : module Magisk "Universal SafetyNet Fix" ou "Play Integrity Fix"
  • Sécurité : le root expose le système — ne pas installer d'apps douteuses

Comment revenir en arrière

# Re-verrouiller le bootloader (efface tout)
adb reboot bootloader
fastboot flashing lock
# Confirmer sur la tablette
fastboot reboot

Sauvegarde avant root

# Sauvegarder les modèles déjà poussés
adb pull /data/local/tmp/kazeia/ ./backup_kazeia/

Résumé des commandes

# 1. Déverrouiller
adb reboot bootloader
fastboot flashing unlock
# Confirmer sur tablette

# 2. Après reconfiguration tablette
adb install Magisk-v28.x.apk
adb push init_boot.img /data/local/tmp/

# 3. Patcher sur tablette via app Magisk, puis récupérer
adb pull /storage/emulated/0/Download/magisk_patched-*.img

# 4. Flasher
adb reboot bootloader
fastboot flash init_boot magisk_patched-*.img
fastboot reboot

# 5. Vérifier
adb shell su -c id

Après le root — Impact sur Kazeia

Une fois rooté, modifier KazeiaApplication.kt pour ajouter les chemins vendor :

companion object {
    const val MODELS_DIR = "/data/local/tmp/kazeia/models"

    init {
        // Avec root, les libs vendor sont accessibles
        System.setProperty("ADSP_LIBRARY_PATH", "/vendor/lib64/")
    }
}

Les composants suivants deviendront fonctionnels :

  • Genie SDK → LLM Qwen3-4B sur NPU
  • ONNX Runtime QNN EP → Whisper encoder/decoder sur NPU
  • Monitoring GPU/NPU via sysfs
  • Chatterbox TTS sur NPU (réduction mémoire)

Document créé le 28 mars 2026 — Projet Kazeia Damien Micottis & Richard Loyer