2021-09-08 00:45:15 +08:00
|
|
|
import com.android.build.gradle.BaseExtension
|
2021-09-09 20:19:49 -07:00
|
|
|
import com.android.build.gradle.internal.dsl.BaseAppModuleExtension
|
|
|
|
import org.apache.tools.ant.filters.FixCrLfFilter
|
2021-09-08 00:45:15 +08:00
|
|
|
import org.gradle.api.Action
|
|
|
|
import org.gradle.api.JavaVersion
|
|
|
|
import org.gradle.api.Project
|
2022-01-09 02:22:34 +08:00
|
|
|
import org.gradle.api.tasks.Delete
|
2021-09-09 20:19:49 -07:00
|
|
|
import org.gradle.api.tasks.StopExecutionException
|
|
|
|
import org.gradle.api.tasks.Sync
|
|
|
|
import org.gradle.kotlin.dsl.filter
|
2022-01-09 02:22:34 +08:00
|
|
|
import org.gradle.kotlin.dsl.named
|
2021-12-14 21:30:15 +08:00
|
|
|
import java.io.*
|
2021-09-09 20:19:49 -07:00
|
|
|
import java.util.*
|
2021-12-14 21:30:15 +08:00
|
|
|
import java.util.zip.Deflater
|
|
|
|
import java.util.zip.ZipEntry
|
|
|
|
import java.util.zip.ZipFile
|
|
|
|
import java.util.zip.ZipOutputStream
|
|
|
|
|
|
|
|
private fun Project.androidBase(configure: Action<BaseExtension>) =
|
|
|
|
extensions.configure("android", configure)
|
2021-09-09 20:19:49 -07:00
|
|
|
|
2021-12-14 21:30:15 +08:00
|
|
|
private fun Project.android(configure: Action<BaseAppModuleExtension>) =
|
2021-09-09 20:19:49 -07:00
|
|
|
extensions.configure("android", configure)
|
2021-09-08 00:45:15 +08:00
|
|
|
|
2021-12-14 21:30:15 +08:00
|
|
|
private val Project.android: BaseAppModuleExtension
|
|
|
|
get() = extensions.getByName("android") as BaseAppModuleExtension
|
2021-09-08 00:45:15 +08:00
|
|
|
|
|
|
|
fun Project.setupCommon() {
|
2021-12-14 21:30:15 +08:00
|
|
|
androidBase {
|
2022-05-09 20:53:47 -07:00
|
|
|
compileSdkVersion(32)
|
|
|
|
buildToolsVersion = "32.0.0"
|
2022-01-27 01:46:00 -08:00
|
|
|
ndkPath = "$sdkDirectory/ndk/magisk"
|
2021-09-08 00:45:15 +08:00
|
|
|
|
|
|
|
defaultConfig {
|
|
|
|
minSdk = 21
|
2022-05-09 20:53:47 -07:00
|
|
|
targetSdk = 32
|
2021-09-08 00:45:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
compileOptions {
|
|
|
|
sourceCompatibility = JavaVersion.VERSION_11
|
|
|
|
targetCompatibility = JavaVersion.VERSION_11
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-09 20:19:49 -07:00
|
|
|
private fun Project.setupAppCommon() {
|
2021-09-08 00:45:15 +08:00
|
|
|
setupCommon()
|
2021-09-09 20:19:49 -07:00
|
|
|
|
2021-09-08 00:45:15 +08:00
|
|
|
android {
|
|
|
|
signingConfigs {
|
|
|
|
create("config") {
|
|
|
|
Config["keyStore"]?.also {
|
|
|
|
storeFile = rootProject.file(it)
|
|
|
|
storePassword = Config["keyStorePass"]
|
|
|
|
keyAlias = Config["keyAlias"]
|
|
|
|
keyPassword = Config["keyPass"]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
buildTypes {
|
|
|
|
signingConfigs.getByName("config").also {
|
|
|
|
getByName("debug") {
|
|
|
|
signingConfig = if (it.storeFile?.exists() == true) it
|
|
|
|
else signingConfigs.getByName("debug")
|
|
|
|
}
|
|
|
|
getByName("release") {
|
|
|
|
signingConfig = if (it.storeFile?.exists() == true) it
|
|
|
|
else signingConfigs.getByName("debug")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-12-14 21:30:15 +08:00
|
|
|
lint {
|
2021-09-08 00:45:15 +08:00
|
|
|
disable += "MissingTranslation"
|
|
|
|
}
|
2021-12-14 21:30:15 +08:00
|
|
|
|
|
|
|
dependenciesInfo {
|
|
|
|
includeInApk = false
|
|
|
|
}
|
2021-09-08 00:45:15 +08:00
|
|
|
}
|
|
|
|
}
|
2021-09-09 20:19:49 -07:00
|
|
|
|
|
|
|
fun Project.setupApp() {
|
|
|
|
setupAppCommon()
|
|
|
|
|
|
|
|
val syncLibs = tasks.register("syncLibs", Sync::class.java) {
|
|
|
|
into("src/main/jniLibs")
|
|
|
|
into("armeabi-v7a") {
|
|
|
|
from(rootProject.file("native/out/armeabi-v7a")) {
|
2022-03-17 03:15:39 -07:00
|
|
|
include("busybox", "magiskboot", "magiskinit", "magiskpolicy", "magisk")
|
2021-09-09 20:19:49 -07:00
|
|
|
rename { if (it == "magisk") "libmagisk32.so" else "lib$it.so" }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
into("x86") {
|
|
|
|
from(rootProject.file("native/out/x86")) {
|
2022-03-17 03:15:39 -07:00
|
|
|
include("busybox", "magiskboot", "magiskinit", "magiskpolicy", "magisk")
|
2021-09-09 20:19:49 -07:00
|
|
|
rename { if (it == "magisk") "libmagisk32.so" else "lib$it.so" }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
into("arm64-v8a") {
|
|
|
|
from(rootProject.file("native/out/arm64-v8a")) {
|
2022-03-17 03:15:39 -07:00
|
|
|
include("busybox", "magiskboot", "magiskinit", "magiskpolicy", "magisk")
|
2021-09-09 20:19:49 -07:00
|
|
|
rename { if (it == "magisk") "libmagisk64.so" else "lib$it.so" }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
into("x86_64") {
|
|
|
|
from(rootProject.file("native/out/x86_64")) {
|
2022-03-17 03:15:39 -07:00
|
|
|
include("busybox", "magiskboot", "magiskinit", "magiskpolicy", "magisk")
|
2021-09-09 20:19:49 -07:00
|
|
|
rename { if (it == "magisk") "libmagisk64.so" else "lib$it.so" }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
onlyIf {
|
2022-03-17 03:15:39 -07:00
|
|
|
if (inputs.sourceFiles.files.size != 20)
|
2021-09-09 20:19:49 -07:00
|
|
|
throw StopExecutionException("Please build binaries first! (./build.py binary)")
|
|
|
|
true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
val syncAssets = tasks.register("syncAssets", Sync::class.java) {
|
|
|
|
dependsOn(syncLibs)
|
|
|
|
inputs.property("version", Config.version)
|
|
|
|
inputs.property("versionCode", Config.versionCode)
|
|
|
|
into("src/main/assets")
|
|
|
|
from(rootProject.file("scripts")) {
|
2022-01-27 05:24:05 -08:00
|
|
|
include("util_functions.sh", "boot_patch.sh", "addon.d.sh")
|
|
|
|
include("uninstaller.sh", "module_installer.sh")
|
2021-09-09 20:19:49 -07:00
|
|
|
}
|
2022-01-13 02:24:02 -08:00
|
|
|
from(rootProject.file("tools/bootctl"))
|
2021-09-09 20:19:49 -07:00
|
|
|
into("chromeos") {
|
|
|
|
from(rootProject.file("tools/futility"))
|
|
|
|
from(rootProject.file("tools/keys")) {
|
|
|
|
include("kernel_data_key.vbprivk", "kernel.keyblock")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
filesMatching("**/util_functions.sh") {
|
|
|
|
filter {
|
|
|
|
it.replace(
|
|
|
|
"#MAGISK_VERSION_STUB",
|
|
|
|
"MAGISK_VER='${Config.version}'\nMAGISK_VER_CODE=${Config.versionCode}"
|
|
|
|
)
|
|
|
|
}
|
|
|
|
filter<FixCrLfFilter>("eol" to FixCrLfFilter.CrLf.newInstance("lf"))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
val syncResources = tasks.register("syncResources", Sync::class.java) {
|
|
|
|
dependsOn(syncAssets)
|
|
|
|
into("src/main/resources/META-INF/com/google/android")
|
|
|
|
from(rootProject.file("scripts/update_binary.sh")) {
|
|
|
|
rename { "update-binary" }
|
|
|
|
}
|
|
|
|
from(rootProject.file("scripts/flash_script.sh")) {
|
|
|
|
rename { "updater-script" }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
android.applicationVariants.all {
|
2021-12-14 21:30:15 +08:00
|
|
|
preBuildProvider.get().dependsOn(syncResources)
|
|
|
|
|
2021-09-09 20:19:49 -07:00
|
|
|
val keysDir = rootProject.file("tools/keys")
|
|
|
|
val outSrcDir = File(buildDir, "generated/source/keydata/$name")
|
|
|
|
val outSrc = File(outSrcDir, "com/topjohnwu/magisk/signing/KeyData.java")
|
|
|
|
|
|
|
|
val genSrcTask = tasks.register("generate${name.capitalize(Locale.ROOT)}KeyData") {
|
|
|
|
inputs.dir(keysDir)
|
|
|
|
outputs.file(outSrc)
|
|
|
|
doLast {
|
|
|
|
genKeyData(keysDir, outSrc)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
registerJavaGeneratingTask(genSrcTask, outSrcDir)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fun Project.setupStub() {
|
|
|
|
setupAppCommon()
|
|
|
|
|
|
|
|
android.applicationVariants.all {
|
2021-12-14 21:30:15 +08:00
|
|
|
val variantCapped = name.capitalize(Locale.ROOT)
|
|
|
|
val variantLowered = name.toLowerCase(Locale.ROOT)
|
|
|
|
val manifest = file("src/${variantLowered}/AndroidManifest.xml")
|
|
|
|
val outSrcDir = File(buildDir, "generated/source/obfuscate/${variantLowered}")
|
2021-09-09 20:19:49 -07:00
|
|
|
val templateDir = file("template")
|
2021-12-14 21:30:15 +08:00
|
|
|
val aapt = File(android.sdkDirectory, "build-tools/${android.buildToolsVersion}/aapt2")
|
|
|
|
val apk = File(buildDir, "intermediates/processed_res/" +
|
|
|
|
"${variantLowered}/out/resources-${variantLowered}.ap_")
|
|
|
|
val apkTmp = File("${apk}.tmp")
|
2021-09-09 20:19:49 -07:00
|
|
|
|
2021-12-14 21:30:15 +08:00
|
|
|
val genManifestTask = tasks.register("generate${variantCapped}ObfuscatedManifest") {
|
2021-09-09 20:19:49 -07:00
|
|
|
doLast {
|
|
|
|
val xml = genStubManifest(templateDir, outSrcDir)
|
2021-12-14 21:30:15 +08:00
|
|
|
manifest.parentFile.mkdirs()
|
2021-09-09 20:19:49 -07:00
|
|
|
PrintStream(manifest).use {
|
|
|
|
it.print(xml)
|
|
|
|
}
|
2021-12-14 21:30:15 +08:00
|
|
|
}
|
|
|
|
}
|
2021-12-29 17:09:59 +08:00
|
|
|
tasks.getByPath(":stub:process${variantCapped}MainManifest").dependsOn(genManifestTask)
|
2021-09-09 20:19:49 -07:00
|
|
|
|
2021-12-14 21:30:15 +08:00
|
|
|
val genSrcTask = tasks.register("generate${variantCapped}ObfuscatedSources") {
|
|
|
|
dependsOn(":stub:process${variantCapped}Resources")
|
2021-12-29 17:09:59 +08:00
|
|
|
inputs.file(apk)
|
|
|
|
outputs.file(apk)
|
2021-12-14 21:30:15 +08:00
|
|
|
doLast {
|
|
|
|
exec {
|
|
|
|
commandLine(aapt, "optimize", "-o", apkTmp, "--collapse-resource-names", apk)
|
|
|
|
}
|
2021-09-09 20:19:49 -07:00
|
|
|
|
2021-12-14 21:30:15 +08:00
|
|
|
val buffer = ByteArrayOutputStream(apk.length().toInt())
|
|
|
|
val newApk = ZipOutputStream(FileOutputStream(apk))
|
|
|
|
ZipFile(apkTmp).use {
|
|
|
|
newApk.use { new ->
|
|
|
|
new.setLevel(Deflater.BEST_COMPRESSION)
|
|
|
|
new.putNextEntry(ZipEntry("AndroidManifest.xml"))
|
|
|
|
it.getInputStream(it.getEntry("AndroidManifest.xml")).transferTo(new)
|
|
|
|
new.closeEntry()
|
|
|
|
new.finish()
|
2021-09-09 20:19:49 -07:00
|
|
|
}
|
2021-12-14 21:30:15 +08:00
|
|
|
ZipOutputStream(buffer).use { arsc ->
|
|
|
|
arsc.setLevel(Deflater.BEST_COMPRESSION)
|
|
|
|
arsc.putNextEntry(ZipEntry("resources.arsc"))
|
|
|
|
it.getInputStream(it.getEntry("resources.arsc")).transferTo(arsc)
|
|
|
|
arsc.closeEntry()
|
|
|
|
arsc.finish()
|
2021-09-09 20:19:49 -07:00
|
|
|
}
|
|
|
|
}
|
2021-12-14 21:30:15 +08:00
|
|
|
apkTmp.delete()
|
|
|
|
genEncryptedResources(ByteArrayInputStream(buffer.toByteArray()), outSrcDir)
|
2021-09-09 20:19:49 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
registerJavaGeneratingTask(genSrcTask, outSrcDir)
|
|
|
|
}
|
2021-12-14 21:30:15 +08:00
|
|
|
// Override optimizeReleaseResources task
|
|
|
|
tasks.whenTaskAdded {
|
|
|
|
val apk = File(buildDir, "intermediates/processed_res/" +
|
|
|
|
"release/out/resources-release.ap_")
|
|
|
|
val optRes = File(buildDir, "intermediates/optimized_processed_res/" +
|
|
|
|
"release/resources-release-optimize.ap_")
|
|
|
|
if (name == "optimizeReleaseResources") {
|
|
|
|
doLast { apk.copyTo(optRes, true) }
|
|
|
|
}
|
|
|
|
}
|
2022-01-09 02:22:34 +08:00
|
|
|
tasks.named<Delete>("clean") {
|
|
|
|
delete.addAll(listOf("src/debug/AndroidManifest.xml", "src/release/AndroidManifest.xml"))
|
|
|
|
}
|
2021-09-09 20:19:49 -07:00
|
|
|
}
|