16 votes

Comment déballer et éditer boot.img pour le portage de ROM?

J'ai récemment téléchargé cette ROM pour mon Allview P5 (Allview P5 est l'équivalent du Gionee GN700W/FLY IQ441/QMobile Noir A8). Elle s'appelle Primonex ROM et est conçue pour la version Gionee du téléphone.

  • Tout d'abord, j'ai essayé de l'installer telle quelle mais elle s'est bloquée à l'écran de démarrage.
  • Après quelques recherches, j'ai découvert que cela pouvait être un problème avec le fichier boot.img et je ne sais pas comment l'extraire ou le modifier...

Quelqu'un peut-il me dire comment faire?

2 votes

Si vous utilisez un noyau Linux, vous pourriez utiliser abootimg.

0 votes

16voto

WhiteWinterWolf Points 899

Sélection des outils

La méthode que je présente ici s'appuie sur le code source Android de CyanogenMod.

Alors que l'AOSP de Google ne fournit que l'outil pour construire el boot.img CyanogenMod ajoute également le fichier unpackbootimg outil vous permettant de déballer il. Cet outil ne semble pas spécifiquement conçu pour CyanogenMod, il y a donc de fortes chances qu'il fonctionne également pour d'autres ROM.

Il existe cependant un nombre relativement important d'alternatives pour déballer les boot.img qui fonctionnent tous plus ou moins de la même manière.

En gros, un tel outil de déballage va extraire le contenu de l'application boot.img et afficher un ensemble de paramètres que vous devrez passer à l'outil d'analyse de Google. mkbootimg pour construire un fichier dont la configuration (principalement les paramètres du noyau et les adresses mémoire) correspondra à celle d'origine.

Voici quelques exemples, je ne les ai pas testés personnellement, je ne peux donc en recommander aucun et je les présente uniquement à titre de référence :

  • Quelques-uns sont à source ouverte ou basés sur des scripts :

    • La cuisine Android était apparemment destiné à être une sorte de couteau suisse pour les développeurs Android. L'auteur original a officiellement cessé de maintenir le projet, quelques autres utilisateurs l'ont bifurqué comme javilonas o cmotc .
    • szym vise la facilité en ajoutant des enveloppes de script shell à sa panoplie d'outils pour rendre le processus complet de déballage et de remballage plus simple.
    • osm0sis propose un fork des outils de CyanogenMod "bifurqué et mis à jour" selon la description du projet lui-même. Ce projet semble en effet toujours maintenu, ce qui n'est pas très courant dans ce domaine, cependant l'avantage réel par rapport aux outils originaux de CyanogenMod reste peu clair pour moi.
  • Certains sont des binaires propriétaires à source fermée et gratuits :

    • Kuisma unmkbootimg apparaît assez souvent dans les forums d'aide et semble faire du bon travail en aidant à gérer les cas particuliers, en produisant une recommandation en anglais "lisible par l'homme" lorsque certaines modifications sont nécessaires dans le système de gestion de l'information. mkbootimg et affichant la ligne de commande exacte à utiliser pour reconstruire l'image.
    • Xiaolu mkbootimg_tools semble également être mentionné assez souvent et permet de déballer et remballer boot.img et le fichier de l'arborescence du dispositif dt.img . Ne vous laissez pas tromper par le fait qu'il est hébergé sur GitHub : il es un binaire propriétaire à code source fermé et seuls les binaires compilés sont disponibles sur leur dépôt (en fait je me demande même l'intérêt exact d'utiliser un dépôt de code source pour stocker des blobs binaires, mais à chacun son avis...).
    • CNexus sur le forum XDA fournit une archive avec une sélection d'outils.
    • Cette réponse dans Unix.SE recommande quelques outils du désormais défunt projet Android Serial Port. Les noms des fichiers, cependant, me font penser qu'il s'agit d'anciennes versions préconstruites des outils de CyanogenMod (le projet étant fermé, il n'y a ni documentation ni support).

