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

14

Ich habe dieses ROM kürzlich für mein Allview P5 heruntergeladen (Allview P5 entspricht Gionee GN700W / FLY IQ441 / QMobile Noir A8). Es heißt Primonex ROM und wurde für die Gionee-Version des Telefons entwickelt.

  • Erstens habe ich versucht, es so zu installieren, wie es ist, aber es blieb auf dem Startbildschirm hängen.
  • Nach einigen Recherchen habe ich herausgefunden, dass es ein Problem mit der boot.imgDatei sein könnte und ich weiß nicht, wie ich sie extrahieren oder bearbeiten soll ...

Kann mir jemand sagen, wie es geht?

user3448167
quelle

Antworten:

12

Auswahl der Werkzeuge

Die hier vorgestellte Methode basiert auf dem Android-Quellcode von CyanogenMod.

Während Googles AOSP nur das Tool zum Erstellen der boot.imgDatei bietet, fügt CyanogenMod das unpackbootimgTool hinzu, mit dem Sie sie entpacken können. Dieses Tool scheint in keiner Weise speziell für CyanogenMod entwickelt worden zu sein, so dass die meisten Chancen bestehen, dass es auch für andere ROMs funktioniert.

Es gibt jedoch eine relativ große Anzahl von 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 einige Beispiele, die ich nicht persönlich getestet habe und daher nicht empfehlen kann. Ich präsentiere sie nur zu Referenzzwecken:

  • Einige sind Open Source oder Script-basiert:

    • Die Android-Küche 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 gegabelt .
    • szym zielt auf die Einfachheit ab, indem dem Toolset Shell-Script-Wrapper hinzugefügt werden, um das vollständige Entpacken und erneute Packen einfacher zu gestalten.
    • osm0sis schlägt eine Reihe von CyanogenMod-Tools vor , die gemäß der Projektbeschreibung "gegabelt und aktualisiert" wurden . Dieses Projekt scheint in der Tat noch aufrecht zu erhalten, was in diesem Bereich nicht sehr verbreitet ist, aber der tatsächliche Vorteil gegenüber den Originalwerkzeugen von CyanogenMod bleibt mir unklar.
  • Einige sind freie proprietäre Closed-Source-Binärdateien:

    • Kuismasunmkbootimg erscheint ziemlich oft in Hilfeforen und scheint eine gute Arbeit zu leisten, wenn es darum geht, mit ungewöhnlichen Fällen umzugehen, indem er eine "lesbare" englische Empfehlung ausgibt, wenn Änderungen im mkbootimgQuellcode erforderlich sind, und die genaue Befehlszeile anzeigt, die für die Neuerstellung des Abbilds verwendet werden soll.
    • Xiaolu'smkbootimg_tools scheint auch ziemlich oft erwähnt zu werden und erlaubt das Entpacken boot.imgund Umpacken der Gerätebaumdatei dt.img. Lassen Sie sich nicht von der Tatsache täuschen, dass es auf GitHub gehostet wird: Es handelt sich um eine proprietäre Closed-Source-Binärdatei, und es sind nur kompilierte Binärdateien in ihrem Repository verfügbar (eigentlich wundere ich mich sogar über das genaue Interesse, ein Quellcode-Repository zum Speichern zu verwenden binäre Blobs, aber andere Leute, andere Geister ...).
    • CNexus im XDA-Forum bietet ein Archiv mit einer Auswahl an Werkzeugen.
    • Diese Antwort in Unix.SE empfiehlt einige Tools aus dem anscheinend nicht mehr existierenden Android Serial Port-Projekt. Die Dateinamen veranlassen mich jedoch zu der Annahme, dass dies alte vorgefertigte Versionen der CyanogenMod-Tools sein sollten (da das Projekt geschlossen wird, gibt es weder Dokumentation noch Unterstützung).

Alle diese Tools (und andere, die Sie mit einer Suchmaschine finden können) sollten auf die gleiche Weise funktionieren, aber einige funktionieren möglicherweise besser als andere, wenn es darum geht, bestimmte Randbedingungen zu lösen, denen Sie mit Ihrem eigenen Gerät gegenüberstehen. 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 mit den Tools von CyanogenMod zu kombinieren.

