Démystifions les fichiers update.zip : Examen en profondeur

Par jhowlett468 - Le 10/03/14 - Affichages : 8965
recovery.png

Image choppée sur Google (recovery pour XPeria Arc, avec quelques retouches de l'image - crédit...Phonandroid, désolé c'était la seule image qui me convenait)

Merci à Gabs de m'avoir donné l'idée du titre ;)



Topic à lire en parallèle avec celui-ci : [Tuto] Quelques explications sur l'updater-script


Un update.zip ou zip flashable çà sert à quoi et comment çà marche ? Le but de ce topic est de répondre à ces questions... Pour pouvoir par la suite bidouiller les votres :mrgreen:
Déjà, çà sert à quoi ? A rajouter des apk manquants (surtout dans la partie système sinon y'a Google Play en règle générale) ou moddés, à changer le modem du téléphone, à fixer une fonction défaillante (GPS...) ou à nettoyer votre téléphone...
Comment çà marche ? Lisez la suite :mrgreen:
Ce topic s'inspire librement de ce topic d'Okaryn, un peu daté car plus mis à jour depuis des lustres (DOMMAGE) : Comment réaliser son update.zip post flash

Pré-requis :
  • s'être documenté dans la section Pour bien débuter sur le forum ou avoir au moins lu mon topic Récap' : De l'inscription au bidouillage
  • avoir lu mon topic Quelques explications sur l'updater-script ou un autre topic équivalent sur un autre site (XDA...) - référez-vous y si vous ne comprenez pas certaines choses dans le code montré dans le topic
  • avoir un PC sous Windows (XP ou 7 chez moi) avec un logiciel de compression / décompression (7zip,WinRAR...) et Notepad++, je ne connais pas les solutions équivalentes sur Mac ou sous Linux (à part faire tourner une VM Windows ou d'utiliser, sur Mac, Windows sur une partition Bootcamp)

Je vais me servir pour ce topic du zip permettant de réinstaller les APK système supprimés sur la ROM TGP v11.30 pour I9305.
A ce zip, j'ai rajouté le flash d'une app utilisateur (celles qui vont dans /data/app) et le vidage de la partition cache et du dalvik cache afin de couvrir un large spectre dans mes explications.Par convention, dans ce topic, un chemin de fichier ne commencant pas par un slash (le "/") concerne un dossier ou un fichier dans le zip (ex. data/app) et un chemin de fichier commencant par un slash (le "/") concerne un dossier ou un fichier dans le téléphone (ex. /data/app).
NI MOI, NI AUCUN AUTRE MEMBRE DU FORUM NE POURRAIT ETRE RESPONSABLE SUITE AU BRICK DE VOTRE TELEPHONE EN CAS DE MAUVAISE MANIP.

VERIFIEZ BIEN QUE LES ZIP QUE VOUS FLASHEZ SONT BIEN PREVUS POUR VOTRE TELEPHONE ET POUR VOTRE ROM.

AVANT DE FLASHER QUOI QUE CE SOIT, PENSEZ A FAIRE UN NANDROID BACKUP.

CONCERNANT LA PROCEDURE DE FLASH D'UN ZIP, REFEREZ AUX TOPICS CONCERNES.

JE N'AI A LA BASE AUCUNE FORMATION EN INFORMATIQUE, J'AI APPRIS SUR LE TAS ET LE GROS DE MES CONNAISSANCES EST EMPIRIQUE... SI CE QUE J'AI ECRIT CONTIENT DES ERREURS, NE M'EN VEUILLEZ PAS ET SIGNALEZ-LES MOI AFIN QUE JE LES CORRIGE... MERCI.


STRUCTURE D'UN ZIP FLASHABLE

Déjà, comment s'organise un zip flashable ? De fichiers à flasher (mais pas toujours par exemple dans le cas d'un zip de nettoyage comme ce zip de nettoyage de mon tél dispo ICI qui purge /cache et le dalvik cache) et de scripts disant au recovery quelles opérations effectuer.
Celui que je vais présenter (dispo ICI) va rajouter des app système (dans /system/app donc) et utilisateur (dans /data/app) et vider la partition cache et le dalvik cache. Quelques captures d'écran dudit zip :

Image

On trouve 3 dossier dans le zip : data (pour l'extraction vers /data), META-INF (qui contient l'updater-script) et system ((pour l'extraction vers /system), j'y reviendrai vite.

Image

Dans META-INF/com/google/android, on trouve l'updater-script et l'update-binary (cf Quelques explications sur l'updater-script). L'emplacement est important...Ne les bougez pas !!!

Image

Image

Quand on ouvre le dossier data, on trouve le dossier data/app et quand on ouvre data/app, on trouve son contenu, ici un apk qui finira dans /data/app (ici Flash Player).
On peut rajouter (ou supprimer) n'importe quel apk dans ce dossier si on veut qu'il aille dans /data/app (la commande correspondante dans l'updater-script gère le dossier dans son intégralité, pas une liste prédéfinie de son contenu). **
Si vous ne voulez rien flasher vers /data/app, supprimez le dossier data et supprimez la commande package_extract_dir("data", "/data"); (pas utile si on ne veut rien flasher dans /data) mais gardez la ligne de montage de /data à cause du wipe dalvik cache ;)

Image

Image

Quand on ouvre le dossier system, on trouve le dossier system/app et quand on ouvre system/app, on trouve son contenu, ici les apk qui finiront dans /system/app
On peut rajouter (ou supprimer) n'importe quel apk dans ce dossier si on veut qu'il aille dans /system/app (la commande correspondante dans l'updater-script gère le dossier dans son intégralité, pas une liste prédéfinie de son contenu). **
Si vous ne voulez rien flasher vers /system/app, supprimez le dossier system et supprimez la commande package_extract_dir("system", "/system"); (pas utile si on ne veut rien flasher dans /system) mais gardez la ligne de montage de /system on sait jamais ;)

Pourquoi cette structure dans les dossiers data et system (data/app et system/app) ? Parce-que ces dossiers reprennent la même structure que les dossiers (partitions) /system (/system/app) et /data (/data/app), ce qui fait que la commande package_extract_dir("data", "/data"); extrait le contenu de data vers /data. Les 2 dossiers ayant la même structure, le contenu du (ou des) dossier(s) de plus bas niveau est copié du 1er vers le 2ème (ici package_extract_dir("data", "/data"); fait que le contenu de data/app est copié vers /data/app). En cas de fichier déjà présent, celui-ci est écrasé.
Pour faire court, la structure des dossiers des fichiers à flasher doit être la même que celle des dossiers équivalents dans le téléphone.

Dans ce zip, si vous ne changez aucune destination, vous pouvez rajouter tous les apk que vous voulez dans data/app ou system/app.Si vous voulez rajouter (ou supprimer) des fichiers ailleurs, il faudra modifier l'updater-script (par exemple si vous rajoutez un dossier sbin pour rajouter un fichier dans /sbin).
Les fichiers présents dans le zip peuvent extraits en utilisant 7zip ou WinRAR (entre autres...) et l'inverse est vrai (on peut rajouter des fichiers au zip via ces programmes).

** : ceci est vrai dans n'importe quel dossier dans le zip. On peut rajouter / supprimer des fichiers / dossiers où on veut du moment qu'on respecte l'arborescence du téléphone et qu'on adapte l'updater-script en fonction (on ne flashe pas un fichier sur une partition non montée, çà marche moins bien).



UPDATER-SCRIPT

Maintenant que la structure est expliquée, passons au code de l'updater-script (code source dispo ICI). Présent dans META-INF/com/google/android, c'est lui qui va dire au recovery quoi faire et surtout quoi faire avec le zip s'il contient des fichiers flashables (ce qui est le cas dans l'exemple, le but principal étant d'installer des apk manquants et de purger /cache et le dalvik cache). Toute modification de l'updater-script doit être faite via Notepad ++ et par aucun autre programme (bloc-notes, Word...)

Code: Select All Code
run_program("/sbin/mount", "/cache");


Montage de la partition cache via la commande busybox "mount" (qui se trouve dans le dossier /sbin à la racine du téléphone)

Code: Select All Code
assert(getprop("ro.product.device") == "m3" || getprop("ro.build.product") == "m3" ||
       getprop("ro.product.device") == "m3xx" || getprop("ro.build.product") == "m3xx" ||
       getprop("ro.product.device") == "i9305" || getprop("ro.build.product") == "i9305" ||
       getprop("ro.product.device") == "GT-I9305" || getprop("ro.build.product") == "GT-I9305");


Vérification par le zip que le téléphone est bien un I9305 (arrêt de la procédure de flash à cette étape si au moins UNE des conditions n'est pas respectée)

Code: Select All Code
show_progress(1.000000, 0);
ui_print(" ");
ui_print("+-----------------------------------------+");
ui_print(" ");
ui_print("      @@@@@@@@@@    @@@@@  @@@@@@@");
ui_print("      @@@@@@@@@#  @@@@@@@  @@@@@@@@+");
ui_print("      @@@@@@@@@+ @@@@@@@@` @@@@@@@@@:");
ui_print("      @@@@@@@@@'.@@@@@@@@. @@@@@@@@@@");
ui_print("      @@@@@@@@@:@@@@@@@@@: @@@@@@@@@@");
ui_print("        .@@@@   @@@@@@@  ` #@@@@  @@@");
ui_print("        `@@@@   @@@@@`     #@@@@ `@@@");
ui_print("         @@@@   @@@@@  #@@;'@@@@ ;@@+");
ui_print("         @@@@   @@@@@  ;@@.'@@@@@@@@");
ui_print("         @@@@   `@@@@` :@@`;@@@@@@;");
ui_print("         @@@@    #@@@@@@@@`:@@@@");
ui_print("         @@@@     :@@@@@@@ .@@@@");
ui_print("                     @@@@:");
ui_print(" ");
ui_print("+-----------------------------------------+");
ui_print(" ");
ui_print("-- Mounting Partitions ...");
set_progress(0.100000);


Défilement de bla bla

Code: Select All Code
unmount("/system");
mount("ext4", "EMMC", "/dev/block/mmcblk0p12", "/cache");
mount("ext4", "EMMC", "/dev/block/mmcblk0p13", "/system");
mount("ext4", "EMMC", "/dev/block/mmcblk0p16", "/data");


Démontage de la partition /system puis montage (dans l'ordre) des partitions /cache /system et /data
Concernant les noms des partitions (mmcblkXpXX), si vous en avez besoin, regardez ce topic

Code: Select All Code
delete_recursive("/cache");
delete_recursive("/data/dalvik-cache");
set_progress(0.300000);


Purge de la partition cache et du dalvik cache par effacement de leur contenu

Code: Select All Code
ui_print("-- Installing Apps ...");


Bla bla : "-- Installing Apps ..."

Code: Select All Code
package_extract_dir("system", "/system");
package_extract_dir("data", "/data");
set_perm_recursive(0, 0, 0755, 0644, "/system/app");
set_perm_recursive(0, 0, 0755, 0644, "/data/app");


Extraction du contenu des dossiers system et data du zip vers les partitions system et data du téléphone (veiller à bien respecter la même arborescence dans le zip que celle qu'on trouve dans le téléphone ---> le contenu data/app s'extrait dans /data/app via la commande package_extract_dir("data", "/data"); )
Attribution des permissions adéquates aux dossiers concernés


Code: Select All Code
set_progress(0.25);
ui_print(" ");
set_progress(0.800000);
ui_print("-- Unmounting Partitions ... ");


Bla bla : "-- Unmounting Partitions ... "

Code: Select All Code
unmount("/system");
unmount("/data");
unmount("/cache");


Démontage (dans l'ordre) des partitions /system /data et /cache (inverse de l'ordre de montage du début du zip)


Code: Select All Code
ui_print(" ");
set_progress(1.000000);
show_progress(1.000000, 0);
ui_print("   Installation Complete ...");
ui_print(" ");
ui_print("+-----------------------------------------+");


Bla bla : " Installation Complete ..."

Installation... Et explications terminés... Est-ce clair pour vous maintenant ?
Ne vous attendez pas à tout comprendre d'un coup... Le meilleur moyen de comprendre le fonctionnement d'un zip flashable, c'est d'en récupérer un qui marche pour votre téléphone ET votre ROM et de modifier les fichiers inclus ainsi que l'updater-script pour voir comment il se comporte ;)
17 réponse(s) -