import java.util.Locale plugins { alias(libs.plugins.agp.app) } android { defaultConfig { multiDexEnabled = false } buildFeatures { buildConfig = true } buildTypes { release { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } externalNativeBuild { cmake { path("src/main/jni/CMakeLists.txt") version = "3.31.6" } } namespace = "org.lsposed.npatch.loader" } androidComponents.onVariants { variant -> val variantCapped = variant.name.replaceFirstChar { it.uppercase() } val copyDexTask = tasks.register("copyDex$variantCapped") { dependsOn("assemble$variantCapped") from(layout.buildDirectory.file("intermediates/dex/${variant.name}/mergeDex$variantCapped/classes.dex")) rename("classes.dex", "loader.dex") into("${rootProject.projectDir}/out/assets/${variant.name}/npatch") } val copySoTask = tasks.register("copySo$variantCapped") { dependsOn("assemble$variantCapped") dependsOn("strip${variantCapped}DebugSymbols") val libDir = variant.name + "/strip${variantCapped}DebugSymbols" from( fileTree( "dir" to layout.buildDirectory.dir("intermediates/stripped_native_libs/${variant.name}/strip${variantCapped}DebugSymbols/out/lib"), "include" to listOf("**/libnpatch.so") ) ) into("${rootProject.projectDir}/out/assets/${variant.name}/npatch/so") } tasks.register("copy$variantCapped") { dependsOn(copySoTask) dependsOn(copyDexTask) doLast { println("Dex and so files has been copied to ${rootProject.projectDir}${File.separator}out") } } } dependencies { compileOnly(projects.hiddenapi.stubs) implementation(projects.core) implementation(projects.hiddenapi.bridge) implementation(projects.services.daemonService) implementation(projects.share.android) implementation(projects.share.java) implementation(libs.gson) }