Recovery
Der -Modus ist ein spezieller Modus des Android
-Systems, der es dem Benutzer ermöglicht, einige Vorgänge auszuführen, die im normalen Modus nicht ausgeführt werden können, wie zum Beispiel:
- System
Android
installieren oder aktualisieren - zurücksetzen
- Cache leeren
- SD-Karte formatieren
- Flash-ROMs von Drittanbietern
Recovery
Der -Modus besteht aus einem Kernel mit RAM
Festplatten auf einem anderen System als dem Hauptsystem Auf der Partition. Linux
Android
Wenn Sie weitere Funktionen wünschen, wie etwa das Flashen von Drittanbietern ROM
, können Sie Drittanbieter flashen Recovery
. Drittanbieter Recovery
verfügen normalerweise über mehr Funktionen als native Recovery
, können aber auch instabil sein.
Vorwort
Nachdem wir die Kompilierung des Drittanbietersystems abgeschlossen haben, müssen wir häufig einen Drittanbieter verwenden Recovery
, um das System zu flashen.
Gleichzeitig müssen wir, da die integrierten Recovery
Funktionen der meisten Systeme relativ einfach sind, oft auf Drittanbieter Recovery
zurückgreifen unsere Geräte. , um den nächsten Flash des neuen Systems zu erleichtern.
Gibt es also eine Möglichkeit, Dritte Recovery
direkt in unser kompiliertes System zu integrieren?
Nachdem ich viele Online-Informationen konsultiert hatte, stellte ich fest, dass die TWRP
alte Version eine Zeit lang existierte und zusammen mit der Omini
System und direkt in das System integriert. Aber für die aktuellen neuen Systeme und neuen Geräte scheint dies nicht machbar zu sein, da ich die ursprüngliche Methode nicht verwenden kann, um es beim Kompilieren direkt in mein System-Image und Flash-Paket zu integrieren.
Gleichzeitig habe ich versucht, die Zusammenstellung und Verwendung von TWRP
s BrüdernOrangeFox
zu studieren. Zuerst verwies ich auf die offizielle Dokumentation Building OrangeFox hat eine Kopie kompiliertRecovery
und temporäres Startup< verwendet a i=7> und In das Flash-Paket einpinseln und verfestigenEs werden zwei Methoden verwendetOrangeFox Recovery
.
Nachdem ich das Verfestigungsskript von OrangeFox Recovery
studiert und mit dem Kompilierungs- und Verpackungsprozess von Android kombiniert hatte, fand ich einen neuen Weg, die Funktion zum Anpassen des Flash-Pakets zu implementieren Recovery
.
Umsetzungsideen
Beim Android
Systemkompilierungsprozess wird normalerweise jeder Teil des Systems zuerst in Images kompiliert. Anschließend werden diese Images zusammengestellt und in ein vollständiges Flash-Paket gepackt. Unser Recovery
ist normalerweise eine separate Partition oder in die Boot
-Partition integriert, sodass wir nur diesen Teil ersetzen müssen.
Dieser Abschnitt implementiert nur die Anpassung von Recovery
während der Systemkompilierung in der Boot
-Partition.
Aber normalerweiseBoot.img
enthält nicht nur Recovery
, sondern auch einige andere Inhalte, die für den Systemstart und -start verwendet werden, daher müssen wir die Paketänderung beheben .
auspacken, einpacken
Zuerst müssen wir das Verfestigungsskript von OrangeFox Recovery
überprüfen, wobei unser entsprechendes ist und der heilende Teil des Codes lautet wie folgt: Bild, das verwendete Entpack- und Verpackungstool ist Recovery
recovery.img
Recovery
MagiskBoot
# a/META-INF/com/google/android/update-binary
magiskboot unpack -n recovery.img
# deal with ramdisk cpio
if [ ! -f "ramdisk.cpio" ]; then
abort "- Error extracting the OrangeFox ramdisk. Quitting!"
fi
cp -f ramdisk.cpio ramdisk-ofrp.cpio
rm -f ramdisk.cpio
rm -f kernel dtb kernel_dtb
# deal with both slots
for slot in _a _b; do
ui_print "- Running boot image patcher on slot $name$slot..."
# dump the partition and unpack
dd bs=1048576 if=$target$slot of=boot.img
magiskboot unpack -h -n boot.img
# 其他步骤
cp -f ramdisk-ofrp.cpio ramdisk.cpio
magiskboot repack -n boot.img
blockdev --setrw $target$slot
cat new-boot.img /dev/zero > $target$slot 2>/dev/null || true
rm -f boot.img dtb kernel new-boot.img ramdisk.cpio header
magiskboot cleanup
done
Anhand dieses Codes können wir sehen, dass der Verfestigungsprozess von OrangeFox Recovery
wie folgt aussieht:
-
- Verwenden Sie
MagiskBoot
Allgemeine dritte SeiteRecovery
Auspacken, halten Sie einfachramdisk.cpio
Satz;
- Verwenden Sie
-
- Abruf der Systemübermittlung
boot.img
;
- Abruf der Systemübermittlung
-
- Entpacken Sie das extrahierte
boot.img
;
- Entpacken Sie das extrahierte
-
- Verwenden Sie einen Drittanbieter
Recovery
, um dieramdisk.cpio
-Datei zu entpacken und zu extrahieren und dieboot.img
entpackte zu ersetzen < a i=4> Datei;ramdisk.cpio
- Verwenden Sie einen Drittanbieter
-
- Neu verpacken
boot.img
Spiegeln;
- Neu verpacken
-
- Zurück zur ursprünglichen Partition schreiben
Spezifische Operationen
Verpackungsprozess ändern
Wenn die Analogie des Verfestigungsschritts zu unserem Systemkompilierungsprozess hinzugefügt wird und der Ersatz im vorherigen Schritt des Zusammenstellens der kompilierten Bilder zum Zusammenstellen des Flash-Pakets implementiert wird, kann eine Anpassung erreicht werden < eine i=1> Funktion. Recovery
Durch einen Blick auf den LineageOS
-Quellcode habe ich schließlich einen Teil des Codes in LineageOS
gefunden, der das Bild zum Flash-Paket hinzufügt, Datei:boot.img
Der relevante Code befindet sich in der build/make/tools/releasetools/add_img_to_target_files.py
boot_image = None
if has_boot:
banner("boot")
boot_images = OPTIONS.info_dict.get("boot_images")
if boot_images is None:
boot_images = "boot.img"
for index, b in enumerate(boot_images.split()):
boot_image = common.GetBootableImage("IMAGES/" + b, b, OPTIONS.input_tmp, "BOOT")
if boot_image:
boot_image_path = os.path.join(OPTIONS.input_tmp, "IMAGES", b)
if index == 0:
partitions['boot'] = boot_image_path
if not os.path.exists(boot_image_path):
boot_image.WriteToDir(OPTIONS.input_tmp)
if output_zip:
boot_image.AddToZip(output_zip)
Sie können sehen, dass es in diesem Absatz darum geht, boot.img
in das Flash-Paket zu packen. Tatsächlich ähnelt es in gewisser Weise dem Heilungsskript von OrangeFox Recovery
. wird die beiden Partitionen a
und b
durchqueren und verwandte Operationen ausführen, also imitieren wir den Verfestigungsprozess von OrangeFox Recovery
und schreiben Folgendes Funktion, wobei die Eingabe Der Parameter ist der Pfad von boot.img
, der Code lautet wie folgt:
def useCustomRecovery(boot_image_path):
magiskboot = os.getenv('CUSTOM_MAGISKBOOT')
recovery = os.getenv('CUSTOM_TWRP')
if not magiskboot or not recovery: return
origin_pwd = os.getcwd()
new_pwd = os.path.join(os.getcwd(), "tmp")
common.RunAndCheckOutput(["mkdir", "-p", new_pwd])
os.chdir(new_pwd)
common.RunAndCheckOutput([magiskboot, "unpack", "-n", recovery])
if not os.path.exists("ramdisk.cpio"):
common.RunAndCheckOutput(["rm", "-rf", new_pwd])
os.chdir(origin_pwd)
return
common.RunAndCheckOutput(["cp", "-f", "ramdisk.cpio", "ramdisk-ofrp.cpio"])
common.RunAndCheckOutput(["rm", "-f", "ramdisk.cpio"])
common.RunAndCheckOutput(["rm", "-f", "kernel", "dtb", "kernel_dtb"])
common.RunAndCheckOutput([magiskboot, "unpack", "-h", "-n", boot_image_path])
common.RunAndCheckOutput(["cp", "-f", "ramdisk-ofrp.cpio", "ramdisk.cpio"])
common.RunAndCheckOutput([magiskboot, "repack", "-n", boot_image_path])
common.RunAndCheckOutput(["mv", "-f", "new-boot.img", boot_image_path])
common.RunAndCheckOutput(["rm", "-rf", new_pwd])
common.RunAndCheckOutput([magiskboot, "cleanup"])
os.chdir(origin_pwd)
Dieser Teil ist derselbe wie der Verfestigungsvorgang von OrangeFox Recovery
, bei dem es sich um Auspack-, Ersetzungs- und Neupackvorgänge handelt. Mit dieser Funktion ändern wir direkt den ursprünglichen Quellcode:
boot_image = None
if has_boot:
banner("boot")
boot_images = OPTIONS.info_dict.get("boot_images")
if boot_images is None:
boot_images = "boot.img"
for index, b in enumerate(boot_images.split()):
boot_image = common.GetBootableImage("IMAGES/" + b, b, OPTIONS.input_tmp, "BOOT")
if boot_image:
boot_image_path = os.path.join(OPTIONS.input_tmp, "IMAGES", b)
if index == 0:
partitions['boot'] = boot_image_path
if not os.path.exists(boot_image_path):
boot_image.WriteToDir(OPTIONS.input_tmp)
if output_zip:
boot_image.AddToZip(output_zip)
useCustomRecovery(boot_image_path)
Vergessen Sie nicht, die Funktion gerade zu dieser Datei hinzuzufügen. Gleichzeitig müssen wir beachten, dass wir in der Funktion useCustomRecovery
zwei Umgebungsvariablen lesen müssen:< /span>
CUSTOM_MAGISKBOOT
: Absoluter Pfad zumMagiskBoot
Tool zum Entpacken;CUSTOM_TWRP
: Der Dritte, den wir einbinden müssenRecovery
Umgebungsvariablen öffnen
Mit den folgenden Befehlen können wir Umgebungsvariablen festlegen:
export CUSTOM_MAGISKBOOT=<指向您使用的 MagiskBoot 工具的绝对路径>
export CUSTOM_TWRP=<指向您需要替换的 Recovery 镜像的绝对路径>
Nachdem die Einstellungen abgeschlossen hatte, kompilierten wir das System neu und stellten fest, dass es immer noch nicht in das System gepackt war. Dies liegt daran, dass das Lesen von Umgebungsvariablen während des Kompilierungsprozesses eingeschränkt ist. Nur bestimmte Umgebungsvariablen werden an den Kompilierungsprozess übergeben, daher müssen wir auch unsere eigenen CUSTOM_MAGISKBOOT
und < hinzufügen a i=2> wird zur Whitelist hinzugefügt. CUSTOM_TWRP
Der entsprechende Dateispeicherort, der geändert werden muss, befindet sich unter dem Pfad build/soong/ui/build/ninja.go
. Der geänderte Code lautet wie folgt:
func runNinjaForBuild(ctx Context, config Config) {
// 其它代码
if cmd.Environment.IsEnvTrue("ALLOW_NINJA_ENV") {
ctx.Println("Allowing all environment variables during ninja; incremental builds may be unsafe.")
} else {
cmd.Environment.Allow(append([]string{
/*
其它参数
*/
"PYTHONDONTWRITEBYTECODE",
"TMPDIR",
"USER",
// Custom TWRP
"CUSTOM_MAGISKBOOT",
"CUSTOM_TWRP",
// TODO: remove these carefully
// Options for the address sanitizer.
"ASAN_OPTIONS",
/*
其它参数
*/
}, config.BuildBrokenNinjaUsesEnvVars()...)...)
}
// 其它代码
}
Wir müssen nur CUSTOM_MAGISKBOOT
und CUSTOM_TWRP
zur Whitelist hinzufügen und dann die Kompilierung neu starten. Mit anderen Worten, Sie Der Kompilierungsprozess ist jetzt:
source build/envsetup.sh
export CUSTOM_MAGISKBOOT="<指向您使用的 MagiskBoot 工具的绝对路径>"
export CUSTOM_TWRP="<指向您需要替换的 Recovery 镜像的绝对路径>"
lunch lineage_[设备代号]-userdebug
croot
mka bacon
Git-Patch
Gleichzeitig habe ich einen praktischen Git
Patch zur einfachen Änderung erstellt. Sie können DogDayAndroid/Android-Builder< eingeben a i =3> Schauen Sie sich meinen Patch an.
Verweise
Haben Sie nach dem Studium dieses Artikels etwas gewonnen? Das Lernen hat kein Ende und Lernen ist wie Segeln gegen den Strom. Wenn Sie nicht vorankommen, werden Sie zurückfallen. Zusätzlich zu den oben genannten Inhalten wurden in diesem Artikel auch viele relevante Informationen zu fortgeschrittenen Android-Übungen zusammengestellt wird Ihnen, die hart arbeiten, kostenlos zur Verfügung gestellt. Ich hoffe, es kann Ihnen helfen!
Scannen Sie den Code, um ihn zu erhalten! Wesentliche fortgeschrittene Materialien für die Android-Entwicklung