Tous ces outils (et d'autres que vous pouvez trouver avec n'importe quel moteur de recherche) devraient fonctionner de la même manière, mais certains peuvent fonctionner mieux que d'autres pour gérer un cas particulier auquel vous pouvez être confronté avec votre propre appareil. La plupart d'entre eux cependant, au moins dans l'arène open source, ne semblent pas régulièrement maintenus, donc le meilleur pari à mon avis pour avoir des outils fonctionnels, maintenus et documentés est d'aller avec ceux de CyanogenMod.

Certains fabricants produisent des ROMs plus ou moins éloignées du standard de l'AOSP (adresses, en-têtes, format de fichier, etc. inhabituels). Si la procédure standard ci-dessous ne fonctionne pas, peut-être qu'un de ces logiciels alternatifs peut faire l'affaire. Sinon, vous devrez vérifier les problèmes spécifiques à votre appareil : certains semblent nécessiter une procédure spécifique ou même des outils spécifiques (confer. cette question liés aux appareils MediaTek, par exemple).

Installation des outils

Compilation du jeu d'outils CyanogenMod pour boot.img L'emballage et le déballage sont assez simples.

  • Si vous avez déjà installé l'arborescence complète du code source d'Android (vous pouvez consulter l'adresse suivante mon autre réponse pour obtenir plus d'informations à ce sujet), allez dans system/core/mkbootimg/ (pour rappel, le code source de l'AOSP de Google ne fournit que l'outil permettant de construire l'interface utilisateur de l'AOSP). boot.img ils font pas fournir un outil de déballage),

  • Si vous ne l'avez pas fait et que vous n'en avez pas besoin à d'autres fins, une solution plus simple et plus rapide consiste à cloner uniquement le fichier de CyanogenMod android_system_core dépôt :

      git clone https://github.com/CyanogenMod/android_system_core.git
      cd android_system_core/mkbootimg/

Une fois dans le bon répertoire, compilez et installez :

gcc -o ./mkbootimg -I ../include ../libmincrypt/*.c ./mkbootimg.c
gcc -o ./unpackbootimg -I ../include ../libmincrypt/*.c ./unpackbootimg.c
sudo cp ./mkbootimg ./unpackbootimg /usr/bin/

Notez que Google remplace le C mkbootimg avec une version Python Ainsi, dans les futures versions, aucune compilation ne sera plus nécessaire pour cette commande.

Vous devrez également installer les outils Android sur votre ordinateur pour qu'il puisse communiquer avec votre téléphone. Vous aurez besoin de adb (Android Debug Bridge, un utilitaire shell permettant de communiquer avec le sous-système de débogage d'Android), adbd (le démon correspondant) et fastboot (un utilitaire shell permettant de communiquer avec le système bootloader de votre téléphone).

Votre distribution Linux préférée peut les fournir dans un paquet unique ou séparé, mais en général ils sont toujours appelés "Android-tools" :

  • Debian / Ubuntu : sudo apt-get install android-tools-{adb,adbd,fastboot}
  • Fedora / CentOS : sudo yum install android-tools
  • openSUSE : sudo zypper install android-tools

Récupérer le boot.img fichier

Extrayez le fichier boot.img soit à partir du fichier ROM .zip, soit directement à partir de l'appareil :

  • À partir du fichier .zip de la ROM stock : certaines applications comme SuperSU peuvent modifier le fichier boot.img directement sur l'appareil, le remplacer par celui de la ROM stock casserait ces applications.
  • Directement à partir de l'appareil : certaines personnes signalent un problème de lecture entraînant la corruption de l'appareil. boot.img . IMO, ces problèmes sont très probablement liés à l'utilisation de mauvais câbles USB ou hub USB et peuvent être simplement évités en utilisant des câbles de bonne qualité reliant directement le téléphone à l'ordinateur. Vous devez également être en mesure d'exécuter ADB en mode Root (selon la ROM utilisée, cela peut être trivial ou non).

La première méthode est très évidente : extraire le fichier .zip avec n'importe quel logiciel ZIP, la deuxième méthode est plus simple. boot.img devrait se trouver à la racine de l'archive.

Pour la deuxième méthode, vous devrez d'abord déterminer le chemin d'accès (malheureusement spécifique au périphérique) vers le périphérique de stockage où boot.img peut être récupéré. Je connais deux méthodes pour cela :

  • ls /dev/block/platform/*/by-name/ (où * couvre encore un autre nom de dossier spécifique à l'appareil, il y a de fortes chances qu'il s'agisse du seul répertoire situé en dessous de platform/ ), le nom exact à rechercher dépend également de la plate-forme mais a un sens habituel (quelques exemples : boot , LNX (acronyme de "Linux")). Les fichiers de ce répertoire sont en fait des liens symboliques et certaines personnes prennent la peine d'aller manuellement à la cible, mais je recommande de s'en tenir au chemin basé sur le nom de niveau supérieur qui, bien que plus long, reste moins sujet aux erreurs. Vous obtiendrez donc un chemin comme /dev/block/platform/sdhci-tegra.3/by-name/LNX .
  • Sur certains appareils (plus anciens ?), le bon appareil pouvait être trouvé en examinant la sortie de la commande cat /proc/mtd . Si vous voyez l'appareil mtd2 associé à la "boot" vous utiliserez alors le chemin /dev/mtd2 .

Maintenant :

  • Depuis le menu développeur du téléphone :
    • Activez le débogage sur votre téléphone,
    • Autorisez l'accès Root à ADB (cette étape s'applique aux téléphones utilisant CynogenMod, les autres appareils peuvent nécessiter une procédure potentiellement plus complexe),
  • Connectez-le à votre ordinateur (et de là à l'invité VM si vous exécutez les outils Android à partir d'une machine virtuelle).

