Wie entpacke und bearbeite ich boot.img für die ROM-Portierung?

Ich habe dieses ROM kürzlich für mein Allview P5 heruntergeladen (Allview P5 ist das Äquivalent von Gionee GN700W/FLY IQ441/QMobile Noir A8). Es heißt Primonex ROM und ist für die Gionee-Version des Telefons gemacht.

  • Zuerst habe ich versucht, es so zu installieren, wie es ist, aber es blieb beim Startbildschirm hängen.
  • Nach einiger Recherche fand ich heraus, dass es ein Problem mit der boot.imgDatei sein könnte und ich nicht weiß, wie ich sie extrahieren oder bearbeiten soll ...

Kann mir jemand sagen wie man das macht?

Wenn Sie einen Linux-Kernel verwenden, können Sie abootimg verwenden

Antworten (2)

Werkzeugauswahl

Die Methode, die ich hier vorstelle, basiert auf dem Android-Quellcode von CyanogenMod.

Während Googles AOSP nur das Tool zum Erstellen der Datei bereitstellt boot.img, fügt CyanogenMod auch das unpackbootimgTool zum Entpacken hinzu . Dieses Tool scheint in keiner Weise speziell für CyanogenMod entwickelt worden zu sein, daher stehen die Chancen gut, dass es auch für andere ROMs funktioniert.

Es gibt jedoch relativ viele Alternativen zum Entpacken der boot.imgDatei, die alle mehr oder weniger gleich funktionieren.

Grundsätzlich extrahiert ein solches Entpack-Tool den Inhalt der boot.imgDatei und zeigt eine Reihe von Parametern an, die Sie an das Google- mkbootimgTool übergeben müssen, um eine Datei zu erstellen, deren Konfiguration (hauptsächlich Kernel-Parameter und Speicheradressen) mit der ursprünglichen übereinstimmt.

Hier sind ein paar Beispiele, ich habe sie nicht persönlich getestet, kann also keine empfehlen und stelle sie nur zu Referenzzwecken vor:

  • Einige sind Open Source oder skriptbasiert:

    • Die Android Kitchen sollte offenbar eine Art Schweizer Taschenmesser für Android-Entwickler sein. Der ursprüngliche Autor hat die Wartung des Projekts offiziell eingestellt, einige andere Benutzer haben es wie javilonas oder cmotc geforkt .
    • szym zielt auf Einfachheit ab, indem es Shell-Skript-Wrapper zu seinem Toolset hinzufügt, um den gesamten Entpack- und Neupackprozess einfacher zu gestalten.
    • osm0sis schlägt einen Fork von CyanogenMods Werkzeugen vor, "forked and updated" gemäß der eigenen Beschreibung des Projekts. Dieses Projekt scheint zwar immer noch gepflegt zu werden, was in diesem Bereich nicht sehr verbreitet ist, jedoch bleibt mir der tatsächliche Vorteil gegenüber den ursprünglichen Tools von CyanogenMod unklar.
  • Einige sind kostenlose, proprietäre Closed-Source-Binärdateien:

    • Kuisma'sunmkbootimg erscheint ziemlich oft in Hilfeforen und scheint einen guten Job zu machen, wenn es darum geht, seltsame Fälle zu handhaben, "vom Menschen lesbare" englische Empfehlungen auszugeben, wenn einige Änderungen im mkbootimgQuellcode erforderlich sind, und die genaue Befehlszeile anzuzeigen, die zum Neuaufbau des Bildes verwendet werden soll.
    • Xiaolu'smkbootimg_tools scheint auch ziemlich oft erwähnt zu werden und ermöglicht das Entpacken und Neupacken boot.imgund die Gerätebaumdatei dt.img. Lassen Sie sich nicht von der Tatsache täuschen, dass es auf GitHub gehostet wird: Es ist eine proprietäre Closed-Source-Binärdatei und nur kompilierte Binärdateien sind in ihrem Repository verfügbar (eigentlich frage ich mich sogar über das genaue Interesse, ein Quellcode-Repository zum Speichern zu verwenden). binäre Blobs, aber andere Leute, andere Köpfe...).
    • CNexus im XDA-Forum bietet ein Archiv mit einer Auswahl an Tools.
    • Diese Antwort in Unix.SE empfiehlt einige Tools aus dem scheinbar nicht mehr existierenden Android Serial Port-Projekt. Die Dateinamen lassen mich jedoch vermuten, dass dies alte vorgefertigte Versionen von CyanogenMods Tools sein sollten (das Projekt wird geschlossen, es gibt weder Dokumentation noch Support).

