From 2e2a6c33be676b0d6be5fc7c686f269fc2ee5404 Mon Sep 17 00:00:00 2001 From: SuperMonster003 Date: Sat, 7 Mar 2026 13:13:30 +0800 Subject: [PATCH] =?UTF-8?q?6.7.0=20-=20Alpha23=20-=20=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E9=80=82=E9=85=8D=20Gradle=209=20(=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E4=BF=9D=E7=95=99=20Gradle=208=20=E5=85=BC=E5=AE=B9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 154 ++++++++++++------ .../src/main/kotlin/org/autojs/build/Utils.kt | 89 ++++++++-- libs/imagequant/build.gradle.kts | 1 - libs/rapidocr/build.gradle.kts | 1 - modules/apk-parser/build.gradle.kts | 1 - modules/apk-signer/build.gradle.kts | 3 +- modules/color-picker/build.gradle.kts | 1 - modules/jieba-analysis/build.gradle.kts | 5 +- .../build.gradle.kts | 1 - modules/material-dialogs/build.gradle.kts | 1 - plugin-api/paddle-ocr-api/build.gradle.kts | 1 - plugin-api/paddle-ocr-engine/build.gradle.kts | 1 - 12 files changed, 182 insertions(+), 77 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index eb4d8f64..2b2e3d72 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,7 +1,6 @@ @file:Suppress("SpellCheckingInspection") -import com.android.build.gradle.internal.api.ApplicationVariantImpl -import com.android.build.gradle.internal.api.BaseVariantOutputImpl +import com.android.build.api.variant.FilterConfiguration import org.gradle.kotlin.dsl.support.uppercaseFirstChar import kotlin.text.RegexOption.IGNORE_CASE @@ -12,17 +11,18 @@ plugins { id("org.autojs.build.jvm-convention") id("com.android.application") id("com.google.devtools.ksp") - id("org.jetbrains.kotlin.android") /* kotlin("android") */ id("idea") } idea { module { - excludeDirs.addAll(listOf( - file("$rootDir/app/src/main/java/com/stardust/"), - file("$rootDir/app/src/main/assets/modules/obsolete/"), - file("$rootDir/app/src/main/assets-app/js-beautify/"), - )) + excludeDirs.addAll( + listOf( + file("$rootDir/app/src/main/java/com/stardust/"), + file("$rootDir/app/src/main/assets/modules/obsolete/"), + file("$rootDir/app/src/main/assets-app/js-beautify/"), + ) + ) } } @@ -569,20 +569,37 @@ android { // ! The assets division idea was accepted, and it wouldn't hurt to try. :) // ! zh-CN: 资产隔离的想法可以被接受, 毕竟试一下也无妨. [笑脸符号] + // @Archived by JetBrains AI Assistant (GPT-5.3-Codex (xhigh)) on Mar 7, 2026. + // # getByName("main") { + // # assets.srcDirs("src/main/assets") + // # } + // # getByName("release") { + // # java.srcDirs("src/release/java") + // # } + // # getByName("debug") { + // # java.srcDirs("src/debug/java") + // # } + // # getByName(flavorNameApp) { + // # assets.srcDirs("src/main/assets-$flavorNameApp") + // # } + // # getByName(flavorNameInrt) { + // # assets.srcDirs("src/main/assets-$flavorNameInrt") + // # } + // ! getByName("main") { - assets.srcDirs("src/main/assets") + assets.directories.add("src/main/assets") } getByName("release") { - java.srcDirs("src/release/java") + java.directories.add("src/release/java") } getByName("debug") { - java.srcDirs("src/debug/java") + java.directories.add("src/debug/java") } getByName(flavorNameApp) { - assets.srcDirs("src/main/assets-$flavorNameApp") + assets.directories.add("src/main/assets-$flavorNameApp") } getByName(flavorNameInrt) { - assets.srcDirs("src/main/assets-$flavorNameInrt") + assets.directories.add("src/main/assets-$flavorNameInrt") } } @@ -651,7 +668,9 @@ android { buildTypes { val proguardFiles = arrayOf( - getDefaultProguardFile("proguard-android.txt"), + // @Archived by JetBrains AI Assistant (GPT-5.3-Codex (xhigh)) on Mar 7, 2026. + // # getDefaultProguardFile("proguard-android.txt"), + getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro", ) val niceSigningConfig = takeIf { signs.isValid }?.let { @@ -686,45 +705,6 @@ android { // # } } - applicationVariants.all { - mergeAssetsProvider.configure { - doLast { - mapOf( - "dir" to outputDir, - "includes" to when (variantName.startsWith(flavorNameInrt)) { - true -> listOf( - "mlkit-google-ocr-models/**/*", - "mlkit_barcode_models/**/*", - "models/**/*", - "modules/obsolete/**/*", - "openccdata/**/*", - "project/**/*", - "android-devices.db", - "autojs.keystore", - "**/prob_emit.txt", // Jieba Analysis (zh-CN: 结巴分词) - "**/dict-chinese-*.db.gzip", // Jieba Analysis (zh-CN: 结巴分词) - ) - else -> listOf( - "declarations/**/*", - "sample/declarations/**/*", - "modules/obsolete/**/*", - ) - }, - ).let { delete(fileTree(it)) } - } - } - - outputs.map { it as BaseVariantOutputImpl }.forEach { - it.outputFileName = run { - val variant = this@all as ApplicationVariantImpl - val autojs = variant.applicationId.replace("^.+\\.(.+)$".toRegex(), "$1") // e.g. autojs6 - val version = variant.versionName.replace("\\s".toRegex(), "-") // e.g. 6.1.0 - val architecture = it.getFilter("ABI") ?: "universal" - val extension = utils.FILE_EXTENSION_APK - "$autojs-v$version-$architecture.$extension".lowercase() - } - } - } splits { // Configures multiple APKs based on ABI. @@ -744,6 +724,74 @@ android { } +androidComponents { + onVariants { variant -> + val variantName = variant.name + val mergeAssetsTaskName = "merge${variantName.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }}Assets" + val isInrtVariant = variantName.startsWith(flavorNameInrt, ignoreCase = true) + + tasks.matching { it.name == mergeAssetsTaskName }.configureEach { + doLast { + val outputDir = when (val dir = javaClass.methods.firstOrNull { + it.name == "getOutputDir" && it.parameterTypes.isEmpty() + }?.invoke(this)) { + is File -> dir + is Directory -> dir.asFile + else -> null + } ?: return@doLast + + val includes = when (isInrtVariant) { + true -> listOf( + "mlkit-google-ocr-models/**/*", + "mlkit_barcode_models/**/*", + "models/**/*", + "modules/obsolete/**/*", + "openccdata/**/*", + "project/**/*", + "android-devices.db", + "autojs.keystore", + "**/prob_emit.txt", // Jieba Analysis + "**/dict-chinese-*.db.gzip", // Jieba Analysis + ) + else -> listOf( + "declarations/**/*", + "sample/declarations/**/*", + "modules/obsolete/**/*", + ) + } + + delete( + fileTree( + mapOf( + "dir" to outputDir, + "includes" to includes, + ) + ) + ) + } + } + + variant.outputs.forEach { output -> + val architecture = output.filters.find { + it.filterType == FilterConfiguration.FilterType.ABI + }?.identifier ?: "universal" + val outputFileNameProperty = output.javaClass.methods.firstOrNull { + it.name == "getOutputFileName" && it.parameterTypes.isEmpty() + }?.invoke(output) as? Property<*> + + @Suppress("UNCHECKED_CAST") + (outputFileNameProperty as? Property)?.set( + variant.applicationId.zip(output.versionName) { appId, versionName -> + val autojs = appId.substringAfterLast('.') + val version = versionName.replace("\\s".toRegex(), "-") + val extension = utils.FILE_EXTENSION_APK + "$autojs-v$version-$architecture.$extension".lowercase() + } + ) + } + } +} + tasks { withType(JavaCompile::class.java) { options.encoding = "UTF-8" diff --git a/build-logic/convention/src/main/kotlin/org/autojs/build/Utils.kt b/build-logic/convention/src/main/kotlin/org/autojs/build/Utils.kt index 0ea0622a..d734f4c4 100644 --- a/build-logic/convention/src/main/kotlin/org/autojs/build/Utils.kt +++ b/build-logic/convention/src/main/kotlin/org/autojs/build/Utils.kt @@ -229,6 +229,70 @@ object Utils { private fun capitalize(s: String) = "${s[0].uppercase(Locale.getDefault())}${s.substring(1)}" + private fun parseBooleanOrNull(value: String?): Boolean? = when (value?.trim()?.lowercase(Locale.getDefault())) { + "1", "true", "yes", "on" -> true + "0", "false", "no", "off" -> false + else -> null + } + + private fun parseMajorVersionOrNull(version: String?): Int? { + if (version.isNullOrBlank()) return null + return version.substringBefore('.').substringBefore('-').toIntOrNull() + } + + private fun detectAgpVersionOrNull(): String? = runCatching { + Class.forName("com.android.Version") + .getField("ANDROID_GRADLE_PLUGIN_VERSION") + .get(null) as? String + }.getOrNull() + + private fun shouldUseBuiltInKotlin(project: Project): Boolean { + parseBooleanOrNull(project.providers.gradleProperty("useBuiltInKotlin").orNull)?.let { overridden -> + project.logInfo("[JvmConv] useBuiltInKotlin overridden by gradle property to '$overridden' for '${project.path}'") + return overridden + } + + val agpVersion = detectAgpVersionOrNull() + parseMajorVersionOrNull(agpVersion)?.let { agpMajor -> + val useBuiltIn = agpMajor >= 9 + project.logInfo( + "[JvmConv] AGP version='$agpVersion' (major=$agpMajor), " + + "useBuiltInKotlin='$useBuiltIn' for '${project.path}'" + ) + return useBuiltIn + } + + val gradleVersion = project.gradle.gradleVersion + val gradleMajor = parseMajorVersionOrNull(gradleVersion) ?: 0 + val useBuiltIn = gradleMajor >= 9 + project.logWarn( + "[JvmConv] Failed to determine AGP version; fallback to Gradle version='$gradleVersion' " + + "(major=$gradleMajor), useBuiltInKotlin='$useBuiltIn' for '${project.path}'" + ) + return useBuiltIn + } + + private fun applyKotlinAndroidPluginIfNeeded(project: Project) { + val kotlinAndroidPluginId = "org.jetbrains.kotlin.android" + if (project.plugins.hasPlugin(kotlinAndroidPluginId)) { + project.logInfo("[JvmConv] '$kotlinAndroidPluginId' already applied for '${project.path}'") + return + } + if (shouldUseBuiltInKotlin(project)) { + project.logInfo("[JvmConv] Skip applying '$kotlinAndroidPluginId' (AGP built-in Kotlin) for '${project.path}'") + return + } + + runCatching { + project.pluginManager.apply(kotlinAndroidPluginId) + }.onSuccess { + project.logInfo("[JvmConv] Applied '$kotlinAndroidPluginId' for '${project.path}'") + }.onFailure { + project.logError("[JvmConv] Failed to apply '$kotlinAndroidPluginId' for '${project.path}'", it) + throw it + } + } + // Configure Java/Kotlin target version uniformly for Android modules: // - Android.compileOptions.sourceCompatibility/targetCompatibility = versions.javaVersion // - Kotlin compile tasks jvmTarget = versions.javaVersion level @@ -251,6 +315,7 @@ object Utils { val installer = { project.logInfo("[JvmConv] Detected Android plugin in module='${project.path}', installing configuration") + applyKotlinAndroidPluginIfNeeded(project) System.getProperty("gradle.java.version.select").let { ver -> configureJavaToolchainLanguageLevel(project, ver) @@ -288,17 +353,19 @@ object Utils { } private fun configureKotlinJvmToolchain(project: Project, target: String) { - project.plugins.withId("org.jetbrains.kotlin.android") { - project.extensions.findByName("kotlin")?.let { kotlinExt -> - runCatching { - kotlinExt.javaClass.getMethod("jvmToolchain", Int::class.java) - .invoke(kotlinExt, target.toInt()) - }.onSuccess { - project.logInfo("[JvmConv] Kotlin jvmToolchain set to $target for '${project.path}'") - }.onFailure { - project.logError("[JvmConv] Set Kotlin jvmToolchain failed on '${project.path}': ${it.message}", it) - } - } + val kotlinExt = project.extensions.findByName("kotlin") + if (kotlinExt == null) { + project.logWarn("[JvmConv] Kotlin extension not found in '${project.path}', skip Kotlin jvmToolchain") + return + } + + runCatching { + kotlinExt.javaClass.getMethod("jvmToolchain", Int::class.java) + .invoke(kotlinExt, target.toInt()) + }.onSuccess { + project.logInfo("[JvmConv] Kotlin jvmToolchain set to $target for '${project.path}'") + }.onFailure { + project.logError("[JvmConv] Set Kotlin jvmToolchain failed on '${project.path}': ${it.message}", it) } } diff --git a/libs/imagequant/build.gradle.kts b/libs/imagequant/build.gradle.kts index 9c66a0e2..3fc4f462 100644 --- a/libs/imagequant/build.gradle.kts +++ b/libs/imagequant/build.gradle.kts @@ -3,7 +3,6 @@ plugins { id("org.autojs.build.properties") id("org.autojs.build.jvm-convention") id("com.android.library") - id("org.jetbrains.kotlin.android") } ext { diff --git a/libs/rapidocr/build.gradle.kts b/libs/rapidocr/build.gradle.kts index 2b4f8644..978ee721 100644 --- a/libs/rapidocr/build.gradle.kts +++ b/libs/rapidocr/build.gradle.kts @@ -10,7 +10,6 @@ plugins { id("org.autojs.build.properties") id("org.autojs.build.jvm-convention") id("com.android.library") - id("org.jetbrains.kotlin.android") id("kotlin-parcelize") } diff --git a/modules/apk-parser/build.gradle.kts b/modules/apk-parser/build.gradle.kts index 9875aaf9..6ddb202a 100644 --- a/modules/apk-parser/build.gradle.kts +++ b/modules/apk-parser/build.gradle.kts @@ -2,7 +2,6 @@ plugins { id("org.autojs.build.versions") id("org.autojs.build.jvm-convention") id("com.android.library") - id("kotlin-android") } android { diff --git a/modules/apk-signer/build.gradle.kts b/modules/apk-signer/build.gradle.kts index f5b70587..f9ec75ae 100644 --- a/modules/apk-signer/build.gradle.kts +++ b/modules/apk-signer/build.gradle.kts @@ -2,7 +2,6 @@ plugins { id("org.autojs.build.versions") id("org.autojs.build.jvm-convention") id("com.android.library") - id("kotlin-android") } android { @@ -17,7 +16,7 @@ android { sourceSets { getByName("main") { - java.srcDirs("src/main/java") + java.directories.add("src/main/java") } } diff --git a/modules/color-picker/build.gradle.kts b/modules/color-picker/build.gradle.kts index 9bb07f0a..fa5120fa 100644 --- a/modules/color-picker/build.gradle.kts +++ b/modules/color-picker/build.gradle.kts @@ -2,7 +2,6 @@ plugins { id("org.autojs.build.versions") id("org.autojs.build.jvm-convention") id("com.android.library") - id("kotlin-android") } android { diff --git a/modules/jieba-analysis/build.gradle.kts b/modules/jieba-analysis/build.gradle.kts index 902fa823..500197f3 100644 --- a/modules/jieba-analysis/build.gradle.kts +++ b/modules/jieba-analysis/build.gradle.kts @@ -2,7 +2,6 @@ plugins { id("org.autojs.build.versions") id("org.autojs.build.jvm-convention") id("com.android.library") - id("kotlin-android") } android { @@ -21,9 +20,9 @@ android { sourceSets { named("main") { // 主 Java/Kotlin 目录 - java.setSrcDirs(listOf("src/main/java")) + java.directories.add("src/main/java") // 将资源文件夹指定为 assets 目录 - assets.setSrcDirs(listOf("src/main/assets")) + assets.directories.add("src/main/assets") } } diff --git a/modules/material-date-time-picker/build.gradle.kts b/modules/material-date-time-picker/build.gradle.kts index d17322ba..a15a5693 100644 --- a/modules/material-date-time-picker/build.gradle.kts +++ b/modules/material-date-time-picker/build.gradle.kts @@ -2,7 +2,6 @@ plugins { id("org.autojs.build.versions") id("org.autojs.build.jvm-convention") id("com.android.library") - id("kotlin-android") } android { diff --git a/modules/material-dialogs/build.gradle.kts b/modules/material-dialogs/build.gradle.kts index 698d234f..8a64947a 100644 --- a/modules/material-dialogs/build.gradle.kts +++ b/modules/material-dialogs/build.gradle.kts @@ -2,7 +2,6 @@ plugins { id("org.autojs.build.versions") id("org.autojs.build.jvm-convention") id("com.android.library") - id("kotlin-android") } android { diff --git a/plugin-api/paddle-ocr-api/build.gradle.kts b/plugin-api/paddle-ocr-api/build.gradle.kts index 47755234..a5644af5 100644 --- a/plugin-api/paddle-ocr-api/build.gradle.kts +++ b/plugin-api/paddle-ocr-api/build.gradle.kts @@ -2,7 +2,6 @@ plugins { id("org.autojs.build.versions") id("org.autojs.build.jvm-convention") id("com.android.library") - id("org.jetbrains.kotlin.android") kotlin("plugin.parcelize") } diff --git a/plugin-api/paddle-ocr-engine/build.gradle.kts b/plugin-api/paddle-ocr-engine/build.gradle.kts index 003597bc..2646b9d9 100644 --- a/plugin-api/paddle-ocr-engine/build.gradle.kts +++ b/plugin-api/paddle-ocr-engine/build.gradle.kts @@ -2,7 +2,6 @@ plugins { id("org.autojs.build.versions") id("org.autojs.build.jvm-convention") id("com.android.library") - id("org.jetbrains.kotlin.android") kotlin("plugin.parcelize") }