From ef81cdab4f6cf211ab2ae37c7c00635ae819b702 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Wed, 17 Jul 2024 02:58:31 -0700 Subject: [PATCH] Prebuild Busybox Prebuild with tools in ndk-box-kitchen --- .gitmodules | 6 -- build.py | 6 +- buildSrc/src/main/java/Setup.kt | 38 ++++++++- native/src/Android.mk | 6 -- native/src/Application.mk | 8 -- native/src/external/Android.mk | 110 ------------------------- native/src/external/busybox | 1 - native/src/external/pcre | 1 - native/src/external/pcre2_workaround.c | 4 - 9 files changed, 38 insertions(+), 142 deletions(-) delete mode 160000 native/src/external/busybox delete mode 160000 native/src/external/pcre delete mode 100644 native/src/external/pcre2_workaround.c diff --git a/.gitmodules b/.gitmodules index 07558620e..d2290de35 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,6 @@ [submodule "selinux"] path = native/src/external/selinux url = https://github.com/topjohnwu/selinux.git -[submodule "busybox"] - path = native/src/external/busybox - url = https://github.com/topjohnwu/ndk-busybox.git [submodule "lz4"] path = native/src/external/lz4 url = https://github.com/lz4/lz4.git @@ -13,9 +10,6 @@ [submodule "xz"] path = native/src/external/xz url = https://github.com/xz-mirror/xz.git -[submodule "pcre"] - path = native/src/external/pcre - url = https://android.googlesource.com/platform/external/pcre [submodule "libcxx"] path = native/src/external/libcxx url = https://github.com/topjohnwu/libcxx.git diff --git a/build.py b/build.py index 25377b7e5..bbabcf243 100755 --- a/build.py +++ b/build.py @@ -76,7 +76,7 @@ triples = [ "x86_64-linux-android", "riscv64-linux-android", ] -default_targets = ["magisk", "magiskinit", "magiskboot", "magiskpolicy", "busybox"] +default_targets = ["magisk", "magiskinit", "magiskboot", "magiskpolicy"] support_targets = default_targets + ["resetprop"] rust_targets = ["magisk", "magiskinit", "magiskboot", "magiskpolicy"] @@ -246,7 +246,7 @@ def run_ndk_build(args, flags): mv(source, target) -def run_cargo(cmds, triple="aarch64-linux-android"): +def run_cargo(cmds): env = os.environ.copy() env["PATH"] = f'{rust_bin}{os.pathsep}{env["PATH"]}' env["CARGO_BUILD_RUSTC"] = str(rust_bin / f"rustc{EXE_EXT}") @@ -287,7 +287,7 @@ def run_cargo_build(args): for target in targets: cmds[2] = target - proc = run_cargo(cmds, triple) + proc = run_cargo(cmds) if proc.returncode != 0: error("Build binary failed!") diff --git a/buildSrc/src/main/java/Setup.kt b/buildSrc/src/main/java/Setup.kt index ee587f0ce..08951236c 100644 --- a/buildSrc/src/main/java/Setup.kt +++ b/buildSrc/src/main/java/Setup.kt @@ -17,6 +17,7 @@ import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.api.file.DirectoryProperty import org.gradle.api.provider.Property +import org.gradle.api.tasks.Copy import org.gradle.api.tasks.Delete import org.gradle.api.tasks.Input import org.gradle.api.tasks.InputFiles @@ -39,8 +40,11 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import java.io.ByteArrayOutputStream import java.io.File +import java.net.URI import java.security.KeyStore +import java.security.MessageDigest import java.security.cert.X509Certificate +import java.util.HexFormat import java.util.jar.JarFile import java.util.zip.Deflater import java.util.zip.DeflaterOutputStream @@ -109,6 +113,11 @@ fun Project.setupCommon() { } } +const val BUSYBOX_DOWNLOAD_URL = + "https://github.com/topjohnwu/magisk-files/releases/download/files/busybox-1.36.1.0.zip" +const val BUSYBOX_ZIP_CHECKSUM = + "ea4f3019b0087dcb68130b32ab59dc2db0ee0af11d8396124a94c4231c5ea441" + fun Project.setupCoreLib() { setupCommon() @@ -117,18 +126,41 @@ fun Project.setupCoreLib() { for (abi in arrayOf("armeabi-v7a", "x86", "arm64-v8a", "x86_64", "riscv64")) { into(abi) { from(rootProject.file("native/out/$abi")) { - include("busybox", "magiskboot", "magiskinit", "magiskpolicy", "magisk") + include("magiskboot", "magiskinit", "magiskpolicy", "magisk") rename { "lib$it.so" } } } } onlyIf { - if (inputs.sourceFiles.files.size != 25) + if (inputs.sourceFiles.files.size != 20) throw StopExecutionException("Please build binaries first! (./build.py binary)") true } } + val downloadBusybox by tasks.registering(Copy::class) { + dependsOn(syncLibs) + val bb = layout.buildDirectory.file(BUSYBOX_ZIP_CHECKSUM).get().asFile + if (bb.exists()) { + val md = MessageDigest.getInstance("SHA-256") + bb.inputStream().use { md.update(it.readAllBytes()) } + val hash = HexFormat.of().formatHex(md.digest()) + if (hash != BUSYBOX_ZIP_CHECKSUM) { + bb.delete() + } + } + if (!bb.exists()) { + bb.parentFile.mkdirs() + URI(BUSYBOX_DOWNLOAD_URL).toURL().openStream().use { dl -> + bb.outputStream().use { + dl.copyTo(it) + } + } + } + from(zipTree(bb)) + into("src/main/jniLibs") + } + val syncResources by tasks.registering(Sync::class) { into("src/main/resources/META-INF/com/google/android") from(rootProject.file("scripts/update_binary.sh")) { @@ -142,7 +174,7 @@ fun Project.setupCoreLib() { androidLib.libraryVariants.all { val variantCapped = name.replaceFirstChar { it.uppercase() } - tasks.getByPath("merge${variantCapped}JniLibFolders").dependsOn(syncLibs) + tasks.getByPath("merge${variantCapped}JniLibFolders").dependsOn(downloadBusybox) processJavaResourcesProvider.configure { dependsOn(syncResources) } val stubTask = tasks.getByPath(":app:stub:comment$variantCapped") diff --git a/native/src/Android.mk b/native/src/Android.mk index 7d7068b74..76c66ae28 100644 --- a/native/src/Android.mk +++ b/native/src/Android.mk @@ -172,9 +172,3 @@ include $(BUILD_STATIC_LIBRARY) include src/Android-rs.mk include src/base/Android.mk include src/external/Android.mk - -ifdef B_BB - -include src/external/busybox/Android.mk - -endif diff --git a/native/src/Application.mk b/native/src/Application.mk index 0c3c9eed0..94aa3b88f 100644 --- a/native/src/Application.mk +++ b/native/src/Application.mk @@ -17,11 +17,3 @@ APP_CFLAGS += -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-stac NDK_APP_OUT := ./obj/nolibc endif - -# Busybox should use a newer libc.a -ifdef B_BB -APP_PLATFORM := android-26 -ifeq ($(OS),Windows_NT) -APP_SHORT_COMMANDS := true -endif -endif diff --git a/native/src/external/Android.mk b/native/src/external/Android.mk index b2b1597e8..60c13de90 100644 --- a/native/src/external/Android.mk +++ b/native/src/external/Android.mk @@ -220,116 +220,6 @@ LOCAL_CFLAGS += -DHAVE_REALLOCARRAY endif include $(BUILD_STATIC_LIBRARY) -# libselinux.a -include $(CLEAR_VARS) -LIBSELINUX := $(SE_PATH)/libselinux/include -LOCAL_MODULE:= libselinux -LOCAL_C_INCLUDES := $(LIBSELINUX) -LOCAL_EXPORT_C_INCLUDES := $(LIBSELINUX) -LOCAL_STATIC_LIBRARIES := libpcre2 -LOCAL_CFLAGS := \ - -Wno-implicit-function-declaration -Wno-int-conversion -Wno-unused-function \ - -Wno-macro-redefined -Wno-unused-but-set-variable -D_GNU_SOURCE -DUSE_PCRE2 \ - -DNO_PERSISTENTLY_STORED_PATTERNS -DDISABLE_SETRANS -DDISABLE_BOOL \ - -DNO_MEDIA_BACKEND -DNO_X_BACKEND -DNO_DB_BACKEND -DNO_ANDROID_BACKEND \ - -Dfgets_unlocked=fgets -D'__fsetlocking(...)=' -LOCAL_SRC_FILES := \ - selinux/libselinux/src/avc.c \ - selinux/libselinux/src/avc_internal.c \ - selinux/libselinux/src/avc_sidtab.c \ - selinux/libselinux/src/booleans.c \ - selinux/libselinux/src/callbacks.c \ - selinux/libselinux/src/canonicalize_context.c \ - selinux/libselinux/src/checkAccess.c \ - selinux/libselinux/src/check_context.c \ - selinux/libselinux/src/checkreqprot.c \ - selinux/libselinux/src/compute_av.c \ - selinux/libselinux/src/compute_create.c \ - selinux/libselinux/src/compute_member.c \ - selinux/libselinux/src/compute_relabel.c \ - selinux/libselinux/src/compute_user.c \ - selinux/libselinux/src/context.c \ - selinux/libselinux/src/deny_unknown.c \ - selinux/libselinux/src/disable.c \ - selinux/libselinux/src/enabled.c \ - selinux/libselinux/src/fgetfilecon.c \ - selinux/libselinux/src/freecon.c \ - selinux/libselinux/src/freeconary.c \ - selinux/libselinux/src/fsetfilecon.c \ - selinux/libselinux/src/get_context_list.c \ - selinux/libselinux/src/get_default_type.c \ - selinux/libselinux/src/get_initial_context.c \ - selinux/libselinux/src/getenforce.c \ - selinux/libselinux/src/getfilecon.c \ - selinux/libselinux/src/getpeercon.c \ - selinux/libselinux/src/init.c \ - selinux/libselinux/src/is_customizable_type.c \ - selinux/libselinux/src/label.c \ - selinux/libselinux/src/label_file.c \ - selinux/libselinux/src/label_support.c \ - selinux/libselinux/src/lgetfilecon.c \ - selinux/libselinux/src/load_policy.c \ - selinux/libselinux/src/lsetfilecon.c \ - selinux/libselinux/src/mapping.c \ - selinux/libselinux/src/matchmediacon.c \ - selinux/libselinux/src/matchpathcon.c \ - selinux/libselinux/src/policyvers.c \ - selinux/libselinux/src/procattr.c \ - selinux/libselinux/src/query_user_context.c \ - selinux/libselinux/src/regex.c \ - selinux/libselinux/src/reject_unknown.c \ - selinux/libselinux/src/selinux_check_securetty_context.c \ - selinux/libselinux/src/selinux_config.c \ - selinux/libselinux/src/selinux_restorecon.c \ - selinux/libselinux/src/sestatus.c \ - selinux/libselinux/src/setenforce.c \ - selinux/libselinux/src/setexecfilecon.c \ - selinux/libselinux/src/setfilecon.c \ - selinux/libselinux/src/setrans_client.c \ - selinux/libselinux/src/seusers.c \ - selinux/libselinux/src/sha1.c \ - selinux/libselinux/src/stringrep.c \ - selinux/libselinux/src/validatetrans.c -include $(BUILD_STATIC_LIBRARY) - -# libpcre2.a -include $(CLEAR_VARS) -LIBPCRE2 := $(LOCAL_PATH)/pcre/include -LOCAL_MODULE:= libpcre2 -LOCAL_CFLAGS := -DHAVE_CONFIG_H -DPCRE2_CODE_UNIT_WIDTH=8 -LOCAL_C_INCLUDES := $(LIBPCRE2) $(LIBPCRE2)_internal -LOCAL_EXPORT_C_INCLUDES := $(LIBPCRE2) -LOCAL_SRC_FILES := \ - pcre/src/pcre2_auto_possess.c \ - pcre/src/pcre2_compile.c \ - pcre/src/pcre2_config.c \ - pcre/src/pcre2_context.c \ - pcre/src/pcre2_convert.c \ - pcre/src/pcre2_dfa_match.c \ - pcre/src/pcre2_error.c \ - pcre/src/pcre2_extuni.c \ - pcre/src/pcre2_find_bracket.c \ - pcre/src/pcre2_fuzzsupport.c \ - pcre/src/pcre2_maketables.c \ - pcre/src/pcre2_match.c \ - pcre/src/pcre2_match_data.c \ - pcre/src/pcre2_jit_compile.c \ - pcre/src/pcre2_newline.c \ - pcre/src/pcre2_ord2utf.c \ - pcre/src/pcre2_pattern_info.c \ - pcre/src/pcre2_script_run.c \ - pcre/src/pcre2_serialize.c \ - pcre/src/pcre2_string_utils.c \ - pcre/src/pcre2_study.c \ - pcre/src/pcre2_substitute.c \ - pcre/src/pcre2_substring.c \ - pcre/src/pcre2_tables.c \ - pcre/src/pcre2_ucd.c \ - pcre/src/pcre2_valid_utf.c \ - pcre/src/pcre2_xclass.c \ - pcre2_workaround.c -include $(BUILD_STATIC_LIBRARY) - # liblsplt.a include $(CLEAR_VARS) LOCAL_MODULE:= liblsplt diff --git a/native/src/external/busybox b/native/src/external/busybox deleted file mode 160000 index 1c0ca97aa..000000000 --- a/native/src/external/busybox +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1c0ca97aafb9698ab7770ce1f67af1a84b469cdb diff --git a/native/src/external/pcre b/native/src/external/pcre deleted file mode 160000 index 8e12681a1..000000000 --- a/native/src/external/pcre +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8e12681a1a252fd581830b2f65d1e154a2030bb9 diff --git a/native/src/external/pcre2_workaround.c b/native/src/external/pcre2_workaround.c deleted file mode 100644 index 5fea7619f..000000000 --- a/native/src/external/pcre2_workaround.c +++ /dev/null @@ -1,4 +0,0 @@ -// Workaround pcre2_chartables.c symlink to pcre2_chartables.c.dist failing on Windows NDK if Cygwin git used, -// and NDK not directly accepting a .c.dist file in LOCAL_SRC_FILES list. - -#include "pcre/src/pcre2_chartables.c.dist"