From d3858b81e24a2a6d0f9bdc3559fd8de45e61dc48 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Thu, 9 Aug 2018 14:52:44 +0800 Subject: [PATCH] Add new boot service: boot-complete --- native/jni/core/bootstages.c | 20 ++++++++--------- native/jni/core/daemon.c | 4 ++++ native/jni/core/magisk.c | 6 ++++- native/jni/include/daemon.h | 2 ++ native/jni/include/magiskrc.h | 42 ++++++++++++++++++++++------------- 5 files changed, 46 insertions(+), 28 deletions(-) diff --git a/native/jni/core/bootstages.c b/native/jni/core/bootstages.c index fe8decff2..dc854d62a 100644 --- a/native/jni/core/bootstages.c +++ b/native/jni/core/bootstages.c @@ -872,15 +872,13 @@ core_only: // All boot stage done, cleanup vec_deep_destroy(&module_list); - - // Wait for boot complete, and clear boot count - while (1) { - char *prop = getprop("sys.boot_completed"); - if (prop != NULL && strcmp(prop, "1") == 0) { - free(prop); - unlink(BOOTCOUNT); - break; - } - sleep(2); - } +} + +void boot_complete(int client) { + LOGI("** boot_complete triggered\n"); + // ack + write_int(client, 0); + close(client); + + unlink(BOOTCOUNT); } diff --git a/native/jni/core/daemon.c b/native/jni/core/daemon.c index f70a95e94..1460af1b6 100644 --- a/native/jni/core/daemon.c +++ b/native/jni/core/daemon.c @@ -40,6 +40,7 @@ static void *request_handler(void *args) { case LS_HIDELIST: case POST_FS_DATA: case LATE_START: + case BOOT_COMPLETE: if (credential.uid != 0) { write_int(client, ROOT_REQUIRED); close(client); @@ -82,6 +83,9 @@ static void *request_handler(void *args) { case LATE_START: late_start(client); break; + case BOOT_COMPLETE: + boot_complete(client); + break; case HANDSHAKE: /* Do NOT close the client, make it hold */ break; diff --git a/native/jni/core/magisk.c b/native/jni/core/magisk.c index a4b802639..24956bb7f 100644 --- a/native/jni/core/magisk.c +++ b/native/jni/core/magisk.c @@ -50,7 +50,7 @@ static void usage() { " --clone-attr SRC DEST clone permission, owner, and selinux context\n" "\n" "Supported init triggers:\n" - " startup, post-fs-data, service\n" + " startup, post-fs-data, service, boot-complete\n" "\n" "Supported applets:\n"); @@ -111,6 +111,10 @@ int magisk_main(int argc, char *argv[]) { int fd = connect_daemon(); write_int(fd, LATE_START); return read_int(fd); + } else if (strcmp(argv[1], "--boot-complete") == 0) { + int fd = connect_daemon(); + write_int(fd, BOOT_COMPLETE); + return read_int(fd); } // Applets diff --git a/native/jni/include/daemon.h b/native/jni/include/daemon.h index b71406018..d93f5f8ad 100644 --- a/native/jni/include/daemon.h +++ b/native/jni/include/daemon.h @@ -19,6 +19,7 @@ enum { CHECK_VERSION_CODE, POST_FS_DATA, LATE_START, + BOOT_COMPLETE, LAUNCH_MAGISKHIDE, STOP_MAGISKHIDE, ADD_HIDELIST, @@ -73,6 +74,7 @@ void write_string(int fd, const char* val); void startup(); void post_fs_data(int client); void late_start(int client); +void boot_complete(int client); /************** * MagiskHide * diff --git a/native/jni/include/magiskrc.h b/native/jni/include/magiskrc.h index 7ef6e5cdc..ac60bc348 100644 --- a/native/jni/include/magiskrc.h +++ b/native/jni/include/magiskrc.h @@ -6,31 +6,41 @@ const char magiskrc[] = // Triggers "on post-fs-data\n" -" start logd\n" -" load_persist_props\n" -" rm "UNBLOCKFILE"\n" -" start magisk_startup\n" -" wait "UNBLOCKFILE" 10\n" -" rm "UNBLOCKFILE"\n" +" start logd\n" +" load_persist_props\n" +" rm "UNBLOCKFILE"\n" +" start magisk_startup\n" +" wait "UNBLOCKFILE" 10\n" +" rm "UNBLOCKFILE"\n" +"\n" + +"on property:sys.boot_completed=1\n" +" start magisk_bc\n" "\n" // Services "service magisk_daemon /sbin/magisk --daemon\n" -" user root\n" -" seclabel u:r:"SEPOL_PROC_DOMAIN":s0\n" -" oneshot\n" +" user root\n" +" seclabel u:r:"SEPOL_PROC_DOMAIN":s0\n" +" oneshot\n" "\n" "service magisk_startup /sbin/magisk --startup\n" -" user root\n" -" seclabel u:r:"SEPOL_PROC_DOMAIN":s0\n" -" oneshot\n" +" user root\n" +" seclabel u:r:"SEPOL_PROC_DOMAIN":s0\n" +" oneshot\n" "\n" "service magisk_service /sbin/magisk --service\n" -" class late_start\n" -" user root\n" -" seclabel u:r:"SEPOL_PROC_DOMAIN":s0\n" -" oneshot\n" +" class late_start\n" +" user root\n" +" seclabel u:r:"SEPOL_PROC_DOMAIN":s0\n" +" oneshot\n" +"\n" + +"service magisk_bc /sbin/magisk --boot-complete\n" +" user root\n" +" seclabel u:r:"SEPOL_PROC_DOMAIN":s0\n" +" oneshot\n" ;