Si ce n'est pas déjà fait, je recommande de démarrer manuellement le serveur ADB du côté de l'ordinateur, cela vous permettra de valider directement la clé RSA du côté de l'appareil sans affecter le comportement des commandes ADB suivantes :

adb start-server

Puis passez ADB en mode Root :

adb root

Enfin, vous devriez être en mesure d'extraire directement le fichier boot.img à partir de l'appareil en utilisant cette commande (le chemin et les noms de la source et de la destination sont donnés à titre d'exemple, adaptez-les à vos besoins et préférences) :

adb pull /dev/block/platform/sdhci-tegra.3/by-name/LNX ./boot.img

La commande copiera l'intégralité de la partition, tant l'espace utilisé que l'espace libre, donc ne soyez pas surpris que le résultat de la commande boot.img sera plus grand que le fichier original boot.img qui vient avec le fichier .zip de la ROM stock, le contenu lui-même reste similaire.

Une fois le transfert terminé, déconnectez le téléphone et n'oubliez pas de désactiver le débogage et l'accès Root dans le menu développeur.

Déballez l'original boot.img fichier

Déballez le boot.img lui-même en utilisant la commande compilée précédemment :

unpackbootimg -i ./boot.img

Cela produira plusieurs informations essentielles pour vous permettre de reconstruire une nouvelle boot.img avec la structure correcte par rapport à l'action boot.img . Cependant, ne vous précipitez pas sur votre bloc-notes, car la version de CyanogenMod upackbootimg enregistre également les mêmes informations dans plusieurs fichiers que nous utiliserons plus tard.

Cette commande génère plusieurs fichiers avec des suffixes particuliers ajoutés au nom du fichier d'entrée :

  • *-second : Il s'agit du chargeur de démarrage de deuxième étape, facultatif et rarement utilisé sur les téléphones des utilisateurs finaux. Si ce fichier est vide (le cas le plus courant), alors le chargeur de démarrage du téléphone appellera directement le noyau Linux.
  • *-zImage : C'est le noyau de Linux.
  • *-ramdisk.gz o *-ramdisk.lz4 : le disque RAM utilisé pour remplir le répertoire racine de l'appareil. L'extension diffère selon l'algorithme de compression utilisé.
  • *-dt : L'arborescence du dispositif, qui remplit /dev .
  • Les autres sont de petits fichiers, chacun stockant l'une des valeurs affichées en unpackbootimg sortie. Ces valeurs définissent le paramètre de ligne de commande à passer au noyau Linux et les adresses où le chargeur de démarrage devra charger chaque objet au moment du démarrage.

Le plus souvent, on déballe le boot.img pour pouvoir modifier le contenu du répertoire racine du téléphone. Comme nous l'avons vu plus haut, ce contenu est stocké dans le fichier *-ramdisk.gz o *-ramdisk.lz4 et il peut être extrait en utilisant les commandes ci-dessous :

mkdir ./ramdisk
cd ./ramdisk/
gzip -dc ../boot.img-ramdisk.gz | cpio -imd

Pour un disque RAM compressé LZ4, remplacez la dernière étape par lz4 -d ../boot.img-ramdisk.lz4 | cpio -imd .

Vous êtes maintenant libre d'effectuer les modifications que vous souhaitez avant de poursuivre. Cependant, il peut être intéressant de suivre la procédure complète de déballage - remballage - démarrage une fois sans rien changer pour s'assurer que vos outils fonctionnent comme prévu. Sinon, en cas de problème, vous ne serez pas certain que la cause est votre modification ou une incompatibilité (voir mes remarques au début sur certains fabricants qui exigent des procédures ou des outils non standard).

Reconstruire pour obtenir le nouveau new-boot.img fichier

Le processus de construction de la ROM CyanogenMod repose sur un outil interne, mkbootfs pour produire le boot.img (cela se produit dans build/tools/releasetools/common.py ). Cependant, les étapes pour construire cet outil me semblent inutilement complexes, alors que l'utilisation de l'outil fourni par le système cpio semble fonctionner tout aussi bien. La principale différence entre les deux, d'après ce que j'ai compris après une (très) rapide vérification mkbootfs semble être que ce dernier applique certaines mesures d'hygiène en n'incluant pas les fichiers en pointillés et les /root dans l'archive résultante tandis que le répertoire cpio La procédure ci-dessous, basée sur le principe de l'aveugle, placera toute l'arborescence de répertoires sélectionnée dans l'archive.

Conclusion : inutilement complexe à compiler avec très peu d'avantages, donc restons sur les outils fournis par le système !

Commencez par créer le nouveau disque RAM, à partir de l'onglet ramdisk dans le répertoire créé ci-dessus, tapez :

find . ! -name . | LC_ALL=C sort | cpio -o -H newc -R root:root | gzip > ../new-boot.img-ramdisk.gz

Ou, si vous avez besoin de générer une archive LZ4 :

find . ! -name . | LC_ALL=C sort | cpio -o -H newc -R root:root | lz4 > ../new-boot.img-ramdisk.lz4

Le but ici est de créer un nouveau fichier de disque RAM avec des propriétés aussi proches que possible de l'original (par exemple, la définition du propriétaire semble souvent absente des procédures partagées dans les forums et les blogs, cependant cela était nécessaire sur mon appareil).

Allez maintenant dans le répertoire parent pour générer le new-boot.img lui-même.

cd ..

Comme on l'a vu plus haut, le programme de CyanogenMod unpackbootimg génère un fichier correspondant à chaque paramètre attendu par mkbootimg . Par conséquent, il vous suffit d'émettre une mkbootimg -h pour obtenir une liste de tous les paramètres, puis définir chacun d'entre eux à la valeur appropriée en utilisant le fichier correspondant. Notez que certains paramètres attendent un chemin d'accès au fichier tandis que d'autres attendent de recevoir le contenu du fichier comme valeur. Voir un exemple de la commande résultante ci-dessous :

mkbootimg                                           \
--kernel ./boot.img-zImage                          \
--ramdisk ./new-boot.img-ramdisk.gz                 \
--second ./boot.img-second                          \
--cmdline "$(cat ./boot.img-cmdline)"               \
--base "$(cat ./boot.img-base)"                     \
--pagesize "$(cat ./boot.img-pagesize)"             \
--dt ./boot.img-dt                                  \
--ramdisk_offset "$(cat ./boot.img-ramdisk_offset)" \
--second_offset "$(cat ./boot.img-second_offset)"   \
--tags_offset "$(cat ./boot.img-tags_offset)"       \
--output ./new-boot.img

Seuls deux paramètres ne sont pas définis ici :

  • --board : Selon ma compréhension, il s'agit juste d'un champ informatif permettant d'insérer un nom de modèle dans l'image résultante.
  • --id : Celui-ci n'attend aucune valeur, il imprime juste un identifiant unique après que l'image ait été construite (combinant un timestamp et une somme de contrôle).

Flash le new-boot.img sur l'appareil

  • Démarrez l'appareil en mode fastboot (alias mode bootloader, généralement en maintenant les boutons power et volume up).

  • Connectez le câble USB.

  • Vérifiez que le périphérique est correctement détecté :

      sudo fastboot devices
  • Essayez de démarrer en utilisant la nouvelle ROM (sans la flasher pour l'instant, donc en cas de problème vous n'aurez qu'à redémarrer le téléphone pour le remettre en route, remplacez le fichier ./new-boot.img avec votre propre nom de fichier) :

      sudo fastboot boot ./new-boot.img
  • Si le téléphone fonctionne correctement avec la nouvelle image de démarrage, retournez en mode fastboot et flashez-la de façon permanente :

      sudo fastboot flash boot ./new-boot.img
      sudo fastboot reboot

Conclusion

Cette procédure peut sembler intimidante au début, mais une fois que vous l'aurez comprise, vous verrez qu'elle ne l'est pas vraiment.

L'aspect "décourageant" vient du fait qu'il n'existe pas un seul "système Android" : de nombreux fabricants et fournisseurs de ROM apportent des modifications qui peuvent aller d'une subtile différence de chemin à un environnement totalement non standard.

Ce que vous devez faire, c'est déterminer la posture de votre appareil particulier, et ensuite quelles sont les quelques commandes qui sont appropriées dans votre cas. Une fois que vous les aurez obtenues, vous pourrez vous y tenir et même les scénariser facilement si vous en avez souvent besoin.

Je suis volontairement entré dans des détails de relativement bas niveau parfois parce que cela vous permettra de résoudre vos problèmes plus facilement. Utiliseriez-vous un utilitaire opaque plus "facile" pour construire et flasher votre nouveau système de gestion de l'information ? boot.img et que vous constatez que votre appareil ne peut pas démarrer avec ce fichier, il vous sera plus difficile de déterminer quelle étape s'est mal passée. Ici, à chaque étape, vous pourrez comparer les données que vous manipulez avec les données provenant du fichier original. boot.img ou les données telles qu'elles sont vues sur le téléphone, ou essayer par exemple de reconstruire la boot.img avec le fichier original ou le fichier du disque RAM nouvellement généré afin de vérifier si cela fait une différence (cela vous permet de déterminer si le problème provient de l'interface utilisateur de l'ordinateur). boot.img ou la procédure de génération de fichiers sur le disque RAM).

2voto

dantis Points 954

Utilisez l'Android Kitchen. Il y a une option pour décompresser/recompresser boot.img là-bas, sous Options avancées.

0 votes

Malheureusement, l'auteur original a officiellement cessé de maintenir l'Android Kitchen : "Ce projet est retiré depuis 2013, car j'ai été submergé par le nombre d'appareils à prendre en charge, la demande, la mauvaise santé, et les demandes constantes d'aide". Quelques forks ont été créés cependant (je donne quelques liens dans ma réponse), mais je ne sais pas dans quelle mesure ils sont pris en charge (je n'ai pas trouvé de moyen public évident de signaler des problèmes ou de demander une évolution par exemple).

1voto

Jonas S. Points 1

Essayer de modifier boot.img sur un téléphone mediatek sans nom, seul éditeur d'image de démarrage Android a parfaitement fonctionné. C'est simple et facile à utiliser. D'autres outils ne sont plus maintenus, ou produisent une image de démarrage invalide.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X