Einige Hersteller stellen ROMs her, die mehr oder weniger weit vom AOSP-Standard entfernt sind (ungewöhnliche Adressen, Header, Dateiformate usw.). Wenn das nachstehende Standardverfahren nicht funktioniert, kann möglicherweise eine dieser alternativen Software den Trick ausführen. Andernfalls müssen Sie nach Problemen suchen, die für Ihr Gerät spezifisch sind: Einige benötigen anscheinend ein spezifisches Verfahren oder sogar spezielle Tools (stellen Sie diese Frage beispielsweise in Bezug auf MediaTek-Geräte).

Installation der Werkzeuge

Das Kompilieren des CyanogenMod-Toolset zum boot.imgPacken und Entpacken ist ganz einfach.

  • Wenn Sie bereits den vollständigen Android-Quellcodebaum installiert haben (Sie können meine andere Antwort überprüfen , um weitere Informationen zu diesem system/core/mkbootimg/Thema zu erhalten), wechseln Sie in das Verzeichnis (zur Erinnerung: Der AOSP-Quellcode von Google bietet nur das Tool zum Erstellen der boot.imgDatei, nicht das Tool zum Erstellen der Datei Auspackwerkzeug zur Verfügung stellen),
  • Wenn Sie dies nicht für einen anderen Zweck benötigen, ist es einfacher und schneller, 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 im richtigen Verzeichnis sind, 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 das C mkbootimgdurch eine Python-Version ersetzt . In zukünftigen Versionen ist für diesen Befehl möglicherweise keine Kompilierung mehr erforderlich.

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 stellt sie möglicherweise in einem einzelnen oder separaten Paket zur Verfügung, in der Regel werden sie jedoch 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 Datei boot.img entweder aus der ROM-ZIP-Datei oder direkt vom Gerät:

  • Aus der Standard-ROM-ZIP-Datei: Einige Anwendungen wie SuperSU können die Datei boot.img direkt auf dem Gerät ändern. Wenn Sie sie durch die Standarddatei ersetzen, können solche Anwendungen nicht mehr funktionieren.
  • Direkt vom Gerät: Einige Personen melden ein Lesefehler, der zu einer Beschädigung führt 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 hochwertige Kabel verwendet werden, die das Telefon direkt mit dem Computer verbinden. Sie müssen ADB auch im Root-Modus ausführen können (je nach verwendetem ROM kann dies trivial sein oder nicht).

