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.
boot.img
Datei sein könnte und ich nicht weiß, wie ich sie extrahieren oder bearbeiten soll ...Kann mir jemand sagen wie man das macht?
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 unpackbootimg
Tool 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.img
Datei, die alle mehr oder weniger gleich funktionieren.
Grundsätzlich extrahiert ein solches Entpack-Tool den Inhalt der boot.img
Datei und zeigt eine Reihe von Parametern an, die Sie an das Google- mkbootimg
Tool ü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:
Einige sind kostenlose, proprietäre Closed-Source-Binärdateien:
unmkbootimg
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 mkbootimg
Quellcode erforderlich sind, und die genaue Befehlszeile anzuzeigen, die zum Neuaufbau des Bildes verwendet werden soll.mkbootimg_tools
scheint auch ziemlich oft erwähnt zu werden und ermöglicht das Entpacken und Neupacken boot.img
und 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...).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).
Das Kompilieren des CyanogenMod-Toolsets zum boot.img
Packen 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.img
Datei, 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 mkbootimg
durch 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:
sudo apt-get install android-tools-{adb,adbd,fastboot}
sudo yum install android-tools
sudo zypper install android-tools
boot.img
DateiExtrahieren Sie die boot.img entweder aus der ROM-ZIP-Datei oder direkt vom Gerät:
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.img
Datei 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.img
die 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
.cat /proc/mtd
. Wenn Sie das mtd2
dem "boot"
Label zugeordnete Gerät sehen, verwenden Sie den Pfad /dev/mtd2
.Jetzt:
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.img
Datei 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.img
Datei 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.img
Entpacken Sie die OriginaldateiEntpacken Sie die boot.img
Datei selbst mit dem zuvor kompilierten Befehl:
unpackbootimg -i ./boot.img
Dadurch werden mehrere wichtige Informationen ausgegeben, damit Sie eine neue boot.img
mit der richtigen Struktur in Bezug auf den Bestand erstellen können boot.img
. Beeilen Sie sich jedoch nicht mit Ihrem Notizblock, da CyanogenMod die upackbootimg
gleichen 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.gz
oder *-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
.unpackbootimg
Ausgabe 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.gz
or *-ramdisk.lz4
gespeichert 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).
new-boot.img
Datei zu erhaltenDer CyanogenMod-ROM-Erstellungsprozess stützt sich auf ein internes Tool, mkbootfs
, um die boot.img
Datei 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 cpio
genauso gut zu funktionieren scheint. Der Hauptunterschied zwischen den beiden mkbootfs
scheint 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 /root
Verzeichnis 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 ramdisk
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 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.img
Datei selbst zu generieren.
cd ..
Wie oben zu sehen ist, generiert der Befehl von CyanogenMod unpackbootimg
eine 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).new-boot.img
Datei auf das GerätStarten 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.img
Dateinamen 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
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.img
Datei 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.img
oder den Daten, die Sie auf dem Telefon sehen, vergleichen oder beispielsweise versuchen, die boot.img
Datei 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.img
oder der RAM-Disk-Dateigenerierung herrührt).
Verwenden Sie die Android-Küche. Dort gibt es unter Advanced options
.
Atheros
pevik