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.img
Datei bietet, fügt CyanogenMod das unpackbootimg
Tool 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.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 einige Beispiele, die ich nicht persönlich getestet habe und daher nicht empfehlen kann. Ich präsentiere sie nur zu Referenzzwecken:
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.img
Packen 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.img
Datei, 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 mkbootimg
durch 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.img
Datei
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.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
der 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 mtd2
mit 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.img
Datei 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.img
Datei 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.img
Originaldatei
Entpacken Sie die boot.img
Datei selbst mit dem zuvor kompilierten Befehl:
unpackbootimg -i ./boot.img
Dadurch werden mehrere wichtige Informationen ausgegeben, damit Sie einen neuen boot.img
mit der richtigen Struktur in Bezug auf den Bestand erstellen können boot.img
. Beeilen Sie sich jedoch nicht auf Ihrem Notizblock, da CyanogenMods upackbootimg
dieselben 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.gz
oder *-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
unpackbootimg
Ausgabe 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.gz
oder *-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 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.img
Datei zu erhalten
Der CyanogenMod-ROM- Erstellungsprozess basiert auf einem internen 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 unnötig komplex, während die Verwendung des bereitgestellten Systems cpio
genauso gut zu funktionieren scheint. Der Hauptunterschied zwischen den beiden besteht meines mkbootfs
Erachtens nach nach einer (sehr) schnellen Überprüfung des Quellcodes darin, dass letzterer einige Sicherheitsmaßnahmen anwendet, indem er keine gepunkteten Dateien und das /root
Verzeichnis im resultierenden Archiv einschließt, während das cpio
unten 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. ramdisk
Geben 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.img
Datei selbst zu generieren .
cd ..
Wie oben zu sehen, unpackbootimg
generiert 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.img
Datei 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.img
Dateinamen 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.img
Datei 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.img
oder den auf dem Telefon angezeigten Daten vergleichen oder beispielsweise versuchen, die boot.img
Datei 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.img
oder der Prozedur zur Erzeugung der RAM-Disk-Datei herrührt).