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 :
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).
2 votes
Si vous utilisez un noyau Linux, vous pourriez utiliser abootimg.
0 votes
Voir aussi: unix.stackexchange.com/questions/64628/how-to-extract-boot-img