Alle diese Tools (und andere, die Sie möglicherweise bei jeder Suchmaschine finden) sollten auf die gleiche Weise funktionieren, aber einige funktionieren möglicherweise besser als andere, wenn es darum geht, bestimmte Grenzfälle zu bewältigen, denen Sie möglicherweise mit Ihrem eigenen Gerät begegnen. Die meisten von ihnen scheinen jedoch, zumindest im Open-Source-Bereich, nicht regelmäßig gewartet zu werden, daher ist es meiner Meinung nach die beste Wahl, funktionierende, gewartete und dokumentierte Tools zu haben, die von CyanogenMod zu verwenden.

Einige Hersteller produzieren ROMs, die mehr oder weniger weit vom AOSP-Standard entfernt sind (ungewöhnliche Adressen, Header, Dateiformate usw.). Wenn das nachstehende Standardverfahren nicht funktioniert, kann vielleicht eine dieser alternativen Softwares ausreichen. Andernfalls müssen Sie nach Problemen suchen, die für Ihr Gerät spezifisch sind: Einige scheinen ein bestimmtes Verfahren oder sogar bestimmte Tools zu erfordern (siehe diese Frage beispielsweise in Bezug auf MediaTek-Geräte).

Werkzeuginstallation

Das Kompilieren des CyanogenMod-Toolsets zum boot.imgPacken und Entpacken ist ziemlich einfach.

  • Wenn Sie bereits den vollständigen Android-Quellcodebaum installiert haben (Sie können meine andere Antwort lesen , um weitere Informationen dazu zu erhalten), gehen Sie in das system/core/mkbootimg/Verzeichnis (zur Erinnerung: Der AOSP-Quellcode von Google bietet nur das Tool zum Erstellen der boot.imgDatei, sie tun es nicht stellen Sie ein Entpackwerkzeug bereit),

  • Wenn Sie dies nicht haben und für keinen anderen Zweck benötigen, besteht eine einfachere und schnellere Lösung darin, nur das android_system_core - Repository von CyanogenMod zu klonen:

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

Sobald Sie sich im richtigen Verzeichnis befinden, kompilieren und installieren Sie:

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

Beachten Sie, dass Google C mkbootimgdurch eine Python-Version ersetzt , sodass in zukünftigen Versionen für diesen Befehl möglicherweise keine Kompilierung mehr erforderlich ist.

Sie müssen auch Android-Tools auf Ihrem Computer installieren, damit er mit Ihrem Telefon kommunizieren kann. Sie benötigen adb(Android Debug Bridge, ein Shell-Dienstprogramm, das die Kommunikation mit dem Debug-Subsystem von Android ermöglicht), adbd(den zugehörigen Daemon) und fastboot(ein Shell-Dienstprogramm, das die Kommunikation mit dem Bootloader-System Ihres Telefons ermöglicht).

Ihre bevorzugte Linux-Distribution bietet sie möglicherweise in einem einzelnen oder separaten Paketen an, aber normalerweise werden sie immer als "android-tools" bezeichnet:

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

Holen Sie die boot.imgDatei

Extrahieren Sie die boot.img entweder aus der ROM-ZIP-Datei oder direkt vom Gerät:

  • Aus der .zip-Datei des Standard-ROM: Einige Anwendungen wie SuperSU können die Datei boot.img direkt auf dem Gerät modifizieren, das Ersetzen durch die Standarddatei würde solche Anwendungen beschädigen.
  • Direkt vom Gerät: Einige Leute berichten von Leseproblemen, die zu beschädigten boot.img. IMO, diese Probleme hängen höchstwahrscheinlich mit der Verwendung von schlechten USB-Kabeln oder USB-Hubs zusammen und können einfach vermieden werden, indem qualitativ hochwertige Kabel verwendet werden, die das Telefon direkt mit dem Computer verbinden. Sie benötigen auch die Möglichkeit, ADB im Root-Modus auszuführen (je nach verwendetem ROM kann dies trivial sein oder nicht).

