Valider iPhone OS 2.1.1 et documenter les tests des applications
This commit is contained in:
1 parent
436bdc536c
commit
21a155d35f
3 files changed
+131
-5
No files matched your search
@@ -2,7 +2,36 @@
|
||||
|
||||
État au 2026-09-30. Environnement : conteneur Arch Linux, utilisateur `dev` avec sudo, sans `CAP_NET_ADMIN`, sans `/dev/ppp` ni TUN.
|
||||
|
||||
## Dernière mise à jour — fiabilisation GPIO/SPI et agent v12
|
||||
## Validation du 1er octobre 2026 — iPhone OS 2.1.1
|
||||
|
||||
- Image distincte `5F138-validation-20261001`, créée depuis la base 5F138 conservée,
|
||||
avec agent v12, TouchProbe et HelloEmu. Session : `work/validation-20261001/`.
|
||||
`system-version.plist` confirme 2.1.1 / 5F138 ; démarrage déverrouillé en 28 s.
|
||||
- Calibration : sept points exacts de `(20,40)` à `(300,460)` dans
|
||||
`calibration-complete.log`, après attente du marqueur `TouchProbe ready`.
|
||||
Les ordonnées du journal sont relatives à la vue, située à y=20.
|
||||
- Six cycles alternant Power/Home et Power/Power passent, sans perte du tactile.
|
||||
- Safari : clavier virtuel QWERTY, formulaire envoyé avec `texte=bonjour`,
|
||||
défilement jusqu'au lien final et requête `/fin` reçue par le serveur HTTP local.
|
||||
Journal : `http/requests.jsonl`. Une version réutilisable de la page et du serveur
|
||||
est fournie dans `tests/http-fixture.py` ; aucun site extérieur n'est requis.
|
||||
- Calculatrice : `7 × 8 = 56`, capture `calculatrice-56.png`.
|
||||
- Notes : note « Bonjour » créée par le clavier virtuel puis sauvegardée.
|
||||
Les lignes de `Note` et `note_bodies` sont identiques dans `notes-avant.db` et
|
||||
`notes-apres.db`, et la note réapparaît dans l'interface après redémarrage.
|
||||
- Nouvelle app `HelloEmu21.app` (bundle-id `com.ioslegacy.hello21`) installée via
|
||||
`push-app`, cache reconstruit, redémarrage sans réinitialiser la NAND en 50 s,
|
||||
lancement au premier plan et journal HelloEmu validés. Captures :
|
||||
`hello21-apres-push.png` et `note-apres-reboot.png`.
|
||||
- Synthèse locale : `validation.json`. Session et serveur HTTP de test arrêtés.
|
||||
Aucun défaut `Killing device`, `Fatal Exception` ou `MACH Reboot` relevé dans
|
||||
la console finale. Les images et NAND d'origine sont conservées.
|
||||
- Particularités : l'image 5F138 conserve ses réglages de langue et de fuseau
|
||||
d'origine ; les captures sont en anglais. Le lancement `--url` d'un Safari
|
||||
déjà ouvert n'a pas changé la page pendant le test : passer par les liens ou
|
||||
relancer le navigateur. Le RTC matériel et la veille profonde restent à faire.
|
||||
|
||||
## Fiabilisation du 30 septembre — GPIO/SPI et agent v12
|
||||
|
||||
Les sections de diagnostic plus anciennes ci-dessous décrivent les étapes précédentes.
|
||||
Le workflow `push-app` puis déverrouillage/lancement a été validé avec l'agent v11.
|
||||
@@ -26,8 +55,8 @@ puis HelloEmu se lance au premier plan avec son journal. Diagnostics locaux :
|
||||
Les sessions de validation sont arrêtées.
|
||||
Les fichiers générés, images et diagnostics restent hors du dépôt. Les images
|
||||
5H11a et les NAND d'origine sont conservées ; le RTC, le Wi-Fi matériel, l'audio
|
||||
et la veille profonde restent à implémenter. Les nouveaux correctifs ne sont
|
||||
pas encore validés sur 5F138.
|
||||
et la veille profonde restent à implémenter. Les nouveaux correctifs n’étaient
|
||||
pas encore validés sur 5F138 à cette étape.
|
||||
|
||||
## Objectif
|
||||
|
||||
|
||||
@@ -131,8 +131,7 @@ La vitesse verticale utilise `y`, les vitesses conservent leur signe et sont
|
||||
bornées à 16 bits. `apps/TouchProbe` permet de mesurer la calibration : compiler
|
||||
avec son Makefile, lancer avec `--log`, puis comparer les gestes QMP au marqueur
|
||||
bleu et aux coordonnées du journal (ajouter 20 pixels à l'ordonnée locale de la vue).
|
||||
La calibration a été vérifiée sur 5H11a, sur sept points de `(20,40)` à `(300,460)`.
|
||||
Les modifications n'ont pas encore été validées sur 5F138.
|
||||
La calibration a été vérifiée sur 5H11a et 5F138, sur sept points de `(20,40)` à `(300,460)`.
|
||||
|
||||
Agent **v12** : `put` et `get` utilisent des blocs de 64 Kio au lieu d'allouer
|
||||
le fichier entier dans l'iPod. Un upload incomplet supprime son temporaire et
|
||||
@@ -147,6 +146,45 @@ contrib/ipod-emu/tests/run-multitouch # build QEMU arm existant, Ninja, compi
|
||||
python3 contrib/ipod-emu/tests/test-transfers.py # Python et compilateur C, sockets locales
|
||||
```
|
||||
|
||||
## Validation sous iPhone OS 2.1.1
|
||||
|
||||
Le firmware 5F138 a été vérifié avec l'agent v12 et les mêmes corrections QEMU.
|
||||
Conserver l'image 5F138 d'origine et produire une image dérivée avec un nom absent :
|
||||
|
||||
```bash
|
||||
ipod-mkimage -b 5F138 -o 5F138-agent-v12 agent/overlay apps/TouchProbe/TouchProbe.app apps/HelloEmu/HelloEmu.app
|
||||
```
|
||||
|
||||
Utiliser ensuite un environnement `IPOD_EMU_HOME` indépendant pour démarrer cette
|
||||
image ; un changement de firmware remplace la NAND de la session choisie.
|
||||
`SystemVersion.plist` confirme iPhone OS 2.1.1 / 5F138. Les sept points de
|
||||
calibration sont exacts et six cycles de veille/réveil alternant Home et Power
|
||||
passent, sans désactivation du tactile.
|
||||
|
||||
Pour tester Safari sans dépendre d'un site extérieur, depuis le dépôt :
|
||||
|
||||
```bash
|
||||
python3 contrib/ipod-emu/tests/http-fixture.py --output /chemin/diagnostic-http
|
||||
```
|
||||
|
||||
Ouvrir l'URL `http://10.0.2.2:<port>/` affichée dans Safari invité. Le serveur
|
||||
écoute uniquement sur la boucle locale de l'hôte ; il conserve le port et les
|
||||
requêtes dans le dossier choisi. Saisir `bonjour` avec le clavier virtuel et
|
||||
soumettre : le journal doit contenir `/submit?texte=bonjour`. Suivre le lien de
|
||||
défilement, glisser jusqu'au bas, attendre la fin de l'inertie et toucher le lien
|
||||
final : `/fin` doit apparaître. Arrêter le serveur avec Ctrl-C après le test.
|
||||
|
||||
Attendre l'affichage réel d'une application avant d'envoyer des gestes. Pour
|
||||
TouchProbe, attendre `TouchProbe ready` dans le journal ; une réponse de lancement
|
||||
ne garantit pas que la vue soit déjà prête. Sous 2.1.1, lancer Safari avec `--url`
|
||||
alors qu'il est déjà ouvert n'a pas changé la page lors du test ; utiliser les
|
||||
liens de la page ou relancer Safari pour ouvrir une autre URL.
|
||||
|
||||
Notes et la calculatrice complètent ce contrôle : saisir une note, la sauvegarder,
|
||||
puis comparer son texte dans `Library/Notes/notes.db` avant et après redémarrage ;
|
||||
vérifier visuellement `7 × 8 = 56` dans la calculatrice. Les diagnostics et le
|
||||
résultat détaillé de la validation du 1er octobre sont décrits dans `HANDOFF.md`.
|
||||
|
||||
## Limites
|
||||
|
||||
- **Persistance NAND** : les pages et métadonnées écrites par iOS, ainsi que les effacements de blocs, sont conservés
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Page HTTP compatible Safari mobile 3 pour valider saisie et défilement.
|
||||
|
||||
Lancer sur l'hôte avec --output DOSSIER ; ouvrir l'URL 10.0.2.2 affichée dans
|
||||
Safari invité. Le port et les requêtes reçues sont enregistrés dans ce dossier.
|
||||
Arrêter avec Ctrl-C après le test. Aucun accès Internet n'est nécessaire.
|
||||
"""
|
||||
import argparse
|
||||
from datetime import datetime, timezone
|
||||
from html import escape
|
||||
from http.server import BaseHTTPRequestHandler, HTTPServer
|
||||
import json
|
||||
from pathlib import Path
|
||||
from urllib.parse import parse_qs, urlparse
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--output', type=Path, required=True)
|
||||
args = parser.parse_args()
|
||||
args.output.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
class Handler(BaseHTTPRequestHandler):
|
||||
def do_GET(self):
|
||||
with (args.output / 'requests.jsonl').open('a', encoding='utf-8') as log:
|
||||
log.write(json.dumps({'utc': datetime.now(timezone.utc).isoformat(),
|
||||
'path': self.path}, ensure_ascii=False) + '\n')
|
||||
url = urlparse(self.path)
|
||||
if url.path == '/submit':
|
||||
content = 'Recu : ' + escape(parse_qs(url.query).get('texte', [''])[0])
|
||||
elif url.path == '/scroll':
|
||||
content = '<h1>Debut</h1>' + ''.join(
|
||||
'<p style="height:60px">Ligne %02d</p>' % i for i in range(24))
|
||||
content += '<a href="/fin">Fin du defilement</a>'
|
||||
elif url.path == '/fin':
|
||||
content = '<h1>Defilement OK</h1>'
|
||||
else:
|
||||
content = ('<h1>Validation HTTP</h1><form action="/submit" method="get">'
|
||||
'<input type="text" name="texte"><input type="submit" value="Envoyer">'
|
||||
'</form><p><a href="/scroll">Test de defilement</a></p>')
|
||||
body = ('<html><head><meta name="viewport" content="width=device-width">'
|
||||
'<title>Test iPhone OS</title></head><body>' + content + '</body></html>').encode('utf-8')
|
||||
self.send_response(200)
|
||||
self.send_header('Content-Type', 'text/html; charset=utf-8')
|
||||
self.send_header('Content-Length', str(len(body)))
|
||||
self.end_headers()
|
||||
self.wfile.write(body)
|
||||
|
||||
with HTTPServer(('127.0.0.1', 0), Handler) as server:
|
||||
(args.output / 'port').write_text(str(server.server_port) + '\n', encoding='utf-8')
|
||||
print(f'URL depuis l’iPod : http://10.0.2.2:{server.server_port}/', flush=True)
|
||||
try:
|
||||
server.serve_forever()
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in new issue
Block a user