Die erste Methode liegt auf der Hand: 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.imgder Inhalt abgerufen werden kann. Ich kenne zwei Methoden dafür:

  • ls /dev/block/platform/*/by-name/(wo *Abdeckungen noch ein weiterer gerätespezifische Ordnernamen, die Chancen sind , ist es das einzige Verzeichnis unten platform/), der genaue Name zu suchen ist auch plattformabhängig , sondern macht üblichen Sinn (einige Beispiele: boot, LNX(Abkürzung für „Linux“)). Die Dateien in diesem Verzeichnis sind eigentlich symbolische Links, und einige Benutzer müssen manuell zum Ziel wechseln. Ich empfehle jedoch, den übergeordneten, namensbasierten Pfad beizubehalten, der zwar länger ist, aber weniger fehleranfällig bleibt. So werden Sie mit einem Pfad wie enden /dev/block/platform/sdhci-tegra.3/by-name/LNX.
  • Bei einigen (älteren?) Geräten konnte das richtige Gerät durch Untersuchen der Ausgabe von ermittelt werden cat /proc/mtd. Wenn Sie das mtd2mit dem "boot"Etikett verknüpfte Gerät sehen , verwenden Sie den Pfad /dev/mtd2.

Jetzt:

  • Über das Entwicklermenü des Telefons:
    • Aktivieren Sie das Debuggen auf Ihrem Telefon,
    • Root-Zugriff auf ADB zulassen (dieser Schritt gilt für Telefone, auf denen CynogenMod ausgeführt wird. Für andere Geräte ist möglicherweise eine komplexere Prozedur erforderlich.)
  • Verbinden Sie es mit Ihrem Computer (und von dort mit dem VM-Gast, wenn Sie Android-Tools von einer virtuellen Maschine aus ausführen).

Wenn dies noch nicht geschehen ist, empfehle ich, den ADB-Server auf der Computerseite manuell zu starten. Auf diese Weise können Sie den RSA-Schlüssel auf der Geräteseite direkt überprüfen, ohne das Verhalten der folgenden ADB-Befehle zu beeinträchtigen:

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 sowie die Namen sind 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 ist als die Originaldatei boot.img, die mit der ZIP-Datei für das Standard-ROM geliefert wird. Der Inhalt selbst bleibt ähnlich.

Trennen Sie nach Abschluss der Übertragung das Telefon vom Computer und vergessen Sie nicht, sowohl das Debugging als auch den Root-Zugriff im Entwicklermenü zu deaktivieren.

Entpacken Sie die boot.imgOriginaldatei

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

unpackbootimg -i ./boot.img

Dadurch werden mehrere wichtige Informationen ausgegeben, damit Sie einen neuen boot.imgmit der richtigen Struktur in Bezug auf den Bestand erstellen können boot.img. Beeilen Sie sich jedoch nicht auf Ihrem Notizblock, da CyanogenMods upackbootimgdieselben 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 optionale Bootloader der zweiten Stufe, der auf Endbenutzertelefonen nur selten verwendet wird. Wenn diese Datei leer ist (der häufigste Fall), ruft der Bootloader des Telefons den Linux-Kernel direkt 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 hängt vom verwendeten Komprimierungsalgorithmus ab.
  • *-dt: Der Gerätebaum, der gefüllt wird /dev.
  • Der Rest sind kleine Dateien, die jeweils einen der in der unpackbootimgAusgabe angezeigten Werte speichern . Diese Werte definieren den Befehlszeilenparameter, der an den Linux-Kernel übergeben wird, und die Adressen, an denen der Bootloader jedes Objekt beim Booten laden muss.

Meist wird das entpackt boot.img, um den Inhalt des Stammverzeichnisses des Telefons bearbeiten zu können. Wie oben dargestellt, wird dieser Inhalt in der Datei *-ramdisk.gzoder *-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 nun die gewünschten Änderungen vornehmen, bevor Sie fortfahren. Es kann sich jedoch lohnen, den vollständigen Vorgang des Auspackens, erneuten Packens und Bootens einmal ohne Änderungen durchzuführen, um sicherzustellen, dass Ihre Tools wie erwartet funktionieren. Andernfalls können Sie im Falle eines Problems nicht sicher sein, ob die Ursache Ihre Änderung oder eine Inkompatibilität ist (siehe meine Bemerkungen zu einigen Herstellern, die nicht standardmäßige Verfahren oder Werkzeuge benötigen).

Neu erstellen, um die neue new-boot.imgDatei zu erhalten

Der CyanogenMod-ROM- Erstellungsprozess basiert auf einem internen Tool, mkbootfsum die boot.imgDatei zu erstellen (dies geschieht in build / tools / releasetools / common.py ). Die Schritte zum Erstellen dieses Tools erscheinen mir jedoch unnötig komplex, während die Verwendung des bereitgestellten Systems cpiogenauso gut zu funktionieren scheint. Der Hauptunterschied zwischen den beiden besteht meines mkbootfsErachtens nach nach einer (sehr) schnellen Überprüfung des Quellcodes darin, dass letzterer einige Sicherheitsmaßnahmen anwendet, indem er keine gepunkteten Dateien und das /rootVerzeichnis im resultierenden Archiv einschließt, während das cpiounten beschriebene Verfahren angewendet wird wird nur blind den gesamten ausgewählten Verzeichnisbaum in das Archiv stellen.

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

Beginnen Sie mit der Erstellung der neuen RAM-Disk. ramdiskGeben Sie im oben 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 erstellen müssen:

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

Das Ziel hierbei ist es, eine neue RAM-Disk-Datei mit Eigenschaften zu erstellen, die den ursprünglichen Eigenschaften möglichst nahe kommen (z. B. scheint das Festlegen des Eigentümers in den in Foren und Blogs freigegebenen Verfahren häufig zu fehlen, dies war jedoch auf meinem Gerät erforderlich).

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

cd ..

Wie oben zu sehen, unpackbootimggeneriert der Befehl CyanogenMod eine Datei, die mit jedem Parameter übereinstimmt, der von erwartet wird mkbootimg. Aus diesem Grund müssen Sie nur a ausgeben mkbootimg -h, um eine Liste aller Parameter zu erhalten, und dann jeden einzelnen 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. Ein Beispiel für einen resultierenden Befehl finden Sie unten:

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

Nur zwei Parameter werden hier nicht eingestellt:

  • --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 Wert erwartet keinen Wert, sondern gibt nur eine eindeutige Kennung aus, nachdem das Bild erstellt wurde (Kombination aus Zeitstempel und Prüfsumme).

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

  • Starten Sie das Gerät im Fastboot-Modus (auch als Bootloader-Modus bekannt).
  • 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 das Telefon nur neu starten, um es wieder in Betrieb zu nehmen. Ersetzen Sie den ./new-boot.imgDateinamen durch Ihren eigenen.):

    sudo fastboot boot ./new-boot.img
    
  • Wenn das Telefon mit dem neuen Startabbild erfolgreich funktioniert, kehren Sie in den Schnellstartmodus zurück und flashen Sie es permanent:

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

Fazit

Diese Prozedur mag zunächst entmutigend erscheinen, aber sobald Sie sie erhalten, werden Sie feststellen, dass dies tatsächlich nicht der Fall ist.

Der "entmutigende" 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 ungewöhnlichen Umgebung reichen können.

Sie müssen lediglich die Haltung Ihres Geräts bestimmen und dann die wenigen Befehle angeben, die für Ihren Fall geeignet sind. Sobald Sie sie erhalten haben, können Sie sich an sie halten und sie sogar leicht skripten, wenn Sie sie häufig benötigen.

Ich habe mich manchmal freiwillig mit Details auf relativ niedriger Ebene befasst, da Sie so leichter Probleme beheben können. Würden Sie ein "einfacheres" undurchsichtiges Hilfsprogramm verwenden, um Ihre neue boot.imgDatei zu erstellen und zu flashen und zu sehen, dass Ihr Gerät nicht damit starten kann, wäre es schwieriger für Sie, festzustellen, welcher Schritt schief gelaufen ist. Hier können Sie bei jedem Schritt die Daten, die Sie bearbeiten, mit den Daten aus der Originaldatei boot.imgoder den auf dem Telefon angezeigten Daten vergleichen oder beispielsweise versuchen, die boot.imgDatei entweder mit der Originaldatei oder der neu erstellten Datei neu zu erstellen RAM-Disk-Datei, um zu überprüfen, ob dies einen Unterschied macht (dies ermöglicht es Ihnen, festzustellen, ob das Problem von der boot.imgoder der Prozedur zur Erzeugung der RAM-Disk-Datei herrührt).

WhiteWinterWolf
quelle
2

Verwenden Sie die Android-Küche. Es besteht die Möglichkeit, die Datei boot.img unter zu entpacken / neu zu packen Advanced options.

Aureljared
quelle
Leider hat der ursprüngliche Autor offiziell aufgehört, die Android-Küche zu warten: " Dieses Projekt ist ab 2013 eingestellt, da ich mit der Anzahl der zu unterstützenden Geräte, der Nachfrage, dem schlechten Gesundheitszustand und den ständigen Hilfebedürfnissen überfordert bin ." Es wurden zwar einige Gabeln erstellt (ich gebe in meiner Antwort einige Links an), aber ich weiß nicht, wie stark sie unterstützt werden (ich habe keine offensichtliche Möglichkeit gefunden, Probleme anzusprechen oder eine Weiterentwicklung anzufordern).
WhiteWinterWolf