Die erste Methode ist sehr offensichtlich: Extrahieren Sie die .zip-Datei mit einer beliebigen ZIP-Software, die boot.imgDatei sollte sich direkt im Stammverzeichnis des Archivs befinden.

Bei der zweiten Methode müssen Sie zunächst den (leider gerätespezifischen) Pfad zum Speichergerät ermitteln, auf dem boot.imgdie Inhalte von abgerufen werden können. Dafür kenne ich zwei Methoden:

  • ls /dev/block/platform/*/by-name/(wobei *es sich um einen weiteren gerätespezifischen Ordnernamen handelt, wahrscheinlich ist es das einzige Verzeichnis darunter platform/), der genaue Name, nach dem gesucht werden soll, ist ebenfalls plattformabhängig, aber normalerweise sinnvoll (einige Beispiele: boot, LNX(Akronym für "Linux")). Die Dateien in diesem Verzeichnis sind eigentlich symbolische Links und einige Leute bemühen sich, manuell zum Ziel zu gehen, aber ich empfehle, bei dem Namensbasierten Pfad auf höherer Ebene zu bleiben, der zwar länger, aber weniger fehleranfällig bleibt. Sie erhalten also einen Pfad wie /dev/block/platform/sdhci-tegra.3/by-name/LNX.
  • Auf einigen (älteren?) Geräten konnte das richtige Gerät gefunden werden, indem die Ausgabe von untersucht wurde cat /proc/mtd. Wenn Sie das mtd2dem "boot"Label zugeordnete Gerät sehen, verwenden Sie den Pfad /dev/mtd2.

Jetzt:

  • Aus dem Entwicklermenü des Telefons:
    • Aktivieren Sie das Debugging auf Ihrem Telefon,
    • Root-Zugriff auf ADB zulassen (dieser Schritt gilt für Telefone, auf denen CynogenMod ausgeführt wird, andere Geräte erfordern möglicherweise ein möglicherweise komplexeres Verfahren),
  • Verbinden Sie es mit Ihrem Computer (und von dort mit dem VM-Gast, wenn Sie Android-Tools in einer virtuellen Maschine ausführen).

Wenn dies noch nicht geschehen ist, empfehle ich, den ADB-Server auf der Computerseite manuell zu starten. Dadurch können Sie den RSA-Schlüssel auf der Geräteseite direkt validieren, ohne das Verhalten der folgenden ADB-Befehle zu beeinflussen:

adb start-server

Schalten Sie dann ADB in den Root-Modus:

adb root

Schließlich sollten Sie in der Lage sein, die boot.imgDatei mit einem solchen Befehl direkt vom Gerät zu extrahieren (der Quell- und Zielpfad und die Namen werden als Beispiele angegeben, passen Sie sie an Ihre Bedürfnisse und Vorlieben an):

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

Der Befehl kopiert die gesamte Partition, sowohl den belegten als auch den freien Speicherplatz. Seien Sie also nicht überrascht, dass die resultierende boot.imgDatei größer sein wird als die Originaldatei boot.img, die mit der Standard-ROM-ZIP-Datei geliefert wird, der Inhalt selbst bleibt ähnlich.

Sobald die Übertragung abgeschlossen ist, trennen Sie das Telefon und vergessen Sie nicht, sowohl das Debugging als auch den Root-Zugriff im Entwicklermenü zu deaktivieren.

boot.imgEntpacken Sie die Originaldatei

Entpacken Sie die boot.imgDatei selbst mit dem zuvor kompilierten Befehl:

unpackbootimg -i ./boot.img

Dadurch werden mehrere wichtige Informationen ausgegeben, damit Sie eine neue boot.imgmit der richtigen Struktur in Bezug auf den Bestand erstellen können boot.img. Beeilen Sie sich jedoch nicht mit Ihrem Notizblock, da CyanogenMod die upackbootimggleichen Informationen auch in mehreren Dateien speichert, die wir später verwenden werden.

Dieser Befehl generiert mehrere Dateien mit bestimmten Suffixen, die dem Namen der Eingabedatei hinzugefügt werden:

  • *-second: Dies ist der Bootloader der zweiten Stufe, optional und selten auf Endbenutzertelefonen verwendet. Wenn diese Datei leer ist (der häufigste Fall), ruft der Bootloader des Telefons direkt den Linux-Kernel auf.
  • *-zImage: Dies ist der Linux-Kernel.
  • *-ramdisk.gzoder *-ramdisk.lz4: die RAM-Disk, die zum Auffüllen des Stammverzeichnisses des Geräts verwendet wird. Die Erweiterung unterscheidet sich je nach verwendetem Komprimierungsalgorithmus.
  • *-dt: Der Gerätebaum, der /dev.
  • Der Rest sind kleine Dateien, die jeweils einen der in der unpackbootimgAusgabe angezeigten Werte speichern. Diese Werte definieren den an den Linux-Kernel zu übergebenden Befehlszeilenparameter und die Adressen, an die der Bootloader jedes Objekt beim Booten laden muss.

Meistens entpackt man die boot.img, um den Inhalt des Stammverzeichnisses des Telefons bearbeiten zu können. Wie oben zu sehen, wird dieser Inhalt in der Datei *-ramdisk.gzor *-ramdisk.lz4gespeichert und kann mit den folgenden Befehlen extrahiert werden:

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

Ersetzen Sie bei einer LZ4-komprimierten RAM-Disk den letzten Schritt durch lz4 -d ../boot.img-ramdisk.lz4 | cpio -imd.

Sie können jetzt die gewünschte Änderung vornehmen, bevor Sie fortfahren. Es könnte sich jedoch lohnen, einmal die vollständige Vorgehensweise zum Entpacken - Neupacken - Booten durchzuführen, ohne etwas zu ändern, um sicherzustellen, dass Ihre Tools wie erwartet funktionieren. Andernfalls sind Sie sich im Falle eines Problems nicht sicher, ob die Ursache an Ihrer Modifikation oder an einer Inkompatibilität liegt (siehe meine Bemerkungen zu Beginn zu einigen Herstellern, die nicht standardmäßige Verfahren oder Werkzeuge erfordern).

Erstellen Sie neu, um die neue new-boot.imgDatei zu erhalten

Der CyanogenMod-ROM-Erstellungsprozess stützt sich auf ein internes Tool, mkbootfs, um die boot.imgDatei zu erstellen (dies geschieht in build/tools/releasetools/common.py ). Die Schritte zum Erstellen dieses Tools erscheinen mir jedoch nutzlos komplex, während die Verwendung des vom System bereitgestellten cpiogenauso gut zu funktionieren scheint. Der Hauptunterschied zwischen den beiden mkbootfsscheint nach meinem Verständnis nach einem (sehr) schnellen Einchecken des Quellcodes darin zu bestehen, dass letzterer einige vernünftige Maßnahmen anwendet, indem er gepunktete Dateien und das /rootVerzeichnis nicht in das resultierende Archiv einbezieht, während das cpio-basierte Verfahren unten wird einfach den gesamten ausgewählten Verzeichnisbaum blind in das Archiv legen.

Fazit: Unnötig komplex zu kompilieren mit sehr wenigen Vorteilen, also bleiben wir bei den vom System bereitgestellten Tools!

Beginnen Sie mit dem Erstellen der neuen RAM-Disk, geben Sie aus dem ramdiskoben erstellten Verzeichnis Folgendes ein:

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

Oder, wenn Sie ein LZ4-Archiv generieren müssen:

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

Das Ziel hier ist es, eine neue RAM-Disk-Datei mit Eigenschaften zu erstellen, die der ursprünglichen so nahe wie möglich kommen (z. B. scheint die Einstellung des Besitzers oft in den in Foren und Blogs geteilten Verfahren zu fehlen, aber dies war auf meinem Gerät erforderlich).

Wechseln Sie nun in das übergeordnete Verzeichnis, um die new-boot.imgDatei selbst zu generieren.

cd ..

Wie oben zu sehen ist, generiert der Befehl von CyanogenMod unpackbootimgeine Datei, die jedem Parameter entspricht, der von erwartet wird mkbootimg. Daher müssen Sie nur eine ausgeben mkbootimg -h, um eine Liste aller Parameter zu erhalten, und dann jeden von ihnen mithilfe der entsprechenden Datei auf den entsprechenden Wert setzen. Beachten Sie, dass einige Parameter einen Dateipfad erwarten, während andere den Inhalt der Datei als Wert erwarten. Sehen Sie unten ein Beispiel für einen resultierenden Befehl:

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

Lediglich zwei Parameter werden hier nicht gesetzt:

  • --board: Nach meinem Verständnis ist dies nur ein informatives Feld, in das ein Modellname in das resultierende Bild eingefügt werden kann.
  • --id: Dieser erwartet keinen Wert, er gibt nur eine eindeutige Kennung aus, nachdem das Bild erstellt wurde (Kombination eines Zeitstempels und einer Prüfsumme).

Flashen Sie die new-boot.imgDatei auf das Gerät

  • Starten Sie das Gerät im Fastboot-Modus (auch bekannt als Bootloader-Modus, normalerweise durch Halten der Einschalt- und Lautstärketaste).

  • Schließen Sie das USB-Kabel an.

  • Überprüfen Sie, ob das Gerät richtig erkannt wird:

      sudo fastboot devices
    
  • Versuchen Sie, mit dem neuen ROM zu booten (ohne es noch zu flashen, also müssen Sie im Falle eines Problems nur das Telefon neu starten, um es wieder auf die Trails zu bringen, ersetzen Sie den ./new-boot.imgDateinamen durch Ihren eigenen):

      sudo fastboot boot ./new-boot.img
    
  • Wenn das Telefon mit dem neuen Boot-Image erfolgreich funktioniert, gehen Sie zurück in den Fastboot-Modus und flashen Sie es dauerhaft:

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

Fazit

Dieses Verfahren mag auf den ersten Blick entmutigend erscheinen, aber sobald Sie es verstanden haben, werden Sie sehen, dass es das eigentlich nicht ist.

Der „abschreckende“ Aspekt ergibt sich aus der Tatsache, dass es kein einziges „Android-System“ gibt: Viele Hersteller und ROM-Anbieter nehmen Änderungen vor, die von einem subtilen Pfadunterschied bis zu einer völlig nicht standardmäßigen Umgebung reichen können.

Was Sie tun müssen, ist die Haltung Ihres speziellen Geräts zu bestimmen, und dann, was die wenigen Befehle sind, die in Ihrem Fall angemessen sind. Sobald Sie sie erhalten haben, können Sie sich an sie halten und sie sogar einfach skripten, wenn Sie sie häufig benötigen.

Ich bin freiwillig manchmal auf relativ niedrige Details eingegangen, weil Sie dadurch Ihre Probleme leichter beheben können. Würden Sie ein "einfacheres" undurchsichtiges Dienstprogramm zum Erstellen und Flashen Ihrer neuen boot.imgDatei verwenden und feststellen, dass Ihr Gerät damit nicht starten kann, wäre es für Sie schwieriger festzustellen, welcher Schritt schief gelaufen ist. Hier können Sie bei jedem Schritt die Daten, die Sie manipulieren, mit den Daten aus der Originaldatei boot.imgoder den Daten, die Sie auf dem Telefon sehen, vergleichen oder beispielsweise versuchen, die boot.imgDatei entweder mit dem Original oder mit den neu generierten neu zu erstellen RAM-Disk-Datei, um zu prüfen, ob dies einen Unterschied macht (damit können Sie feststellen, ob das Problem von der boot.imgoder der RAM-Disk-Dateigenerierung herrührt).

Verwenden Sie die Android-Küche. Dort gibt es unter Advanced options.

Leider hat der ursprüngliche Autor offiziell aufgehört, die Android-Küche zu warten: " Dieses Projekt wurde 2013 eingestellt, da ich mit der Anzahl der zu unterstützenden Geräte, der Nachfrage, der schlechten Gesundheit und den ständigen Bitten um Hilfe überwältigt bin ". Es wurden zwar einige Gabelungen erstellt (ich gebe einige Links in meiner Antwort an), aber ich weiß nicht, wie sehr sie unterstützt werden (ich habe keinen offensichtlichen öffentlichen Weg gefunden, um beispielsweise Probleme anzusprechen oder eine Weiterentwicklung anzufordern).