diff --git a/app-core/src/main/java/com/topjohnwu/magisk/tasks/MagiskInstaller.java b/app-core/src/main/java/com/topjohnwu/magisk/tasks/MagiskInstaller.java index 3fc3878a4..c9ab50122 100644 --- a/app-core/src/main/java/com/topjohnwu/magisk/tasks/MagiskInstaller.java +++ b/app-core/src/main/java/com/topjohnwu/magisk/tasks/MagiskInstaller.java @@ -108,7 +108,7 @@ public abstract class MagiskInstaller { protected boolean extractZip() { String arch; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (Build.VERSION.SDK_INT >= 21) { List abis = Arrays.asList(Build.SUPPORTED_ABIS); arch = abis.contains("x86") ? "x86" : "arm"; } else { @@ -162,8 +162,6 @@ public abstract class MagiskInstaller { console.add("! Cannot unzip zip"); return false; } - Shell.sh(Utils.fmt("chmod -R 755 %s/*; %s/magiskinit -x magisk %s/magisk", - installDir, installDir, installDir)).exec(); return true; } @@ -213,14 +211,18 @@ public abstract class MagiskInstaller { return false; } - // Patch boot image - if (!Shell.sh(Utils.fmt("cd %s; KEEPFORCEENCRYPT=%b KEEPVERITY=%b " + + Shell.Job job = Shell.sh("cd " + installDir); + if (Build.VERSION.SDK_INT >= 21 && Build.SUPPORTED_64_BIT_ABIS.length != 0) { + job.add("mv -f magiskinit64 magiskinit 2>/dev/null"); + } else { + job.add("rm -f magiskinit64 2>/dev/null"); + } + if (!job.add(Utils.fmt("KEEPFORCEENCRYPT=%b KEEPVERITY=%b " + "sh update-binary sh boot_patch.sh %s", - installDir, Config.keepEnc, Config.keepVerity, srcBoot)) - .to(console, logs).exec().isSuccess()) + Config.keepEnc, Config.keepVerity, srcBoot)).to(console, logs).exec().isSuccess()) return false; - Shell.Job job = Shell.sh("mv bin/busybox busybox", + job = Shell.sh("mv bin/busybox busybox", "rm -rf magisk.apk bin boot.img update-binary", "cd /"); diff --git a/app-core/src/main/res/raw/utils.sh b/app-core/src/main/res/raw/utils.sh index ad888cd50..eb1544d60 100644 --- a/app-core/src/main/res/raw/utils.sh +++ b/app-core/src/main/res/raw/utils.sh @@ -14,6 +14,7 @@ fix_env() { ./busybox rm -f $MAGISKTMP/busybox/* $MAGISKTMP/mirror/bin/busybox --install -s $MAGISKTMP/busybox rm -f update-binary magisk.apk + chmod -R 755 . cd / } diff --git a/build.py b/build.py index c0c56bc8e..6b63809dc 100755 --- a/build.py +++ b/build.py @@ -53,6 +53,7 @@ else: cpu_count = multiprocessing.cpu_count() gradlew = os.path.join('.', 'gradlew.bat' if os.name == 'nt' else 'gradlew') archs = ['armeabi-v7a', 'x86'] +arch64 = ['arm64-v8a', 'x86_64'] keystore = 'release-key.jks' config = {} @@ -99,9 +100,9 @@ def zip_with_msg(zip_file, source, target): def collect_binary(): - for arch in archs: + for arch in archs + arch64: mkdir_p(os.path.join('native', 'out', arch)) - for bin in ['magisk', 'magiskinit', 'magiskboot', 'busybox']: + for bin in ['magisk', 'magiskinit', 'magiskinit64', 'magiskboot', 'busybox']: source = os.path.join('native', 'libs', arch, bin) target = os.path.join('native', 'out', arch, bin) mv(source, target) @@ -174,67 +175,60 @@ def gen_update_binary(): return update_bin +def run_ndk_build(flags): + proc = system(f'{ndk_build} -C native {base_flags} {flags} -j{cpu_count}') + if proc.returncode != 0: + error('Build binary failed!') + collect_binary() + + def build_binary(args): support_targets = {'magisk', 'magiskinit', 'magiskboot', 'busybox'} if args.target: args.target = set(args.target) & support_targets + if not args.target: + return else: # If nothing specified, build everything args.target = support_targets - # Unsure why this is separate - if not args.target: - return - header('* Building binaries: ' + ' '.join(args.target)) os.utime(os.path.join('native', 'jni', 'include', 'flags.h')) # Basic flags + global base_flags base_flags = f'MAGISK_VERSION={config["version"]} MAGISK_VER_CODE={config["versionCode"]}' if not args.release: base_flags += ' MAGISK_DEBUG=1' - # Magisk is special case as it is a dependency of magiskinit if 'magisk' in args.target: - proc = system(f'{ndk_build} -C native {base_flags} B_MAGISK=1 -j{cpu_count}') - if proc.returncode != 0: - error('Build Magisk binary failed!') - collect_binary() + run_ndk_build('B_MAGISK=1') # Dump the binary to header for arch in archs: bin_file = os.path.join('native', 'out', arch, 'magisk') with open(os.path.join('native', 'out', arch, 'binaries_arch.h'), 'w') as out: with open(bin_file, 'rb') as src: binary_dump(src, out, 'magisk_xz') + for arch, arch32 in list(zip(arch64, archs)): + bin_file = os.path.join('native', 'out', arch, 'magisk') + with open(os.path.join('native', 'out', arch32, 'binaries_arch64.h'), 'w') as out: + with open(bin_file, 'rb') as src: + binary_dump(src, out, 'magisk_xz') - # BusyBox is special case as it needs special flags to build if 'busybox' in args.target: - proc = system(f'{ndk_build} -C native {base_flags} B_BB=1 -j{cpu_count}') - if proc.returncode != 0: - error('Build binaries failed!') - collect_binary() - - build = False - flags = base_flags + run_ndk_build('B_BB=1') if 'magiskinit' in args.target: if not os.path.exists(os.path.join('native', 'out', 'x86', 'binaries_arch.h')): error('Build "magisk" before building "magiskinit"') if not os.path.exists(os.path.join('native', 'out', 'binaries.h')): error('Build stub APK before building "magiskinit"') - flags += ' B_INIT=1' - build = True + run_ndk_build('B_INIT=1') + run_ndk_build('B_INIT64=1') if 'magiskboot' in args.target: - flags += ' B_BOOT=1' - build = True - - if build: - proc = system(f'{ndk_build} -C native {flags} -j{cpu_count}') - if proc.returncode != 0: - error('Build binaries failed!') - collect_binary() + run_ndk_build('B_BOOT=1') def build_apk(args, flavor): @@ -311,7 +305,7 @@ def zip_main(args): # Binaries for lib_dir, zip_dir in [('armeabi-v7a', 'arm'), ('x86', 'x86')]: - for binary in ['magiskinit', 'magiskboot']: + for binary in ['magiskinit', 'magiskinit64', 'magiskboot']: source = os.path.join('native', 'out', lib_dir, binary) target = os.path.join(zip_dir, binary) zip_with_msg(zipf, source, target) diff --git a/native/build.gradle b/native/build.gradle index 3f407defa..776ccec96 100644 --- a/native/build.gradle +++ b/native/build.gradle @@ -12,7 +12,7 @@ android { externalNativeBuild { ndkBuild { // Pass arguments to ndk-build. - arguments('B_MAGISK=1', 'B_INIT=1', 'B_BOOT=1', + arguments('B_MAGISK=1', 'B_INIT64=1', 'B_BOOT=1', 'MAGISK_DEBUG=1', 'MAGISK_VERSION=debug', 'MAGISK_VER_CODE=INT_MAX') } } diff --git a/native/jni/Android.mk b/native/jni/Android.mk index 6c00c5771..4b018db81 100644 --- a/native/jni/Android.mk +++ b/native/jni/Android.mk @@ -19,7 +19,6 @@ LIBUTILS := jni/utils/include ifdef B_MAGISK -# magisk main binary include $(CLEAR_VARS) LOCAL_MODULE := magisk LOCAL_SHARED_LIBRARIES := libsqlite @@ -56,11 +55,19 @@ include $(BUILD_EXECUTABLE) endif -ifdef B_INIT - -# magiskinit include $(CLEAR_VARS) + +ifdef B_INIT LOCAL_MODULE := magiskinit +BB_INIT := 1 +else ifdef B_INIT64 +LOCAL_MODULE := magiskinit64 +LOCAL_CPPFLAGS += -DUSE_64BIT +BB_INIT := 1 +endif + +ifdef BB_INIT + LOCAL_STATIC_LIBRARIES := libsepol libxz libutils LOCAL_C_INCLUDES := \ jni/include \ @@ -85,7 +92,6 @@ endif ifdef B_BOOT -# magiskboot include $(CLEAR_VARS) LOCAL_MODULE := magiskboot LOCAL_STATIC_LIBRARIES := libmincrypt liblzma liblz4 libbz2 libfdt libutils @@ -116,7 +122,6 @@ endif ifdef B_BB -# Busybox include jni/external/busybox/Android.mk endif diff --git a/native/jni/Application.mk b/native/jni/Application.mk index 31869ea74..70fd4485c 100644 --- a/native/jni/Application.mk +++ b/native/jni/Application.mk @@ -9,10 +9,15 @@ ifdef MAGISK_DEBUG APP_CFLAGS += -D__MDBG endif +# Build 64 bit binaries for magisk +ifdef B_MAGISK +APP_ABI += arm64-v8a x86_64 +endif + # Busybox require some additional settings ifdef B_BB APP_CFLAGS := -Os APP_SHORT_COMMANDS := true NDK_TOOLCHAIN_VERSION := 4.9 -APP_PLATFORM := android-22 +APP_PLATFORM := android-21 endif diff --git a/native/jni/core/init.cpp b/native/jni/core/init.cpp index 639d03dd7..e05394963 100644 --- a/native/jni/core/init.cpp +++ b/native/jni/core/init.cpp @@ -44,7 +44,11 @@ #include #include "binaries.h" +#ifdef USE_64BIT +#include "binaries_arch64.h" +#else #include "binaries_arch.h" +#endif #include "magiskrc.h" #define DEFAULT_DT_DIR "/proc/device-tree/firmware/android" @@ -367,12 +371,6 @@ static void setup_init_rc() { fclose(rc); } -static const char wrapper[] = -"#!/system/bin/sh\n" -"unset LD_LIBRARY_PATH\n" -"unset LD_PRELOAD\n" -"exec /sbin/magisk.bin \"${0##*/}\" \"$@\"\n"; - static void setup_overlay() { char buf[128]; int fd; @@ -402,13 +400,9 @@ static void setup_overlay() { fd = open("/sbin/magiskinit", O_WRONLY | O_CREAT, 0755); write(fd, self, self_sz); close(fd); - fd = open("/sbin/magisk", O_WRONLY | O_CREAT, 0755); - write(fd, wrapper, sizeof(wrapper)); - close(fd); - dump_magisk("/sbin/magisk.bin", 0755); - patch_socket_name("/sbin/magisk.bin"); + dump_magisk("/sbin/magisk", 0755); + patch_socket_name("/sbin/magisk"); setfilecon("/sbin/magisk", "u:object_r:" SEPOL_FILE_DOMAIN ":s0"); - setfilecon("/sbin/magisk.bin", "u:object_r:" SEPOL_FILE_DOMAIN ":s0"); setfilecon("/sbin/magiskinit", "u:object_r:" SEPOL_FILE_DOMAIN ":s0"); // Create applet symlinks diff --git a/scripts/flash_script.sh b/scripts/flash_script.sh index 5bf6fbab3..bcc9a7c54 100644 --- a/scripts/flash_script.sh +++ b/scripts/flash_script.sh @@ -100,6 +100,8 @@ $BOOTSIGNED && ui_print "- Boot image is signed with AVB 1.0" SOURCEDMODE=true cd $MAGISKBIN +$IS64BIT && mv -f magiskinit64 magiskinit || rm -f magiskinit64 + # Source the boot patcher . ./boot_patch.sh "$BOOTIMAGE"