Conférence donnée à la Droidcon Tunisia 2015.
Les mises à jour OTA sont partout sur nos téléphones (ok, presque partout) mais comment fonctionnent-elles ?
Au cours de cette présentation, nous verrons :
Ce qu’est une MàJ OTA
Comment l’implémenter (exploration de code : intent, permission système, recovery, etc.)
Quelle architecture backend pour mettre en place une solution d’OTA
Mises à jour logicielles en environnement Linux Embarqué, petit guide et tour...Pierre-jean Texier
Longtemps basées sur des solutions "maison", il existe maintenant grâce à l'évolution du marché de "l'IoT", des solutions open source pour répondre à la complexité qu'est la gestion des mises à jour sur un système Linux Embarqué. Cette conférence commencera par présenter les différentes problématiques liées aux mises à jour dans un tel environnement : - accès physique, - sécurité, - downtime, - les composants à mettre à jour, - les différentes stratégies, - ...
Mender 2.0 101: Bien démarrer avec les 'update modules'Pierre-jean Texier
Sortie courant 2019 (https://mender.io/blog/mender-2-0-released-application-updates),
la version 2.0 de Mender introduit de nouvelles fonctionnalités afin d’étendre
les scénarios de mises à jour au niveau application en environnement Linux Embarqué.
Initialement construit sur un schéma à double partition (A/B) dans sa version 1.X, la nouvelle
mouture de Mender permet par exemple :
- Mise à jour de container (e.g Docker)
- Mise à jour logiciel FPGA et/ou microcontrôleur
- Mise à jour d’une arborescence donnée du système de fichier racine
- et bien d’autres encore
Le présent document décrit les différentes étapes d’installation et de configuration des différents outils utilisés notamment Eclipse, est suit l’organisation suivante :
• 1ere partie :
Dans cette première partie vous trouverez les différentes étapes d’installation – à suivre - des différents outils nécessaires au bon fonctionnement d’Openbravo.
• 2eme partie :
Dans cette deuxième partie vous trouverez la configuration détaillée de l’IDE Eclipse pour assurer une bonne intégration du code.
Mises à jour logicielles en environnement Linux Embarqué, petit guide et tour...Pierre-jean Texier
Longtemps basées sur des solutions "maison", il existe maintenant grâce à l'évolution du marché de "l'IoT", des solutions open source pour répondre à la complexité qu'est la gestion des mises à jour sur un système Linux Embarqué. Cette conférence commencera par présenter les différentes problématiques liées aux mises à jour dans un tel environnement : - accès physique, - sécurité, - downtime, - les composants à mettre à jour, - les différentes stratégies, - ...
Mender 2.0 101: Bien démarrer avec les 'update modules'Pierre-jean Texier
Sortie courant 2019 (https://mender.io/blog/mender-2-0-released-application-updates),
la version 2.0 de Mender introduit de nouvelles fonctionnalités afin d’étendre
les scénarios de mises à jour au niveau application en environnement Linux Embarqué.
Initialement construit sur un schéma à double partition (A/B) dans sa version 1.X, la nouvelle
mouture de Mender permet par exemple :
- Mise à jour de container (e.g Docker)
- Mise à jour logiciel FPGA et/ou microcontrôleur
- Mise à jour d’une arborescence donnée du système de fichier racine
- et bien d’autres encore
Le présent document décrit les différentes étapes d’installation et de configuration des différents outils utilisés notamment Eclipse, est suit l’organisation suivante :
• 1ere partie :
Dans cette première partie vous trouverez les différentes étapes d’installation – à suivre - des différents outils nécessaires au bon fonctionnement d’Openbravo.
• 2eme partie :
Dans cette deuxième partie vous trouverez la configuration détaillée de l’IDE Eclipse pour assurer une bonne intégration du code.
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Alexandre Touret
Kubernetes et les technologies cloud sont aujourd'hui les standards pour déployer des applications de toutes sortes dans le cloud: api, batchs, microservices et même des monolithes! Ils apportent des solutions à beaucoup de problèmes mais aussi une grande complexité. Il peut donc être très difficile pour les développeurs et concepteurs d'identifier les contraintes de telles architectures.
Dans cette présentation, vous (re)découvrirez dix astuces et conseils que j'ai pu appliquer et qui m'ont aidé dans mes derniers projets.
Ces derniers traiteront :
de l'environnement de l'application
du choix des solutions techologiques
du développement
des contraintes de conception liées à K8S
et plus encore !
Comment, dans le cadre de la migration vers Google Cloud Platform, MeilleursAgents a revu ses techniques de déploiements d'applications Python pour garantir des releases fiables, testables et reproductibles.
WordCamp Lyon 2015 - WordPress, Git et l'intégration continueStéphane HULARD
Retour d'expérience sur les pratiques que j'utilise au quotidien pour l'industrialisation de mes développements WordPress...
https://lyon.wordcamp.org/2015/session/wordpress-git-et-lintegration-continue/
Kdump est une fonctionnalité du noyau Linux permettant de prendre un dump (une empreinte mémoire) lors d'un crash du système d'exploitation. Cette fonctionnalité permet d'analyser après coup ce qui s'est passé sur le serveur au moment du crash et quel a été le processus engendrant ce crash.
Après le crash d'un serveur, l'administrateur système que vous êtes espère de tout son être qu'un crashdump soit disponible dans le répertoire /var/crash/ (si tel est la destination choisie)
Bien que Docker soit facile d'utilisation, construire une image reste un exercice compliqué.
Optimisation, layers, et sécurité nécessitent de s'abstraire des Dockerfile basiques qu'on peut trouver sur internet.
Dans ce BBL, nous verrons comment bien packager une application Spring Boot dans une image Docker/OCI.
Nous allons parcourir les bonnes pratiques préconisées par Spring, les pièges à éviter, comment bien écrire un Dockerfile pour optimiser la construction et l'image finale pour une exécution dans Kubernetes et nous verrons aussi des moyens alternatifs de construction d'images Spring Boot et l'outillage d'analyse à ajouter à votre toolbox.
Au cours de cette session, nous plongerons avec vous dans le quotidien d’une startup qui vient de se lancer sur le Net.
Alors que les premiers utilisateurs affluent vers ses serveurs, l’équipe se retrouve confrontée à ses premiers problèmes de performance. Le prix du succès… ! Nous verrons avec eux comment simuler une arrivée massive d’utilisateurs pour “stresser” leur plateforme. Nous utiliserons les outils d’APM pour monitorer les serveurs et applications Java mais aussi évaluer l’expérience utilisateur. Enfin, nous proposerons une démarche et des outils pour tester la performance en continue.
Avec de nombreuses démos en live, cette session en français s’adresse aux développeurs, architectes et décideurs sur les projets IT.
Animé avec Landry DEFO KUATE (OCTO)
Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...OCTO Technology
par Claude Camus (Coach agile d'organisation @OCTO Technology) et Gilles Masy (Organizational Coach @OCTO Technology)
Les équipes infrastructure, sécurité, production, ou cloud, doivent consacrer du temps à la modernisation de leurs outils (automatisation, cloud, etc) et de leurs pratiques (DevOps, SRE, etc). Dans le même temps, elles doivent répondre à une avalanche croissante de demandes, tout en maintenant un niveau de qualité de service optimal.
Habitué des environnements développeurs, les transformations agiles négligent les particularités des équipes OPS. Lors de ce comptoir, nous vous partagerons notre proposition de valeur de l'agilité@OPS, qui embarquera vos équipes OPS en Classe Business (Agility), et leur fera dire : "nous ne reviendrons pas en arrière".
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...OCTO Technology
Par Nicolas Bordier (Consultant numérique responsable @OCTO Technology) et Alaric Rougnon-Glasson (Sustainable Tech Consultant @OCTO Technology)
Sur un exemple très concret d’audit d’éco-conception de l’outil de bilan carbone C’Bilan développé par ICDC (Caisse des dépôts et consignations) nous allons expliquer en quoi l’ACV (analyse de cycle de vie) a été déterminante pour identifier les pistes d’actions pour réduire jusqu'à 82% de l’empreinte environnementale du service.
Vidéo Youtube : https://www.youtube.com/watch?v=7R8oL2P_DkU
Compte-rendu :
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Alexandre Touret
Kubernetes et les technologies cloud sont aujourd'hui les standards pour déployer des applications de toutes sortes dans le cloud: api, batchs, microservices et même des monolithes! Ils apportent des solutions à beaucoup de problèmes mais aussi une grande complexité. Il peut donc être très difficile pour les développeurs et concepteurs d'identifier les contraintes de telles architectures.
Dans cette présentation, vous (re)découvrirez dix astuces et conseils que j'ai pu appliquer et qui m'ont aidé dans mes derniers projets.
Ces derniers traiteront :
de l'environnement de l'application
du choix des solutions techologiques
du développement
des contraintes de conception liées à K8S
et plus encore !
Comment, dans le cadre de la migration vers Google Cloud Platform, MeilleursAgents a revu ses techniques de déploiements d'applications Python pour garantir des releases fiables, testables et reproductibles.
WordCamp Lyon 2015 - WordPress, Git et l'intégration continueStéphane HULARD
Retour d'expérience sur les pratiques que j'utilise au quotidien pour l'industrialisation de mes développements WordPress...
https://lyon.wordcamp.org/2015/session/wordpress-git-et-lintegration-continue/
Kdump est une fonctionnalité du noyau Linux permettant de prendre un dump (une empreinte mémoire) lors d'un crash du système d'exploitation. Cette fonctionnalité permet d'analyser après coup ce qui s'est passé sur le serveur au moment du crash et quel a été le processus engendrant ce crash.
Après le crash d'un serveur, l'administrateur système que vous êtes espère de tout son être qu'un crashdump soit disponible dans le répertoire /var/crash/ (si tel est la destination choisie)
Bien que Docker soit facile d'utilisation, construire une image reste un exercice compliqué.
Optimisation, layers, et sécurité nécessitent de s'abstraire des Dockerfile basiques qu'on peut trouver sur internet.
Dans ce BBL, nous verrons comment bien packager une application Spring Boot dans une image Docker/OCI.
Nous allons parcourir les bonnes pratiques préconisées par Spring, les pièges à éviter, comment bien écrire un Dockerfile pour optimiser la construction et l'image finale pour une exécution dans Kubernetes et nous verrons aussi des moyens alternatifs de construction d'images Spring Boot et l'outillage d'analyse à ajouter à votre toolbox.
Au cours de cette session, nous plongerons avec vous dans le quotidien d’une startup qui vient de se lancer sur le Net.
Alors que les premiers utilisateurs affluent vers ses serveurs, l’équipe se retrouve confrontée à ses premiers problèmes de performance. Le prix du succès… ! Nous verrons avec eux comment simuler une arrivée massive d’utilisateurs pour “stresser” leur plateforme. Nous utiliserons les outils d’APM pour monitorer les serveurs et applications Java mais aussi évaluer l’expérience utilisateur. Enfin, nous proposerons une démarche et des outils pour tester la performance en continue.
Avec de nombreuses démos en live, cette session en français s’adresse aux développeurs, architectes et décideurs sur les projets IT.
Animé avec Landry DEFO KUATE (OCTO)
Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...OCTO Technology
par Claude Camus (Coach agile d'organisation @OCTO Technology) et Gilles Masy (Organizational Coach @OCTO Technology)
Les équipes infrastructure, sécurité, production, ou cloud, doivent consacrer du temps à la modernisation de leurs outils (automatisation, cloud, etc) et de leurs pratiques (DevOps, SRE, etc). Dans le même temps, elles doivent répondre à une avalanche croissante de demandes, tout en maintenant un niveau de qualité de service optimal.
Habitué des environnements développeurs, les transformations agiles négligent les particularités des équipes OPS. Lors de ce comptoir, nous vous partagerons notre proposition de valeur de l'agilité@OPS, qui embarquera vos équipes OPS en Classe Business (Agility), et leur fera dire : "nous ne reviendrons pas en arrière".
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...OCTO Technology
Par Nicolas Bordier (Consultant numérique responsable @OCTO Technology) et Alaric Rougnon-Glasson (Sustainable Tech Consultant @OCTO Technology)
Sur un exemple très concret d’audit d’éco-conception de l’outil de bilan carbone C’Bilan développé par ICDC (Caisse des dépôts et consignations) nous allons expliquer en quoi l’ACV (analyse de cycle de vie) a été déterminante pour identifier les pistes d’actions pour réduire jusqu'à 82% de l’empreinte environnementale du service.
Vidéo Youtube : https://www.youtube.com/watch?v=7R8oL2P_DkU
Compte-rendu :
L'IA connaît une croissance rapide et son intégration dans le domaine éducatif soulève de nombreuses questions. Aujourd'hui, nous explorerons comment les étudiants utilisent l'IA, les perceptions des enseignants à ce sujet, et les mesures possibles pour encadrer ces usages.
Constat Actuel
L'IA est de plus en plus présente dans notre quotidien, y compris dans l'éducation. Certaines universités, comme Science Po en janvier 2023, ont interdit l'utilisation de l'IA, tandis que d'autres, comme l'Université de Prague, la considèrent comme du plagiat. Cette diversité de positions souligne la nécessité urgente d'une réponse institutionnelle pour encadrer ces usages et prévenir les risques de triche et de plagiat.
Enquête Nationale
Pour mieux comprendre ces dynamiques, une enquête nationale intitulée "L'IA dans l'enseignement" a été réalisée. Les auteurs de cette enquête sont Le Sphynx (sondage) et Compilatio (fraude académique). Elle a été diffusée dans les universités de Lyon et d'Aix-Marseille entre le 21 juin et le 15 août 2023, touchant 1242 enseignants et 4443 étudiants. Les questionnaires, conçus pour étudier les usages de l'IA et les représentations de ces usages, abordaient des thèmes comme les craintes, les opportunités et l'acceptabilité.
Résultats de l'Enquête
Les résultats montrent que 55 % des étudiants utilisent l'IA de manière occasionnelle ou fréquente, contre 34 % des enseignants. Cependant, 88 % des enseignants pensent que leurs étudiants utilisent l'IA, ce qui pourrait indiquer une surestimation des usages. Les usages identifiés incluent la recherche d'informations et la rédaction de textes, bien que ces réponses ne puissent pas être cumulées dans les choix proposés.
Analyse Critique
Une analyse plus approfondie révèle que les enseignants peinent à percevoir les bénéfices de l'IA pour l'apprentissage, contrairement aux étudiants. La question de savoir si l'IA améliore les notes sans développer les compétences reste débattue. Est-ce un dopage académique ou une opportunité pour un apprentissage plus efficace ?
Acceptabilité et Éthique
L'enquête révèle que beaucoup d'étudiants jugent acceptable d'utiliser l'IA pour rédiger leurs devoirs, et même un quart des enseignants partagent cet avis. Cela pose des questions éthiques cruciales : copier-coller est-il tricher ? Utiliser l'IA sous supervision ou pour des traductions est-il acceptable ? La réponse n'est pas simple et nécessite un débat ouvert.
Propositions et Solutions
Pour encadrer ces usages, plusieurs solutions sont proposées. Plutôt que d'interdire l'IA, il est suggéré de fixer des règles pour une utilisation responsable. Des innovations pédagogiques peuvent également être explorées, comme la création de situations de concurrence professionnelle ou l'utilisation de détecteurs d'IA.
Conclusion
En conclusion, bien que l'étude présente des limites, elle souligne un besoin urgent de régulation. Une charte institutionnelle pourrait fournir un cadre pour une utilisation éthique.
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)Laurent Speyser
(Conférence dessinée)
Vous êtes certainement à l’origine, ou impliqué, dans un changement au sein de votre organisation. Et peut être que cela ne se passe pas aussi bien qu’attendu…
Depuis plusieurs années, je fais régulièrement le constat de l’échec de l’adoption de l’Agilité, et plus globalement de grands changements, dans les organisations. Je vais tenter de vous expliquer pourquoi ils suscitent peu d'adhésion, peu d’engagement, et ils ne tiennent pas dans le temps.
Heureusement, il existe un autre chemin. Pour l'emprunter il s'agira de cultiver l'invitation, l'intelligence collective , la mécanique des jeux, les rites de passages, .... afin que l'agilité prenne racine.
Vous repartirez de cette conférence en ayant pris du recul sur le changement tel qu‘il est généralement opéré aujourd’hui, et en ayant découvert (ou redécouvert) le seul guide valable à suivre, à mon sens, pour un changement authentique, durable, et respectueux des individus! Et en bonus, 2 ou 3 trucs pratiques!
OCTO TALKS : 4 Tech Trends du Software Engineering.pdfOCTO Technology
En cette année 2024 qui s’annonce sous le signe de la complexité, avec :
- L’explosion de la Gen AI
-Un contexte socio-économique sous tensions
- De forts enjeux sur le Sustainable et la régulation IT
- Une archipélisation des lieux de travail post-Covid
Découvrez les Tech trends incontournables pour délivrer vos produits stratégiques.
2. 2
PLAN
1. Qui sommes nous ?
2. Qu’est-ce qu’une OTA ?
3. Architecture du système
4. Que contient une OTA ?
5. Comment l’implémenter ?
6. Partie Backend
4. 4
QUI SOMMES NOUS ?
Nos sujets :
● Applicatif métier mobile
● Gestion de parc
● Gestion applicative
● Objets connectés
● OS Embarqués
Nos compétences :
● Étude, conseil et analyse
● Gestion de projets
● Développement et recueil
des retours utilisateurs
● Déploiement
● Mise en marché
6. 6
PLAN
1. Qui sommes nous ?
2. Qu’est-ce qu’une OTA ?
3. Architecture du système
4. Que contient une OTA ?
5. Comment l’implémenter ?
6. Partie Backend
7. QU’EST-CE QU’UNE OTA ?
7
Il faut en réalité parler de
Firmware Over The Air (FOTA).
Cette opération permet de mettre
à jour des terminaux à
distance, sans que l’utilisateur n’ait
à les connecter sur un ordinateur.
La mise à jour est stockée sur un
serveur que le téléphone vient
télécharger puis installer.
8. 8
Les raisons de lancer une OTA vers un parc de terminaux sont multiples :
Sécurité Bugs
Time to
market
Android
QU’EST-CE QU’UNE OTA ?
Service après
vente
Fonctionnalités
9. 9
Mais elle présente des risques, contrairement à une installation
classique par USB :
Batterie Consommation
data
Corruption des
fichiers
QU’EST-CE QU’UNE OTA ?
10. 10
PLAN
1. Qui sommes nous ?
2. Qu’est-ce qu’une OTA ?
3. Architecture du système
4. Que contient une OTA ?
5. Comment l’implémenter ?
6. Partie Backend
12. ARCHITECTURE DU SYSTÈME
12
Recovery (ou recovery OS)
C’est un OS minimal qui est
spécialisé dans l’exécution de tâches
qu’Android directement ne peut pas
faire :
• réinitialisation du terminal
• installer des mises à jour
Il peut être lancé manuellement (combinaisons de touches) ou via adb :
adb reboot recovery
13. 13
Recovery (ou recovery OS)
Selon l’Android Compatibility Definition
Document, le terminal doit intégrer “un
mécanisme pour remplacer le système
dans sa globalité”
“… il doit supporter des mises à jour sans
supprimer les données utilisateur”
ARCHITECTURE DU SYSTÈME
14. 14
Commandes du Recovery
Au lancement, le recovery détecte si le fichier /cache/recovery/command existe.
Si tel est le cas, il exécutera les commandes les unes à la suite des autres.
-‐-‐update-‐package=<path>
-‐-‐wipe-‐data
-‐-‐wipe-‐cache
-‐-‐locale
-‐-‐send-‐intent=...
Fichier à vérifier puis installer
Effacer les partitions userdata et cache
Effacer la partition cache
Langue pour l’interface utilisateur
Envoyer cet Intent lorsqu’Android sera redémarré
ARCHITECTURE DU SYSTÈME
15. 15
Interaction Bootloader-Recovery
Pour que le bootloader comprenne qu’il faut lancer le recovery lorsqu’il y a des
commandes, il copie ses arguments vers le bootloader control block (BCB).
Le format du BCB est défini dans la structure bootloader_message :
struct bootloader_message {
char command[32]; char stage[32];
char status[32]; char reserved[224];
char recovery[768];
}
ARCHITECTURE DU SYSTÈME
16. 15
Interaction Bootloader-Recovery
Pour que le bootloader comprenne qu’il faut lancer le recovery lorsqu’il y a des
commandes, il copie ses arguments vers le bootloader control block (BCB).
Le format du BCB est défini dans la structure bootloader_message :
struct bootloader_message {
char command[32]; char stage[32];
char status[32]; char reserved[224];
char recovery[768];
}
La commande pour le bootloader
boot-recovery
ARCHITECTURE DU SYSTÈME
17. 15
Interaction Bootloader-Recovery
Pour que le bootloader comprenne qu’il faut lancer le recovery lorsqu’il y a des
commandes, il copie ses arguments vers le bootloader control block (BCB).
Le format du BCB est défini dans la structure bootloader_message :
struct bootloader_message {
char command[32]; char stage[32];
char status[32]; char reserved[224];
char recovery[768];
}
Options pour le recovery
--update
ARCHITECTURE DU SYSTÈME
18. 15
Interaction Bootloader-Recovery
Pour que le bootloader comprenne qu’il faut lancer le recovery lorsqu’il y a des
commandes, il copie ses arguments vers le bootloader control block (BCB).
Le format du BCB est défini dans la structure bootloader_message :
struct bootloader_message {
char command[32]; char stage[32];
char status[32]; char reserved[224];
char recovery[768];
}
Etape de l’installation
(si des redémarrages sont nécessaires)
ARCHITECTURE DU SYSTÈME
19. 16
PLAN
1. Qui sommes nous ?
2. Qu’est-ce qu’une OTA ?
3. Architecture du système
4. Que contient une OTA ?
5. Comment l’implémenter ?
6. Partie Backend
20. QUE CONTIENT UNE OTA ?
17
Génération du fichier
AOSP comporte un script python nommé
ota_from_target_files qui génère
automatiquement un fichier zip installable.
Par défaut, il crée une mise à jour complète.
Mais il peut aussi produire une mise à jour
différentielle en lui donnant la dernière OTA.
21. 18
Tronc common
META-‐INF
CERT.RSA
CERT.SF
com
android
metadata
otacert
google
android
update-‐binary
updater-‐script
MANIFEST.MF
QUE CONTIENT UNE OTA ?
22. 18
Tronc common
META-‐INF
CERT.RSA
CERT.SF
com
android
metadata
otacert
google
android
update-‐binary
updater-‐script
MANIFEST.MF
Fichier le plus important
QUE CONTIENT UNE OTA ?
23. 19
Updater-script
Fichier listant des commandes à exécuter :
apply_patch
apply_patch_check
delete / delete_recursive
file_getprop
format
mount / umount
package_extract_dir / package_extract_file
set_metadata / set_metadata_recursive
show_progress
symlink
ui_print
QUE CONTIENT UNE OTA ?
24. 20
mount("ext4", "EMMC", "/dev/block/platform/dw_mmc.0/by-‐name/system", “/system");
file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.3/
KTU84L/1148727:user/release-‐keys" ||
file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.4/
KTU84P/1227136:user/release-‐keys" ||
abort("Package expects build fingerprint of google/mantaray/manta:4.4.3/KTU84L/
1148727:user/release-‐keys or google/mantaray/manta:4.4.4/KTU84P/1227136:user/release-‐keys; this
device has " + getprop("ro.build.fingerprint") + ".");
getprop("ro.product.device") == "manta" || abort("This package is for "manta" devices; this
is a "" + getprop("ro.product.device") + "".");
ui_print("Verifying current system...");
show_progress(0.100000, 0);
apply_patch_check("/system/app/BasicDreams.apk", "42b5544ed0a896f536c1d58ffe1c68a974f12687",
"67280e2672c034505ba417e6c0054be375415c08") || abort(""/system/app/BasicDreams.apk" has
unexpected contents.");
set_progress(0.000065);
set_metadata_recursive("/system/xbin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755,
"capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
ui_print("Patching remaining system files...");
apply_patch("/system/build.prop", "-‐",
d7978a543a5677b77f7c1b15b5f583fb8fa14bd8, 2774,
4d220efc37eb1786bbb379ae31145bf7edd176d9, package_extract_file("patch/system/
build.prop.p"));
set_metadata("/system/build.prop", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0);
unmount("/system");
QUE CONTIENT UNE OTA ?
25. 20
mount("ext4", "EMMC", "/dev/block/platform/dw_mmc.0/by-‐name/system", “/system");
file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.3/
KTU84L/1148727:user/release-‐keys" ||
file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.4/
KTU84P/1227136:user/release-‐keys" ||
abort("Package expects build fingerprint of google/mantaray/manta:4.4.3/KTU84L/
1148727:user/release-‐keys or google/mantaray/manta:4.4.4/KTU84P/1227136:user/release-‐keys; this
device has " + getprop("ro.build.fingerprint") + ".");
getprop("ro.product.device") == "manta" || abort("This package is for "manta" devices; this
is a "" + getprop("ro.product.device") + "".");
ui_print("Verifying current system...");
show_progress(0.100000, 0);
apply_patch_check("/system/app/BasicDreams.apk", "42b5544ed0a896f536c1d58ffe1c68a974f12687",
"67280e2672c034505ba417e6c0054be375415c08") || abort(""/system/app/BasicDreams.apk" has
unexpected contents.");
set_progress(0.000065);
set_metadata_recursive("/system/xbin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755,
"capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
ui_print("Patching remaining system files...");
apply_patch("/system/build.prop", "-‐",
d7978a543a5677b77f7c1b15b5f583fb8fa14bd8, 2774,
4d220efc37eb1786bbb379ae31145bf7edd176d9, package_extract_file("patch/system/
build.prop.p"));
set_metadata("/system/build.prop", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0);
unmount("/system");
Monter une partition
QUE CONTIENT UNE OTA ?
26. 20
mount("ext4", "EMMC", "/dev/block/platform/dw_mmc.0/by-‐name/system", “/system");
file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.3/
KTU84L/1148727:user/release-‐keys" ||
file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.4/
KTU84P/1227136:user/release-‐keys" ||
abort("Package expects build fingerprint of google/mantaray/manta:4.4.3/KTU84L/
1148727:user/release-‐keys or google/mantaray/manta:4.4.4/KTU84P/1227136:user/release-‐keys; this
device has " + getprop("ro.build.fingerprint") + ".");
getprop("ro.product.device") == "manta" || abort("This package is for "manta" devices; this
is a "" + getprop("ro.product.device") + "".");
ui_print("Verifying current system...");
show_progress(0.100000, 0);
apply_patch_check("/system/app/BasicDreams.apk", "42b5544ed0a896f536c1d58ffe1c68a974f12687",
"67280e2672c034505ba417e6c0054be375415c08") || abort(""/system/app/BasicDreams.apk" has
unexpected contents.");
set_progress(0.000065);
set_metadata_recursive("/system/xbin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755,
"capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
ui_print("Patching remaining system files...");
apply_patch("/system/build.prop", "-‐",
d7978a543a5677b77f7c1b15b5f583fb8fa14bd8, 2774,
4d220efc37eb1786bbb379ae31145bf7edd176d9, package_extract_file("patch/system/
build.prop.p"));
set_metadata("/system/build.prop", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0);
unmount("/system");
Obtenir une propriété système dans
un fichier contenant des propriétés
QUE CONTIENT UNE OTA ?
27. 20
mount("ext4", "EMMC", "/dev/block/platform/dw_mmc.0/by-‐name/system", “/system");
file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.3/
KTU84L/1148727:user/release-‐keys" ||
file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.4/
KTU84P/1227136:user/release-‐keys" ||
abort("Package expects build fingerprint of google/mantaray/manta:4.4.3/KTU84L/
1148727:user/release-‐keys or google/mantaray/manta:4.4.4/KTU84P/1227136:user/release-‐keys; this
device has " + getprop("ro.build.fingerprint") + ".");
getprop("ro.product.device") == "manta" || abort("This package is for "manta" devices; this
is a "" + getprop("ro.product.device") + "".");
ui_print("Verifying current system...");
show_progress(0.100000, 0);
apply_patch_check("/system/app/BasicDreams.apk", "42b5544ed0a896f536c1d58ffe1c68a974f12687",
"67280e2672c034505ba417e6c0054be375415c08") || abort(""/system/app/BasicDreams.apk" has
unexpected contents.");
set_progress(0.000065);
set_metadata_recursive("/system/xbin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755,
"capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
ui_print("Patching remaining system files...");
apply_patch("/system/build.prop", "-‐",
d7978a543a5677b77f7c1b15b5f583fb8fa14bd8, 2774,
4d220efc37eb1786bbb379ae31145bf7edd176d9, package_extract_file("patch/system/
build.prop.p"));
set_metadata("/system/build.prop", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0);
unmount("/system");
Obtenir une propriété du système
QUE CONTIENT UNE OTA ?
28. 20
mount("ext4", "EMMC", "/dev/block/platform/dw_mmc.0/by-‐name/system", “/system");
file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.3/
KTU84L/1148727:user/release-‐keys" ||
file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.4/
KTU84P/1227136:user/release-‐keys" ||
abort("Package expects build fingerprint of google/mantaray/manta:4.4.3/KTU84L/
1148727:user/release-‐keys or google/mantaray/manta:4.4.4/KTU84P/1227136:user/release-‐keys; this
device has " + getprop("ro.build.fingerprint") + ".");
getprop("ro.product.device") == "manta" || abort("This package is for "manta" devices; this
is a "" + getprop("ro.product.device") + "".");
ui_print("Verifying current system...");
show_progress(0.100000, 0);
apply_patch_check("/system/app/BasicDreams.apk", "42b5544ed0a896f536c1d58ffe1c68a974f12687",
"67280e2672c034505ba417e6c0054be375415c08") || abort(""/system/app/BasicDreams.apk" has
unexpected contents.");
set_progress(0.000065);
set_metadata_recursive("/system/xbin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755,
"capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
ui_print("Patching remaining system files...");
apply_patch("/system/build.prop", "-‐",
d7978a543a5677b77f7c1b15b5f583fb8fa14bd8, 2774,
4d220efc37eb1786bbb379ae31145bf7edd176d9, package_extract_file("patch/system/
build.prop.p"));
set_metadata("/system/build.prop", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0);
unmount("/system");
Application d’un patch sur un fichier
ou une partition avec vérification des
hashs sur les fichiers
QUE CONTIENT UNE OTA ?
29. 20
mount("ext4", "EMMC", "/dev/block/platform/dw_mmc.0/by-‐name/system", “/system");
file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.3/
KTU84L/1148727:user/release-‐keys" ||
file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.4/
KTU84P/1227136:user/release-‐keys" ||
abort("Package expects build fingerprint of google/mantaray/manta:4.4.3/KTU84L/
1148727:user/release-‐keys or google/mantaray/manta:4.4.4/KTU84P/1227136:user/release-‐keys; this
device has " + getprop("ro.build.fingerprint") + ".");
getprop("ro.product.device") == "manta" || abort("This package is for "manta" devices; this
is a "" + getprop("ro.product.device") + "".");
ui_print("Verifying current system...");
show_progress(0.100000, 0);
apply_patch_check("/system/app/BasicDreams.apk", "42b5544ed0a896f536c1d58ffe1c68a974f12687",
"67280e2672c034505ba417e6c0054be375415c08") || abort(""/system/app/BasicDreams.apk" has
unexpected contents.");
set_progress(0.000065);
set_metadata_recursive("/system/xbin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755,
"capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
ui_print("Patching remaining system files...");
apply_patch("/system/build.prop", "-‐",
d7978a543a5677b77f7c1b15b5f583fb8fa14bd8, 2774,
4d220efc37eb1786bbb379ae31145bf7edd176d9, package_extract_file("patch/system/
build.prop.p"));
set_metadata("/system/build.prop", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0);
unmount("/system");
Appliquer sur un fichier ou un
dossier des droits de manière
récursive (utilisateur/groupe/
SELinux…)
QUE CONTIENT UNE OTA ?
30. 20
mount("ext4", "EMMC", "/dev/block/platform/dw_mmc.0/by-‐name/system", “/system");
file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.3/
KTU84L/1148727:user/release-‐keys" ||
file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.4/
KTU84P/1227136:user/release-‐keys" ||
abort("Package expects build fingerprint of google/mantaray/manta:4.4.3/KTU84L/
1148727:user/release-‐keys or google/mantaray/manta:4.4.4/KTU84P/1227136:user/release-‐keys; this
device has " + getprop("ro.build.fingerprint") + ".");
getprop("ro.product.device") == "manta" || abort("This package is for "manta" devices; this
is a "" + getprop("ro.product.device") + "".");
ui_print("Verifying current system...");
show_progress(0.100000, 0);
apply_patch_check("/system/app/BasicDreams.apk", "42b5544ed0a896f536c1d58ffe1c68a974f12687",
"67280e2672c034505ba417e6c0054be375415c08") || abort(""/system/app/BasicDreams.apk" has
unexpected contents.");
set_progress(0.000065);
set_metadata_recursive("/system/xbin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755,
"capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
ui_print("Patching remaining system files...");
apply_patch("/system/build.prop", "-‐",
d7978a543a5677b77f7c1b15b5f583fb8fa14bd8, 2774,
4d220efc37eb1786bbb379ae31145bf7edd176d9, package_extract_file("patch/system/
build.prop.p"));
set_metadata("/system/build.prop", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0);
unmount("/system");
Démonter un volume
QUE CONTIENT UNE OTA ?
31. 21
Signature des fichiers OTA
Les applications sont signées grâce à l’outil signapk.
Les fichiers d’OTA sont signés avec le même utilitaire, mais avec une
option spéciale (-w) qui permet de signer le fichier dans sa globalité
et non chacun d’entre eux.
Cette signature est ensuite vérifiée à deux reprises :
•Lorsqu’Android va écrire dans le fichier de commande du recovery
•Dans le recovery, avant de flasher l’image
Le dossier META-INF contient notamment le certificat de mise à jour
(au format PEM). Il est possible/conseillé d’utiliser une clé différente de
celles utilisées dans le reste du système.
QUE CONTIENT UNE OTA ?
32. 22
PLAN
1. Qui sommes nous ?
2. Qu’est-ce qu’une OTA ?
3. Architecture du système
4. Que contient une OTA ?
5. Comment l’implémenter ?
6. Partie Backend
33. IMPLÉMENTATION
23
Côté Android
Plusieurs étapes vont se succéder afin d’appliquer une mise à jour :
S’interfacer dans le menu
Paramètres
Détecter la présence d’une
mise à jour
Télécharger la mise à jour Installer la mise à jour
Supprimer la mise à jour, une
fois installée
34. 24
S’interfacer dans l’application
Paramètres
A partir du moment où les Google Play Services
sont installés, un écran de mise à jour est
forcément disponible dans les Paramètres.
IMPLÉMENTATION
35. 25
S’interfacer dans l’application Paramètres
private static final String KEY_SYSTEM_UPDATE_SETTINGS =
"system_update_settings";
IMPLÉMENTATION
36. 25
S’interfacer dans l’application Paramètres
if (UserHandle.myUserId() == UserHandle.USER_OWNER) {
Utils.updatePreferenceToSpecificActivityOrRemove(act,
parentPreference,
KEY_SYSTEM_UPDATE_SETTINGS,
Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
} else {
// Remove for secondary users
removePreference(KEY_SYSTEM_UPDATE_SETTINGS);
}
private static final String KEY_SYSTEM_UPDATE_SETTINGS =
"system_update_settings";
IMPLÉMENTATION
37. 26
S’interfacer dans l’application Paramètres
Intent intent = preference.getIntent();
if (intent != null) {
// Find the activity that is in the system image
PackageManager pm = context.getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
int listSize = list.size();
for (int i = 0; i < listSize; i++) {
ResolveInfo resolveInfo = list.get(i);
if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
!= 0) {
// Replace the intent with this specific activity
preference.setIntent(new Intent().setClassName(
resolveInfo.activityInfo.packageName,
resolveInfo.activityInfo.name));
if ((flags & UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY) != 0) {
// Set the preference title to the activity's label
preference.setTitle(resolveInfo.loadLabel(pm));
}
return true;
}
}
}
IMPLÉMENTATION
38. 26
S’interfacer dans l’application Paramètres
Intent intent = preference.getIntent();
if (intent != null) {
// Find the activity that is in the system image
PackageManager pm = context.getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
int listSize = list.size();
for (int i = 0; i < listSize; i++) {
ResolveInfo resolveInfo = list.get(i);
if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
!= 0) {
// Replace the intent with this specific activity
preference.setIntent(new Intent().setClassName(
resolveInfo.activityInfo.packageName,
resolveInfo.activityInfo.name));
if ((flags & UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY) != 0) {
// Set the preference title to the activity's label
preference.setTitle(resolveInfo.loadLabel(pm));
}
return true;
}
}
}
Le nom de l’application sera celui
affiché dans les Paramètres.
IMPLÉMENTATION
39. 27
S’interfacer dans l’application
Paramètres
Il faut donc déclarer une Activity avec cet Intent-
Filter :
<intent-‐filter android:priority="999">
<action android:name="android.settings.SYSTEM_UPDATE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-‐filter>
Il faut utiliser une priorité plus
élevée que l’Activity des Play
Services
IMPLÉMENTATION
40. 28
Détecter la présence d’une mise à jour
Requête faite en tâche de fond (Service) et notification à l’utilisateur.
IMPLÉMENTATION
41. 29
Détecter la présence d’une mise à jour
Quelques attributs utiles :
Build.TIME : retourne l’heure de build de la ROM
1424637868000
Build.DISPLAY : retourne le nom de la ROM (côté utilisateur)
VITAMIN_A_V1.0.1_beta2
Build.FINGERPRINT : retourne le nom complet de la ROM
Vitamin/VitaminA/VitaminA:4.4.4/KTU84P/20150222.214246:user/release-keys
IMPLÉMENTATION
42. 30
Télécharger l’OTA
L’emplacement du fichier et son nom n’ont pas
d’importance.
On peut se servir du DownloadManager pour
cette tâche, mais il pourra uniquement
télécharger dans les répertoires publics.
IMPLÉMENTATION
44. 32
Télécharger l’OTA
On est ensuite notifié via un Intent de la fin du téléchargement :
<receiver android:name=".DownloadReceiver">
<intent-‐filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
</intent-‐filter>
</receiver>
IMPLÉMENTATION
45. 32
Télécharger l’OTA
On est ensuite notifié via un Intent de la fin du téléchargement :
<receiver android:name=".DownloadReceiver">
<intent-‐filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
</intent-‐filter>
</receiver>
Il ne faut pas oublier de vérifier que le fichier est valide.
IMPLÉMENTATION
46. 33
Lancer la mise à jour
Une fois le fichier à disposition, il faut écrire les commandes pour que le
recovery puisse l’installer.
Il n’y a pas besoin de le faire à la main, car la classe RecoverySystem (API 8) s’en
occupe. Plusieurs méthodes sont disponibles :
public static void installPackage (Context context, File packageFile)
public static void rebootWipeCache (Context context)
public static void rebootWipeUserData (Context context)
public static void verifyPackage (File packageFile,
RecoverySystem.ProgressListener listener, File deviceCertsZipFile)
IMPLÉMENTATION
47. 34
Lancer la mise à jour
public static void installPackage(Context context, File packageFile) throws IOException {
String filename = packageFile.getCanonicalPath();
Log.w(TAG, "!!! REBOOTING TO INSTALL " + filename + " !!!");
final String filenameArg = "-‐-‐update_package=" + filename;
final String localeArg = "-‐-‐locale=" + Locale.getDefault().toString();
bootCommand(context, filenameArg, localeArg);
}
IMPLÉMENTATION
48. 35
Lancer la mise à jour
private static void bootCommand(Context context, String... args) throws IOException {
RECOVERY_DIR.mkdirs(); // In case we need it
COMMAND_FILE.delete(); // In case it's not writable
LOG_FILE.delete();
FileWriter command = new FileWriter(COMMAND_FILE);
try {
for (String arg : args) {
if (!TextUtils.isEmpty(arg)) {
command.write(arg);
command.write("n");
}
}
} finally {
command.close();
}
// Having written the command file, go ahead and reboot
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
pm.reboot(PowerManager.REBOOT_RECOVERY);
throw new IOException("Reboot failed (no permissions?)");
}
IMPLÉMENTATION
49. 36
Lancer la mise à jour
Il faut donc laisser le système faire, sachant que la permission de reboot doit
être demandée, tout comme celle pour écrire sur la partition du cache :
<uses-‐permission android:name="android.permission.REBOOT" />
<uses-‐permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" />
IMPLÉMENTATION
51. 38
Supprimer le fichier d’OTA
Le recovery ne supprime pas le fichier de mise à jour, il faut donc le faire à la
main. On ajoute pour cela un Intent-Filter :
<receiver android:name=".BootReceiver">
<intent-‐filter>
<action android:name="android.intent.action.PRE_BOOT_COMPLETED" />
</intent-‐filter>
</receiver>
IMPLÉMENTATION
52. 38
Supprimer le fichier d’OTA
Le recovery ne supprime pas le fichier de mise à jour, il faut donc le faire à la
main. On ajoute pour cela un Intent-Filter :
<receiver android:name=".BootReceiver">
<intent-‐filter>
<action android:name="android.intent.action.PRE_BOOT_COMPLETED" />
</intent-‐filter>
</receiver>
… où l’on vérifie que le terminal dispose bien de la nouvelle ROM
IMPLÉMENTATION
53. 39
PLAN
1. Qui sommes nous ?
2. Qu’est-ce qu’une OTA ?
3. Architecture du système
4. Que contient une OTA ?
5. Comment l’implémenter ?
6. Partie Backend
54. BACKEND
40
La version basique
• Placer les fichiers à disposition des terminaux Android sur le serveur
• Ecrire un JSON à la main qui liste les fichiers d’OTA et les infos utiles (date de
build, etc.)
• C’est tout !
55. BACKEND
41
La version industrielle
• Doit pouvoir permettre de placer les fichiers à disposition des terminaux
Android sur le serveur
• Doit fournir une API aux terminaux Android afin de leur servir la bonne OTA
• Doit pouvoir gérer plusieurs types de terminaux
• Ainsi que plusieurs branches de distribution
• Doit nous permettre d’avoir des statistiques sur le parc géré
60. 46
BACKEND
Pour résumer
On a donc :
•Des terminaux
•Qui sont regroupés en une flotte selon leur modèle
•Et qui peuvent être à différentes versions du software
Et tout ça, c’est le terminal lui-même qui nous le dit
63. 49
BACKEND
Ca ne suffit pourtant pas !
Quand on gère un parc conséquent de terminaux Android, on veut pouvoir
tester l’OTA sur un échantillon avant de la proposer à tout le monde.
On veut donc pouvoir créer des branches de distribution.
Cela permet :
• d’isoler des terminaux (téléphones de développement, modèles pas encore
sortis, tablettes déposées au SAV)
• de distribuer une OTA à une sous-partie du parc de téléphone