From ee0cef06a68f79d569919295f5bc5ca3b2755bd1 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 22 Sep 2019 05:15:31 -0400 Subject: [PATCH] Add support for A-only 2SI --- native/jni/init/init.cpp | 4 +++- native/jni/init/init.h | 23 +++++++++++++++++------ native/jni/init/rootdir.cpp | 10 +++++++++- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/native/jni/init/init.cpp b/native/jni/init/init.cpp index 99799213d..78fe5e407 100644 --- a/native/jni/init/init.cpp +++ b/native/jni/init/init.cpp @@ -207,7 +207,7 @@ int main(int argc, char *argv[]) { if (run_test) { init = make_unique(argv, &cmd); } else if (cmd.force_normal_boot) { - init = make_unique(argv, &cmd); + init = make_unique(argv, &cmd); } else if (cmd.system_as_root) { if (access("/overlay", F_OK) == 0) /* Compatible mode */ init = make_unique(argv, &cmd); @@ -217,6 +217,8 @@ int main(int argc, char *argv[]) { decompress_ramdisk(); if (access("/sbin/recovery", F_OK) == 0) init = make_unique(argv, &cmd); + else if (access("/apex", F_OK) == 0) + init = make_unique(argv, &cmd); else init = make_unique(argv, &cmd); } diff --git a/native/jni/init/init.h b/native/jni/init/init.h index b405fb544..e8267e298 100644 --- a/native/jni/init/init.h +++ b/native/jni/init/init.h @@ -97,21 +97,32 @@ public: } }; -/* ******************* - * Logical Partitions - * *******************/ +/* ************* + * 2 Stage Init + * *************/ -class FirstStageInit : public BaseInit { +class ABFirstStageInit : public BaseInit { protected: void prepare(); public: - FirstStageInit(char *argv[], cmdline *cmd) : BaseInit(argv, cmd) {}; + ABFirstStageInit(char *argv[], cmdline *cmd) : BaseInit(argv, cmd) {}; void start() override { prepare(); exec_init("/system/bin/init"); } }; +class AFirstStageInit : public BaseInit { +protected: + void prepare(); +public: + AFirstStageInit(char *argv[], cmdline *cmd) : BaseInit(argv, cmd) {}; + void start() override { + prepare(); + exec_init(); + } +}; + class SecondStageInit : public SARCommon { protected: void early_mount() override; @@ -121,7 +132,7 @@ public: }; /* *********** - * Normal SAR + * Legacy SAR * ***********/ class SARInit : public SARCommon { diff --git a/native/jni/init/rootdir.cpp b/native/jni/init/rootdir.cpp index 001bfe077..fde714db8 100644 --- a/native/jni/init/rootdir.cpp +++ b/native/jni/init/rootdir.cpp @@ -386,7 +386,7 @@ void SARCommon::patch_rootdir() { #define FSR "/first_stage_ramdisk" -void FirstStageInit::prepare() { +void ABFirstStageInit::prepare() { // Find fstab DIR *dir = xopendir(FSR); if (!dir) @@ -448,6 +448,14 @@ void FirstStageInit::prepare() { rename("/overlay.d", FSR "/overlay.d"); } +void AFirstStageInit::prepare() { + // Move stuffs for next stage + xmkdir("/system", 0755); + xmkdir("/system/bin", 0755); + rename("/init", "/system/bin/init"); + rename("/.backup/init", "/init"); +} + #ifdef MAGISK_DEBUG static FILE *kmsg; static int vprintk(const char *fmt, va_list ap) {