From 5a762f0a8e493c0a524086cca6208dde61fe0927 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Tue, 13 May 2025 16:25:01 -0700 Subject: [PATCH] Move all gradle files into folder app Decouple java and native projects --- .github/workflows/build.yml | 7 ++--- .gitignore | 8 +---- app/.gitignore | 7 +++++ app/apk/build.gradle.kts | 2 +- app/build.gradle.kts | 10 +++++-- {buildSrc => app/buildSrc}/.gitignore | 0 {buildSrc => app/buildSrc}/build.gradle.kts | 0 .../buildSrc}/settings.gradle.kts | 0 .../buildSrc}/src/main/java/Codegen.kt | 0 .../main/java/DesugarClassVisitorFactory.kt | 0 .../buildSrc}/src/main/java/Plugin.kt | 10 ++++--- .../buildSrc}/src/main/java/Setup.kt | 18 +++++------ app/core/build.gradle.kts | 2 +- gradle.properties => app/gradle.properties | 1 - {gradle => app/gradle}/libs.versions.toml | 0 .../gradle}/wrapper/gradle-wrapper.jar | Bin .../gradle}/wrapper/gradle-wrapper.properties | 0 gradlew => app/gradlew | 0 gradlew.bat => app/gradlew.bat | 0 .../settings.gradle.kts | 2 +- app/stub/build.gradle.kts | 2 +- build.gradle.kts | 7 ----- build.py | 28 ++++++++++-------- scripts/release.sh | 2 +- 24 files changed, 54 insertions(+), 52 deletions(-) create mode 100644 app/.gitignore rename {buildSrc => app/buildSrc}/.gitignore (100%) rename {buildSrc => app/buildSrc}/build.gradle.kts (100%) rename {buildSrc => app/buildSrc}/settings.gradle.kts (100%) rename {buildSrc => app/buildSrc}/src/main/java/Codegen.kt (100%) rename {buildSrc => app/buildSrc}/src/main/java/DesugarClassVisitorFactory.kt (100%) rename {buildSrc => app/buildSrc}/src/main/java/Plugin.kt (84%) rename {buildSrc => app/buildSrc}/src/main/java/Setup.kt (97%) rename gradle.properties => app/gradle.properties (97%) rename {gradle => app/gradle}/libs.versions.toml (100%) rename {gradle => app/gradle}/wrapper/gradle-wrapper.jar (100%) rename {gradle => app/gradle}/wrapper/gradle-wrapper.properties (100%) rename gradlew => app/gradlew (100%) rename gradlew.bat => app/gradlew.bat (100%) rename settings.gradle.kts => app/settings.gradle.kts (75%) delete mode 100644 build.gradle.kts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 43896c1c1..e4b65360e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,10 +6,7 @@ on: paths: - "app/**" - "native/**" - - "buildSrc/**" - "build.py" - - "gradle.properties" - - "gradle/libs.versions.toml" - ".github/workflows/build.yml" pull_request: branches: [master] @@ -39,7 +36,7 @@ jobs: run: ./build.py -v all - name: Stop gradle daemon - run: ./gradlew --stop + run: ./app/gradlew --stop - name: Upload build artifact uses: actions/upload-artifact@v4 @@ -75,7 +72,7 @@ jobs: run: python build.py -v -c .github/ci.prop all - name: Stop gradle daemon - run: ./gradlew --stop + run: ./app/gradlew --stop avd-test: name: Test API ${{ matrix.version }} (x86_64) diff --git a/.gitignore b/.gitignore index a99910691..98ccb8c50 100644 --- a/.gitignore +++ b/.gitignore @@ -5,16 +5,10 @@ out *.log /config.prop /notes.md -/app/dict.txt # Built binaries native/out -# Android Studio / Gradle +# Android Studio *.iml -.gradle .idea -.kotlin -/local.properties -/build -/captures diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 000000000..39b258fe4 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,7 @@ +/dict.txt + +# Gradle +.gradle +.kotlin +/local.properties +/build diff --git a/app/apk/build.gradle.kts b/app/apk/build.gradle.kts index 0009e36b2..3e6b329f6 100644 --- a/app/apk/build.gradle.kts +++ b/app/apk/build.gradle.kts @@ -35,7 +35,7 @@ android { } dependencies { - implementation(project(":app:core")) + implementation(project(":core")) coreLibraryDesugaring(libs.jdk.libs) implementation(libs.indeterminate.checkbox) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8cac82d83..dba72da5c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,5 +1,11 @@ -tasks.register("clean") { +plugins { + id("MagiskPlugin") +} + +tasks.register("clean", Delete::class) { + delete(rootProject.layout.buildDirectory) + subprojects.forEach { - dependsOn(":app:${it.name}:clean") + dependsOn(":${it.name}:clean") } } diff --git a/buildSrc/.gitignore b/app/buildSrc/.gitignore similarity index 100% rename from buildSrc/.gitignore rename to app/buildSrc/.gitignore diff --git a/buildSrc/build.gradle.kts b/app/buildSrc/build.gradle.kts similarity index 100% rename from buildSrc/build.gradle.kts rename to app/buildSrc/build.gradle.kts diff --git a/buildSrc/settings.gradle.kts b/app/buildSrc/settings.gradle.kts similarity index 100% rename from buildSrc/settings.gradle.kts rename to app/buildSrc/settings.gradle.kts diff --git a/buildSrc/src/main/java/Codegen.kt b/app/buildSrc/src/main/java/Codegen.kt similarity index 100% rename from buildSrc/src/main/java/Codegen.kt rename to app/buildSrc/src/main/java/Codegen.kt diff --git a/buildSrc/src/main/java/DesugarClassVisitorFactory.kt b/app/buildSrc/src/main/java/DesugarClassVisitorFactory.kt similarity index 100% rename from buildSrc/src/main/java/DesugarClassVisitorFactory.kt rename to app/buildSrc/src/main/java/DesugarClassVisitorFactory.kt diff --git a/buildSrc/src/main/java/Plugin.kt b/app/buildSrc/src/main/java/Plugin.kt similarity index 84% rename from buildSrc/src/main/java/Plugin.kt rename to app/buildSrc/src/main/java/Plugin.kt index a793437e2..941da9976 100644 --- a/buildSrc/src/main/java/Plugin.kt +++ b/app/buildSrc/src/main/java/Plugin.kt @@ -14,7 +14,7 @@ private val defaultAbis = setOf("armeabi-v7a", "x86", "arm64-v8a", "x86_64") object Config { operator fun get(key: String): String? { val v = props[key] as? String ?: return null - return if (v.isBlank()) null else v + return v.ifBlank { null } } fun contains(key: String) = get(key) != null @@ -28,19 +28,21 @@ object Config { } } +val Project.baseDir: File get() = rootProject.file("..") + class MagiskPlugin : Plugin { override fun apply(project: Project) = project.applyPlugin() private fun Project.applyPlugin() { - initRandom(rootProject.file("app/dict.txt")) + initRandom(rootProject.file("dict.txt")) props.clear() rootProject.file("gradle.properties").inputStream().use { props.load(it) } val configPath: String? by this - val config = configPath?.let { File(it) } ?: rootProject.file("config.prop") + val config = configPath?.let { File(it) } ?: File(baseDir, "config.prop") if (config.exists()) config.inputStream().use { props.load(it) } - val repo = FileRepository(rootProject.file(".git")) + val repo = FileRepository(File(baseDir, ".git")) val refId = repo.refDatabase.exactRef("HEAD").objectId commitHash = repo.newObjectReader().abbreviate(refId, 8).name() } diff --git a/buildSrc/src/main/java/Setup.kt b/app/buildSrc/src/main/java/Setup.kt similarity index 97% rename from buildSrc/src/main/java/Setup.kt rename to app/buildSrc/src/main/java/Setup.kt index dbbb8d25d..b544dd6e7 100644 --- a/buildSrc/src/main/java/Setup.kt +++ b/app/buildSrc/src/main/java/Setup.kt @@ -151,7 +151,7 @@ fun Project.setupCoreLib() { into("src/main/jniLibs") for (abi in abiList) { into(abi) { - from(rootProject.file("native/out/$abi")) { + from(File(baseDir, "native/out/$abi")) { include("magiskboot", "magiskinit", "magiskpolicy", "magisk", "libinit-ld.so") rename { if (it.endsWith(".so")) it else "lib$it.so" } } @@ -173,10 +173,10 @@ fun Project.setupCoreLib() { val syncResources by tasks.registering(Sync::class) { into("src/main/resources/META-INF/com/google/android") - from(rootProject.file("scripts/update_binary.sh")) { + from(File(baseDir, "scripts/update_binary.sh")) { rename { "update-binary" } } - from(rootProject.file("scripts/flash_script.sh")) { + from(File(baseDir, "scripts/flash_script.sh")) { rename { "updater-script" } } } @@ -187,7 +187,7 @@ fun Project.setupCoreLib() { tasks.getByPath("merge${variantCapped}JniLibFolders").dependsOn(downloadBusybox) processJavaResourcesProvider.configure { dependsOn(syncResources) } - val stubTask = tasks.getByPath(":app:stub:comment$variantCapped") + val stubTask = tasks.getByPath(":stub:comment$variantCapped") val stubApk = stubTask.outputs.files.asFileTree.filter { it.name.endsWith(".apk") } @@ -197,14 +197,14 @@ fun Project.setupCoreLib() { inputs.property("version", Config.version) inputs.property("versionCode", Config.versionCode) into("src/${this@all.name}/assets") - from(rootProject.file("scripts")) { + from(File(baseDir, "scripts")) { include("util_functions.sh", "boot_patch.sh", "addon.d.sh", "app_functions.sh", "uninstaller.sh", "module_installer.sh") } - from(rootProject.file("tools/bootctl")) + from(File(baseDir, "tools/bootctl")) into("chromeos") { - from(rootProject.file("tools/futility")) - from(rootProject.file("tools/keys")) { + from(File(baseDir, "tools/futility")) + from(File(baseDir, "tools/keys")) { include("kernel_data_key.vbprivk", "kernel.keyblock") } } @@ -294,7 +294,7 @@ fun Project.setupAppCommon() { signingConfigs { create("config") { Config["keyStore"]?.also { - storeFile = rootProject.file(it) + storeFile = File(baseDir, it) storePassword = Config["keyStorePass"] keyAlias = Config["keyAlias"] keyPassword = Config["keyPass"] diff --git a/app/core/build.gradle.kts b/app/core/build.gradle.kts index d8569a6ed..cc993c11b 100644 --- a/app/core/build.gradle.kts +++ b/app/core/build.gradle.kts @@ -29,7 +29,7 @@ android { } dependencies { - api(project(":app:shared")) + api(project(":shared")) api(libs.timber) api(libs.markwon.core) diff --git a/gradle.properties b/app/gradle.properties similarity index 97% rename from gradle.properties rename to app/gradle.properties index 57132567a..b3613f01c 100644 --- a/gradle.properties +++ b/app/gradle.properties @@ -31,4 +31,3 @@ android.nonFinalResIds=false # Magisk magisk.stubVersion=40 magisk.versionCode=28104 -magisk.ondkVersion=r29.1 diff --git a/gradle/libs.versions.toml b/app/gradle/libs.versions.toml similarity index 100% rename from gradle/libs.versions.toml rename to app/gradle/libs.versions.toml diff --git a/gradle/wrapper/gradle-wrapper.jar b/app/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from gradle/wrapper/gradle-wrapper.jar rename to app/gradle/wrapper/gradle-wrapper.jar diff --git a/gradle/wrapper/gradle-wrapper.properties b/app/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from gradle/wrapper/gradle-wrapper.properties rename to app/gradle/wrapper/gradle-wrapper.properties diff --git a/gradlew b/app/gradlew similarity index 100% rename from gradlew rename to app/gradlew diff --git a/gradlew.bat b/app/gradlew.bat similarity index 100% rename from gradlew.bat rename to app/gradlew.bat diff --git a/settings.gradle.kts b/app/settings.gradle.kts similarity index 75% rename from settings.gradle.kts rename to app/settings.gradle.kts index 9732e55f8..6c8856455 100644 --- a/settings.gradle.kts +++ b/app/settings.gradle.kts @@ -8,4 +8,4 @@ dependencyResolutionManagement { } } rootProject.name = "Magisk" -include(":app:apk", ":app:core", ":app:shared", ":app:stub", ":app:test", ":native") +include(":apk", ":core", ":shared", ":stub", ":test") diff --git a/app/stub/build.gradle.kts b/app/stub/build.gradle.kts index 4c52cff8f..be547dc02 100644 --- a/app/stub/build.gradle.kts +++ b/app/stub/build.gradle.kts @@ -41,5 +41,5 @@ android { setupStubApk() dependencies { - implementation(project(":app:shared")) + implementation(project(":shared")) } diff --git a/build.gradle.kts b/build.gradle.kts deleted file mode 100644 index 3fe1ad30b..000000000 --- a/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -plugins { - id("MagiskPlugin") -} - -tasks.register("clean", Delete::class) { - delete(rootProject.layout.buildDirectory) -} diff --git a/build.py b/build.py index 614048fe5..8726eed04 100755 --- a/build.py +++ b/build.py @@ -71,6 +71,7 @@ default_archs = {"armeabi-v7a", "x86", "arm64-v8a", "x86_64"} default_targets = {"magisk", "magiskinit", "magiskboot", "magiskpolicy"} support_targets = default_targets | {"resetprop"} rust_targets = {"magisk", "magiskinit", "magiskboot", "magiskpolicy"} +ondk_version = "r29.1" # Global vars config = {} @@ -318,7 +319,7 @@ def build_native(): # Verify NDK install try: with open(Path(ndk_path, "ONDK_VERSION"), "r") as ondk_ver: - assert ondk_ver.read().strip(" \t\r\n") == config["ondkVersion"] + assert ondk_ver.read().strip(" \t\r\n") == ondk_version except: error('Unmatched NDK. Please install/upgrade NDK with "build.py ndk"') @@ -383,16 +384,19 @@ def find_jdk(): def build_apk(module: str): ensure_paths() env = find_jdk() + props = args.config.resolve() + os.chdir("app") build_type = "Release" if args.release else "Debug" proc = execv( [ gradlew, f"{module}:assemble{build_type}", - f"-PconfigPath={args.config.resolve()}", + f"-PconfigPath={props}", ], env=env, ) + os.chdir("..") if proc.returncode != 0: error(f"Build {module} failed!") @@ -401,7 +405,7 @@ def build_apk(module: str): paths = module.split(":") apk = f"{paths[-1]}-{build_type}.apk" - source = Path(*paths, "build", "outputs", "apk", build_type, apk) + source = Path("app", *paths, "build", "outputs", "apk", build_type, apk) target = config["outdir"] / apk mv(source, target) return target @@ -409,7 +413,7 @@ def build_apk(module: str): def build_app(): header("* Building the Magisk app") - apk = build_apk(":app:apk") + apk = build_apk(":apk") build_type = "release" if args.release else "debug" @@ -428,7 +432,7 @@ def build_app(): def build_stub(): header("* Building the stub app") - apk = build_apk(":app:stub") + apk = build_apk(":stub") header(f"Output: {apk}") @@ -439,7 +443,7 @@ def build_test(): args.release = True try: header("* Building the test app") - source = build_apk(":app:test") + source = build_apk(":test") target = source.parent / "test.apk" mv(source, target) header(f"Output: {target}") @@ -548,10 +552,9 @@ def cargo_cli(): def setup_ndk(): ensure_paths() - ndk_ver = config["ondkVersion"] - url = f"https://github.com/topjohnwu/ondk/releases/download/{ndk_ver}/ondk-{ndk_ver}-{os_name}.tar.xz" + url = f"https://github.com/topjohnwu/ondk/releases/download/{ondk_version}/ondk-{ondk_version}-{os_name}.tar.xz" ndk_archive = url.split("/")[-1] - ondk_path = Path(ndk_root, f"ondk-{ndk_ver}") + ondk_path = Path(ndk_root, f"ondk-{ondk_version}") header(f"* Downloading and extracting {ndk_archive}") rm_rf(ondk_path) @@ -699,7 +702,7 @@ def ensure_paths(): ndk_path / "toolchains" / "llvm" / "prebuilt" / f"{os_name}-x86_64" / "bin" ) adb_path = sdk_path / "platform-tools" / "adb" - gradlew = Path.cwd() / "gradlew" + gradlew = Path.cwd() / "app" / "gradlew" # We allow using several functionality with only ADB @@ -750,8 +753,9 @@ def load_config(): if args.config.exists(): config.update(parse_props(args.config)) - if Path("gradle.properties").exists(): - for key, value in parse_props("gradle.properties").items(): + gradle_props = Path("app", "gradle.properties") + if gradle_props.exists(): + for key, value in parse_props(gradle_props).items(): if key.startswith("magisk."): config[key[7:]] = value diff --git a/scripts/release.sh b/scripts/release.sh index b05910321..93d2d199d 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -11,7 +11,7 @@ CONFIG=config.prop NOTES=notes.md # These are constants, do not modify -GCONFIG=gradle.properties +GCONFIG=app/gradle.properties README=README.MD BUILDCMD="./build.py -c $CONFIG" CWD=$(pwd)