From 597e0a86a350d0c5634132155870ba738355a51f Mon Sep 17 00:00:00 2001 From: Jarvanmo Date: Thu, 7 May 2026 11:57:33 +0800 Subject: [PATCH 1/2] migrate groovy to kts --- .github/workflows/build_test.yml | 25 +++ android/{build.gradle => build.gradle.copy} | 0 android/build.gradle.kts | 161 ++++++++++++++++++ packages/fluwx/android/build.gradle | 150 ---------------- packages/fluwx/android/build.gradle.kts | 161 ++++++++++++++++++ packages/fluwx_no_pay/android/build.gradle | 149 ---------------- .../fluwx_no_pay/android/build.gradle.kts | 161 ++++++++++++++++++ 7 files changed, 508 insertions(+), 299 deletions(-) rename android/{build.gradle => build.gradle.copy} (100%) create mode 100644 android/build.gradle.kts delete mode 100644 packages/fluwx/android/build.gradle create mode 100644 packages/fluwx/android/build.gradle.kts delete mode 100644 packages/fluwx_no_pay/android/build.gradle create mode 100644 packages/fluwx_no_pay/android/build.gradle.kts diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 0bdf9cbe..0a5b710b 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -186,3 +186,28 @@ jobs: run: | cd packages/fluwx/example flutter build apk --debug + # ────────────────────────────────────────────── + android_no_pay: + name: Android build (fluwx_no_pay) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Set up JDK 21 + uses: actions/setup-java@v3 + with: + java-version: '21' + distribution: 'temurin' + - uses: subosito/flutter-action@v2 + with: + channel: stable + + - name: Install Melos + run: dart pub global activate melos 7.5.1 + + - name: Bootstrap + run: melos bootstrap + + - name: Build Android APK (fluwx example) + run: | + cd packages/fluwx_no_pay/example + flutter build apk --debug diff --git a/android/build.gradle b/android/build.gradle.copy similarity index 100% rename from android/build.gradle rename to android/build.gradle.copy diff --git a/android/build.gradle.kts b/android/build.gradle.kts new file mode 100644 index 00000000..df565706 --- /dev/null +++ b/android/build.gradle.kts @@ -0,0 +1,161 @@ +import org.yaml.snakeyaml.Yaml + +group = "com.jarvan.fluwx" +version = "1.0-SNAPSHOT" + +buildscript { + val kotlinVersion = "2.1.0" + repositories { + google() + mavenCentral() + } + + dependencies { + classpath("com.android.tools.build:gradle:8.9.1") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") + classpath("org.yaml:snakeyaml:2.6") + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +apply(plugin = "com.android.library") +apply(plugin = "kotlin-android") + +android { + namespace = "com.jarvan.fluwx" + compileSdk = 34 + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = "17" + } + + sourceSets { + getByName("main") { + java.srcDirs("src/main/kotlin", "${layout.buildDirectory.get().asFile}/generated/src/kotlin") + } + getByName("test") { + java.srcDirs("src/test/kotlin") + } + } + + defaultConfig { + minSdk = 24 + consumerProguardFiles("consumer-proguard-rules.txt") + } + + dependencies { + api("com.tencent.mm.opensdk:wechat-sdk-android:6.8.34") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") + implementation("id.zelory:compressor:3.0.1") + implementation("com.squareup.okhttp3:okhttp:5.2.1") + testImplementation("org.jetbrains.kotlin:kotlin-test") + testImplementation("org.mockito:mockito-core:5.0.0") + } + + testOptions { + unitTests.all { + it.useJUnitPlatform() + it.testLogging { + events("passed", "skipped", "failed", "standardOut", "standardError") + outputs.upToDateWhen { false } + showStandardStreams = true + } + } + } +} + +fun Project.loadPubspec(): Map { + val yamlDir = if (rootProject.hasProperty("yamlDir")) rootProject.ext["yamlDir"] as String else "" + val pubspecPath = "${rootProject.projectDir.parent}${File.separator}${yamlDir}pubspec.yaml" + val pubspecFile = if (file(pubspecPath).exists()) { + File(pubspecPath) + } else { + val parentDir = File(file(".").absolutePath).parentFile + File(parentDir, "pubspec.yaml") + } + + @Suppress("UNCHECKED_CAST") + return Yaml().load>(pubspecFile.inputStream()) +} + +fun Project.generateFluwxConfigurations( + interruptWeChatRequestByFluwx: String, + flutterActivity: String, + enableLogging: String, +) { + val generateFolder = File("${layout.buildDirectory.get().asFile}/generated/src/kotlin/com/jarvan/fluwx") + val template = """ + package com.jarvan.fluwx + + // auto generated + internal object FluwxConfigurations { + val flutterActivity: String = "&&flutterActivity&&" + val enableLogging: Boolean = &&enableLogging&& + val interruptWeChatRequestByFluwx: Boolean = &&interruptWeChatRequestByFluwx&& + } + """.trimIndent() + + if (!generateFolder.exists()) { + generateFolder.mkdirs() + } + + val source = template + .replace("&&interruptWeChatRequestByFluwx&&", interruptWeChatRequestByFluwx) + .replace("&&flutterActivity&&", flutterActivity) + .replace("&&enableLogging&&", enableLogging) + File("${generateFolder.absolutePath}/FluwxConfigurations.kt").writeText(source) +} + +tasks.register("generateFluwxHelperFile") { + doFirst { + val config = loadPubspec() + @Suppress("UNCHECKED_CAST") + val fluwx = config["fluwx"] as? Map + var enableLogging = "false" + var interruptWeChatRequestByFluwx = "true" + var flutterActivity = "" + + if (fluwx != null) { + @Suppress("UNCHECKED_CAST") + val androidConfig = fluwx["android"] as? Map + if (androidConfig != null) { + val iwr = androidConfig["interrupt_wx_request"] + if (iwr != null && (iwr == "true" || iwr == "false")) { + interruptWeChatRequestByFluwx = iwr as String + } + val activity = androidConfig["flutter_activity"] + if (activity != null) { + flutterActivity = activity as String + } + } + + val logging = fluwx["debug_logging"] + if ("$logging" == "true" || "$logging" == "false") { + enableLogging = "$logging" + } + } + + generateFluwxConfigurations(interruptWeChatRequestByFluwx, flutterActivity, enableLogging) + } +} + +configure { + libraryVariants.configureEach { + registerGeneratedResFolders( + project.files(File("${layout.buildDirectory.get().asFile}/generated/src/kotlin/com/jarvan/fluwx")) + .builtBy(tasks.named("generateFluwxHelperFile")) + ) + } +} diff --git a/packages/fluwx/android/build.gradle b/packages/fluwx/android/build.gradle deleted file mode 100644 index 2bae6799..00000000 --- a/packages/fluwx/android/build.gradle +++ /dev/null @@ -1,150 +0,0 @@ -import org.yaml.snakeyaml.Yaml - -group 'com.jarvan.fluwx' -version '1.0-SNAPSHOT' - -buildscript { - ext.kotlin_version = '2.1.0' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath "com.android.tools.build:gradle:8.9.1" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "org.yaml:snakeyaml:2.0" - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -apply plugin: 'com.android.library' -apply plugin: 'kotlin-android' - -android { - if (project.android.hasProperty("namespace")) { - namespace 'com.jarvan.fluwx' - } - - compileSdk 34 - - compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 - } - - kotlinOptions { - jvmTarget = '11' - } - - sourceSets { - // src/main/kotlin 是指向 _shared 的 symlink,Gradle 通过它直接找到源文件 - // 只需额外声明生成代码目录和 res / test 路径 - main.java.srcDirs += ["${buildDir}/generated/src/kotlin"] - main.res.srcDirs += ['../../_shared/android/src/main/res'] - test.java.srcDirs += ['../../_shared/android/src/test/kotlin'] - } - - defaultConfig { - minSdkVersion 24 - consumerProguardFiles 'consumer-proguard-rules.txt' - } - - dependencies { - api 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.34' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2' - implementation 'id.zelory:compressor:3.0.1' - implementation 'com.squareup.okhttp3:okhttp:5.2.1' - testImplementation 'org.jetbrains.kotlin:kotlin-test' - testImplementation 'org.mockito:mockito-core:5.0.0' - } - - testOptions { - unitTests.all { - useJUnitPlatform() - testLogging { - events "passed", "skipped", "failed", "standardOut", "standardError" - outputs.upToDateWhen { false } - showStandardStreams = true - } - } - } -} - -Map loadPubspec() { - File pubspecFile - def yamlDir = rootProject.hasProperty('yamlDir') ? rootProject.ext.yamlDir : '' - def pubspecPath = rootProject.projectDir.parent + File.separator + yamlDir + "pubspec.yaml" - if (file(pubspecPath).exists()) { - pubspecFile = new File(pubspecPath) - } else { - // fallback:build.gradle 所在目录的父目录(即 packages/fluwx/) - def currentGradleFileDir = file(".").absolutePath - def parentDir = new File(currentGradleFileDir).getParentFile() - pubspecFile = new File(parentDir, "pubspec.yaml") - } - InputStream input = new FileInputStream(pubspecFile) - Yaml yaml = new Yaml() - return (Map) yaml.load(input) -} - -tasks.register("generateFluwxHelperFile") { - doFirst { - Map config = loadPubspec() - Map fluwx = (Map) config.get("fluwx") - String enableLogging = "false" - String interruptWeChatRequestByFluwx = "true" - String flutterActivity = "" - if (fluwx) { - Map android = (Map) fluwx.get("android") - if (android) { - def iwr = android.get("interrupt_wx_request") - if (iwr && iwr == "true" || iwr == "false") { - interruptWeChatRequestByFluwx = (String) iwr - } - def activity = android.get("flutter_activity") - if (activity) { - flutterActivity = (String) activity - } - } - def logging = fluwx.get("debug_logging") - if ("${logging}" == "true" || "${logging}" == "false") { - enableLogging = "${logging}" - } - } - generateFluwxConfigurations(interruptWeChatRequestByFluwx, flutterActivity, enableLogging) - } -} - -def generateFluwxConfigurations(String interruptWeChatRequestByFluwx, String flutterActivity, String enableLogging) { - File generateFolder = new File("${buildDir}/generated/src/kotlin/com/jarvan/fluwx") - String template = "package com.jarvan.fluwx\n\n" + - "// auto generated\n" + - "internal object FluwxConfigurations {\n" + - " val flutterActivity: String = \"&&flutterActivity&&\"\n" + - " val enableLogging: Boolean = &&enableLogging&&\n" + - " val interruptWeChatRequestByFluwx: Boolean = &&interruptWeChatRequestByFluwx&&\n" + - "}" - if (!generateFolder.exists()) { - generateFolder.mkdirs() - } - String source = template - .replace("&&interruptWeChatRequestByFluwx&&", interruptWeChatRequestByFluwx) - .replace("&&flutterActivity&&", flutterActivity) - .replace("&&enableLogging&&", enableLogging) - file("${generateFolder.absolutePath}/FluwxConfigurations.kt").text = source -} - -android.libraryVariants.configureEach { - it.registerGeneratedResFolders( - project.files(new File("${buildDir}/generated/src/kotlin/com/jarvan/fluwx")) - .builtBy(generateFluwxHelperFile) - ) -} diff --git a/packages/fluwx/android/build.gradle.kts b/packages/fluwx/android/build.gradle.kts new file mode 100644 index 00000000..df565706 --- /dev/null +++ b/packages/fluwx/android/build.gradle.kts @@ -0,0 +1,161 @@ +import org.yaml.snakeyaml.Yaml + +group = "com.jarvan.fluwx" +version = "1.0-SNAPSHOT" + +buildscript { + val kotlinVersion = "2.1.0" + repositories { + google() + mavenCentral() + } + + dependencies { + classpath("com.android.tools.build:gradle:8.9.1") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") + classpath("org.yaml:snakeyaml:2.6") + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +apply(plugin = "com.android.library") +apply(plugin = "kotlin-android") + +android { + namespace = "com.jarvan.fluwx" + compileSdk = 34 + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = "17" + } + + sourceSets { + getByName("main") { + java.srcDirs("src/main/kotlin", "${layout.buildDirectory.get().asFile}/generated/src/kotlin") + } + getByName("test") { + java.srcDirs("src/test/kotlin") + } + } + + defaultConfig { + minSdk = 24 + consumerProguardFiles("consumer-proguard-rules.txt") + } + + dependencies { + api("com.tencent.mm.opensdk:wechat-sdk-android:6.8.34") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") + implementation("id.zelory:compressor:3.0.1") + implementation("com.squareup.okhttp3:okhttp:5.2.1") + testImplementation("org.jetbrains.kotlin:kotlin-test") + testImplementation("org.mockito:mockito-core:5.0.0") + } + + testOptions { + unitTests.all { + it.useJUnitPlatform() + it.testLogging { + events("passed", "skipped", "failed", "standardOut", "standardError") + outputs.upToDateWhen { false } + showStandardStreams = true + } + } + } +} + +fun Project.loadPubspec(): Map { + val yamlDir = if (rootProject.hasProperty("yamlDir")) rootProject.ext["yamlDir"] as String else "" + val pubspecPath = "${rootProject.projectDir.parent}${File.separator}${yamlDir}pubspec.yaml" + val pubspecFile = if (file(pubspecPath).exists()) { + File(pubspecPath) + } else { + val parentDir = File(file(".").absolutePath).parentFile + File(parentDir, "pubspec.yaml") + } + + @Suppress("UNCHECKED_CAST") + return Yaml().load>(pubspecFile.inputStream()) +} + +fun Project.generateFluwxConfigurations( + interruptWeChatRequestByFluwx: String, + flutterActivity: String, + enableLogging: String, +) { + val generateFolder = File("${layout.buildDirectory.get().asFile}/generated/src/kotlin/com/jarvan/fluwx") + val template = """ + package com.jarvan.fluwx + + // auto generated + internal object FluwxConfigurations { + val flutterActivity: String = "&&flutterActivity&&" + val enableLogging: Boolean = &&enableLogging&& + val interruptWeChatRequestByFluwx: Boolean = &&interruptWeChatRequestByFluwx&& + } + """.trimIndent() + + if (!generateFolder.exists()) { + generateFolder.mkdirs() + } + + val source = template + .replace("&&interruptWeChatRequestByFluwx&&", interruptWeChatRequestByFluwx) + .replace("&&flutterActivity&&", flutterActivity) + .replace("&&enableLogging&&", enableLogging) + File("${generateFolder.absolutePath}/FluwxConfigurations.kt").writeText(source) +} + +tasks.register("generateFluwxHelperFile") { + doFirst { + val config = loadPubspec() + @Suppress("UNCHECKED_CAST") + val fluwx = config["fluwx"] as? Map + var enableLogging = "false" + var interruptWeChatRequestByFluwx = "true" + var flutterActivity = "" + + if (fluwx != null) { + @Suppress("UNCHECKED_CAST") + val androidConfig = fluwx["android"] as? Map + if (androidConfig != null) { + val iwr = androidConfig["interrupt_wx_request"] + if (iwr != null && (iwr == "true" || iwr == "false")) { + interruptWeChatRequestByFluwx = iwr as String + } + val activity = androidConfig["flutter_activity"] + if (activity != null) { + flutterActivity = activity as String + } + } + + val logging = fluwx["debug_logging"] + if ("$logging" == "true" || "$logging" == "false") { + enableLogging = "$logging" + } + } + + generateFluwxConfigurations(interruptWeChatRequestByFluwx, flutterActivity, enableLogging) + } +} + +configure { + libraryVariants.configureEach { + registerGeneratedResFolders( + project.files(File("${layout.buildDirectory.get().asFile}/generated/src/kotlin/com/jarvan/fluwx")) + .builtBy(tasks.named("generateFluwxHelperFile")) + ) + } +} diff --git a/packages/fluwx_no_pay/android/build.gradle b/packages/fluwx_no_pay/android/build.gradle deleted file mode 100644 index e8d5b80a..00000000 --- a/packages/fluwx_no_pay/android/build.gradle +++ /dev/null @@ -1,149 +0,0 @@ -import org.yaml.snakeyaml.Yaml - -group 'com.jarvan.fluwx' -version '1.0-SNAPSHOT' - -buildscript { - ext.kotlin_version = '2.1.0' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath "com.android.tools.build:gradle:8.9.1" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "org.yaml:snakeyaml:2.0" - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -apply plugin: 'com.android.library' -apply plugin: 'kotlin-android' - -android { - if (project.android.hasProperty("namespace")) { - namespace 'com.jarvan.fluwx' - } - - compileSdk 34 - - compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 - } - - kotlinOptions { - jvmTarget = '11' - } - - sourceSets { - // src/main/kotlin 是指向 _shared 的 symlink,Gradle 通过它直接找到源文件 - main.java.srcDirs += ["${buildDir}/generated/src/kotlin"] - main.res.srcDirs += ['../../_shared/android/src/main/res'] - test.java.srcDirs += ['../../_shared/android/src/test/kotlin'] - } - - defaultConfig { - minSdkVersion 24 - consumerProguardFiles 'consumer-proguard-rules.txt' - } - - // Android 端 no_pay 无区别,完整引入微信 SDK - dependencies { - api 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.34' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2' - implementation 'id.zelory:compressor:3.0.1' - implementation 'com.squareup.okhttp3:okhttp:5.2.1' - testImplementation 'org.jetbrains.kotlin:kotlin-test' - testImplementation 'org.mockito:mockito-core:5.0.0' - } - - testOptions { - unitTests.all { - useJUnitPlatform() - testLogging { - events "passed", "skipped", "failed", "standardOut", "standardError" - outputs.upToDateWhen { false } - showStandardStreams = true - } - } - } -} - -Map loadPubspec() { - File pubspecFile - def yamlDir = rootProject.hasProperty('yamlDir') ? rootProject.ext.yamlDir : '' - def pubspecPath = rootProject.projectDir.parent + File.separator + yamlDir + "pubspec.yaml" - if (file(pubspecPath).exists()) { - pubspecFile = new File(pubspecPath) - } else { - def currentGradleFileDir = file(".").absolutePath - def parentDir = new File(currentGradleFileDir).getParentFile() - pubspecFile = new File(parentDir, "pubspec.yaml") - } - InputStream input = new FileInputStream(pubspecFile) - Yaml yaml = new Yaml() - return (Map) yaml.load(input) -} - -tasks.register("generateFluwxHelperFile") { - doFirst { - Map config = loadPubspec() - Map fluwx = (Map) config.get("fluwx") - String enableLogging = "false" - String interruptWeChatRequestByFluwx = "true" - String flutterActivity = "" - if (fluwx) { - Map android = (Map) fluwx.get("android") - if (android) { - def iwr = android.get("interrupt_wx_request") - if (iwr && iwr == "true" || iwr == "false") { - interruptWeChatRequestByFluwx = (String) iwr - } - def activity = android.get("flutter_activity") - if (activity) { - flutterActivity = (String) activity - } - } - def logging = fluwx.get("debug_logging") - if ("${logging}" == "true" || "${logging}" == "false") { - enableLogging = "${logging}" - } - } - generateFluwxConfigurations(interruptWeChatRequestByFluwx, flutterActivity, enableLogging) - } -} - -def generateFluwxConfigurations(String interruptWeChatRequestByFluwx, String flutterActivity, String enableLogging) { - File generateFolder = new File("${buildDir}/generated/src/kotlin/com/jarvan/fluwx") - String template = "package com.jarvan.fluwx\n\n" + - "// auto generated\n" + - "internal object FluwxConfigurations {\n" + - " val flutterActivity: String = \"&&flutterActivity&&\"\n" + - " val enableLogging: Boolean = &&enableLogging&&\n" + - " val interruptWeChatRequestByFluwx: Boolean = &&interruptWeChatRequestByFluwx&&\n" + - "}" - if (!generateFolder.exists()) { - generateFolder.mkdirs() - } - String source = template - .replace("&&interruptWeChatRequestByFluwx&&", interruptWeChatRequestByFluwx) - .replace("&&flutterActivity&&", flutterActivity) - .replace("&&enableLogging&&", enableLogging) - file("${generateFolder.absolutePath}/FluwxConfigurations.kt").text = source -} - -android.libraryVariants.configureEach { - it.registerGeneratedResFolders( - project.files(new File("${buildDir}/generated/src/kotlin/com/jarvan/fluwx")) - .builtBy(generateFluwxHelperFile) - ) -} diff --git a/packages/fluwx_no_pay/android/build.gradle.kts b/packages/fluwx_no_pay/android/build.gradle.kts new file mode 100644 index 00000000..df565706 --- /dev/null +++ b/packages/fluwx_no_pay/android/build.gradle.kts @@ -0,0 +1,161 @@ +import org.yaml.snakeyaml.Yaml + +group = "com.jarvan.fluwx" +version = "1.0-SNAPSHOT" + +buildscript { + val kotlinVersion = "2.1.0" + repositories { + google() + mavenCentral() + } + + dependencies { + classpath("com.android.tools.build:gradle:8.9.1") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") + classpath("org.yaml:snakeyaml:2.6") + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +apply(plugin = "com.android.library") +apply(plugin = "kotlin-android") + +android { + namespace = "com.jarvan.fluwx" + compileSdk = 34 + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = "17" + } + + sourceSets { + getByName("main") { + java.srcDirs("src/main/kotlin", "${layout.buildDirectory.get().asFile}/generated/src/kotlin") + } + getByName("test") { + java.srcDirs("src/test/kotlin") + } + } + + defaultConfig { + minSdk = 24 + consumerProguardFiles("consumer-proguard-rules.txt") + } + + dependencies { + api("com.tencent.mm.opensdk:wechat-sdk-android:6.8.34") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") + implementation("id.zelory:compressor:3.0.1") + implementation("com.squareup.okhttp3:okhttp:5.2.1") + testImplementation("org.jetbrains.kotlin:kotlin-test") + testImplementation("org.mockito:mockito-core:5.0.0") + } + + testOptions { + unitTests.all { + it.useJUnitPlatform() + it.testLogging { + events("passed", "skipped", "failed", "standardOut", "standardError") + outputs.upToDateWhen { false } + showStandardStreams = true + } + } + } +} + +fun Project.loadPubspec(): Map { + val yamlDir = if (rootProject.hasProperty("yamlDir")) rootProject.ext["yamlDir"] as String else "" + val pubspecPath = "${rootProject.projectDir.parent}${File.separator}${yamlDir}pubspec.yaml" + val pubspecFile = if (file(pubspecPath).exists()) { + File(pubspecPath) + } else { + val parentDir = File(file(".").absolutePath).parentFile + File(parentDir, "pubspec.yaml") + } + + @Suppress("UNCHECKED_CAST") + return Yaml().load>(pubspecFile.inputStream()) +} + +fun Project.generateFluwxConfigurations( + interruptWeChatRequestByFluwx: String, + flutterActivity: String, + enableLogging: String, +) { + val generateFolder = File("${layout.buildDirectory.get().asFile}/generated/src/kotlin/com/jarvan/fluwx") + val template = """ + package com.jarvan.fluwx + + // auto generated + internal object FluwxConfigurations { + val flutterActivity: String = "&&flutterActivity&&" + val enableLogging: Boolean = &&enableLogging&& + val interruptWeChatRequestByFluwx: Boolean = &&interruptWeChatRequestByFluwx&& + } + """.trimIndent() + + if (!generateFolder.exists()) { + generateFolder.mkdirs() + } + + val source = template + .replace("&&interruptWeChatRequestByFluwx&&", interruptWeChatRequestByFluwx) + .replace("&&flutterActivity&&", flutterActivity) + .replace("&&enableLogging&&", enableLogging) + File("${generateFolder.absolutePath}/FluwxConfigurations.kt").writeText(source) +} + +tasks.register("generateFluwxHelperFile") { + doFirst { + val config = loadPubspec() + @Suppress("UNCHECKED_CAST") + val fluwx = config["fluwx"] as? Map + var enableLogging = "false" + var interruptWeChatRequestByFluwx = "true" + var flutterActivity = "" + + if (fluwx != null) { + @Suppress("UNCHECKED_CAST") + val androidConfig = fluwx["android"] as? Map + if (androidConfig != null) { + val iwr = androidConfig["interrupt_wx_request"] + if (iwr != null && (iwr == "true" || iwr == "false")) { + interruptWeChatRequestByFluwx = iwr as String + } + val activity = androidConfig["flutter_activity"] + if (activity != null) { + flutterActivity = activity as String + } + } + + val logging = fluwx["debug_logging"] + if ("$logging" == "true" || "$logging" == "false") { + enableLogging = "$logging" + } + } + + generateFluwxConfigurations(interruptWeChatRequestByFluwx, flutterActivity, enableLogging) + } +} + +configure { + libraryVariants.configureEach { + registerGeneratedResFolders( + project.files(File("${layout.buildDirectory.get().asFile}/generated/src/kotlin/com/jarvan/fluwx")) + .builtBy(tasks.named("generateFluwxHelperFile")) + ) + } +} From 792a8e5f7265ef36e470b49d473794b50a526e61 Mon Sep 17 00:00:00 2001 From: Jarvanmo Date: Thu, 7 May 2026 12:24:47 +0800 Subject: [PATCH 2/2] migrate to kts --- android/build.gradle.kts | 11 +- packages/_shared/android/.gitignore | 9 + packages/_shared/android/build.gradle.kts | 169 ++++++++++++++++++ .../android/consumer-proguard-rules.txt | 38 ++++ packages/_shared/android/settings.gradle.kts | 3 + packages/fluwx/android/.gitignore | 9 + packages/fluwx/android/build.gradle.kts | 162 +---------------- .../fluwx/android/consumer-proguard-rules.txt | 39 +--- packages/fluwx/android/settings.gradle | 1 - packages/fluwx/android/settings.gradle.kts | 1 + packages/fluwx/android/src/main/res | 1 + packages/fluwx_no_pay/android/.gitignore | 9 + .../fluwx_no_pay/android/build.gradle.kts | 162 +---------------- .../android/consumer-proguard-rules.txt | 39 +--- packages/fluwx_no_pay/android/settings.gradle | 1 - .../fluwx_no_pay/android/settings.gradle.kts | 1 + packages/fluwx_no_pay/android/src/main/res | 1 + pubspec.yaml | 8 + 18 files changed, 260 insertions(+), 404 deletions(-) create mode 100644 packages/_shared/android/.gitignore create mode 100644 packages/_shared/android/build.gradle.kts create mode 100644 packages/_shared/android/consumer-proguard-rules.txt create mode 100644 packages/_shared/android/settings.gradle.kts create mode 100644 packages/fluwx/android/.gitignore mode change 100644 => 120000 packages/fluwx/android/build.gradle.kts mode change 100644 => 120000 packages/fluwx/android/consumer-proguard-rules.txt delete mode 100644 packages/fluwx/android/settings.gradle create mode 120000 packages/fluwx/android/settings.gradle.kts create mode 120000 packages/fluwx/android/src/main/res create mode 100644 packages/fluwx_no_pay/android/.gitignore mode change 100644 => 120000 packages/fluwx_no_pay/android/build.gradle.kts mode change 100644 => 120000 packages/fluwx_no_pay/android/consumer-proguard-rules.txt delete mode 100644 packages/fluwx_no_pay/android/settings.gradle create mode 120000 packages/fluwx_no_pay/android/settings.gradle.kts create mode 120000 packages/fluwx_no_pay/android/src/main/res diff --git a/android/build.gradle.kts b/android/build.gradle.kts index df565706..9c8b371a 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -4,14 +4,14 @@ group = "com.jarvan.fluwx" version = "1.0-SNAPSHOT" buildscript { - val kotlinVersion = "2.1.0" + val kotlinVersion = "2.2.20" repositories { google() mavenCentral() } dependencies { - classpath("com.android.tools.build:gradle:8.9.1") + classpath("com.android.tools.build:gradle:8.11.1") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") classpath("org.yaml:snakeyaml:2.6") } @@ -24,8 +24,11 @@ allprojects { } } -apply(plugin = "com.android.library") -apply(plugin = "kotlin-android") +plugins { + id("com.android.library") + id("kotlin-android") +} + android { namespace = "com.jarvan.fluwx" diff --git a/packages/_shared/android/.gitignore b/packages/_shared/android/.gitignore new file mode 100644 index 00000000..161bdcda --- /dev/null +++ b/packages/_shared/android/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.cxx diff --git a/packages/_shared/android/build.gradle.kts b/packages/_shared/android/build.gradle.kts new file mode 100644 index 00000000..f013a026 --- /dev/null +++ b/packages/_shared/android/build.gradle.kts @@ -0,0 +1,169 @@ +import org.yaml.snakeyaml.Yaml + +group = "com.jarvan.fluwx" +version = "1.0-SNAPSHOT" + +buildscript { + val kotlinVersion = "2.2.20" + repositories { + google() + mavenCentral() + } + + dependencies { + classpath("com.android.tools.build:gradle:8.11.1") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") + classpath("org.yaml:snakeyaml:2.6") + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +plugins { + id("com.android.library") + id("kotlin-android") +} + + +android { + namespace = "com.jarvan.fluwx" + compileSdk = 34 + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + } + + sourceSets { + getByName("main") { + java.srcDirs("src/main/kotlin", "${layout.buildDirectory.get().asFile}/generated/src/kotlin") + } + getByName("test") { + java.srcDirs("src/test/kotlin") + } + } + + defaultConfig { + minSdk = 24 + consumerProguardFiles("consumer-proguard-rules.txt") + } + + dependencies { + api("com.tencent.mm.opensdk:wechat-sdk-android:6.8.34") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") + implementation("id.zelory:compressor:3.0.1") + implementation("com.squareup.okhttp3:okhttp:5.2.1") + testImplementation("org.jetbrains.kotlin:kotlin-test") + testImplementation("org.mockito:mockito-core:5.0.0") + } + + testOptions { + unitTests { + isIncludeAndroidResources = true + all { + it.useJUnitPlatform() + + it.outputs.upToDateWhen { false } + + it.testLogging { + events("passed", "skipped", "failed", "standardOut", "standardError") + showStandardStreams = true + } + } + } + } +} + +fun Project.loadPubspec(): Map { + val yamlDir = if (rootProject.hasProperty("yamlDir")) rootProject.ext["yamlDir"] as String else "" + val pubspecPath = "${rootProject.projectDir.parent}${File.separator}${yamlDir}pubspec.yaml" + val pubspecFile = if (file(pubspecPath).exists()) { + File(pubspecPath) + } else { + val parentDir = File(file(".").absolutePath).parentFile + File(parentDir, "pubspec.yaml") + } + + @Suppress("UNCHECKED_CAST") + return Yaml().load>(pubspecFile.inputStream()) +} + +fun Project.generateFluwxConfigurations( + interruptWeChatRequestByFluwx: String, + flutterActivity: String, + enableLogging: String, +) { + val generateFolder = File("${layout.buildDirectory.get().asFile}/generated/src/kotlin/com/jarvan/fluwx") + val template = """ + package com.jarvan.fluwx + + // auto generated + internal object FluwxConfigurations { + val flutterActivity: String = "&&flutterActivity&&" + val enableLogging: Boolean = &&enableLogging&& + val interruptWeChatRequestByFluwx: Boolean = &&interruptWeChatRequestByFluwx&& + } + """.trimIndent() + + if (!generateFolder.exists()) { + generateFolder.mkdirs() + } + + val source = template + .replace("&&interruptWeChatRequestByFluwx&&", interruptWeChatRequestByFluwx) + .replace("&&flutterActivity&&", flutterActivity) + .replace("&&enableLogging&&", enableLogging) + File("${generateFolder.absolutePath}/FluwxConfigurations.kt").writeText(source) +} + +tasks.register("generateFluwxHelperFile") { + doFirst { + val config = loadPubspec() + @Suppress("UNCHECKED_CAST") + val fluwx = config["fluwx"] as? Map + var enableLogging = "false" + var interruptWeChatRequestByFluwx = "true" + var flutterActivity = "" + + if (fluwx != null) { + @Suppress("UNCHECKED_CAST") + val androidConfig = fluwx["android"] as? Map + if (androidConfig != null) { + val iwr = androidConfig["interrupt_wx_request"] + if (iwr != null && (iwr == "true" || iwr == "false")) { + interruptWeChatRequestByFluwx = iwr as String + } + val activity = androidConfig["flutter_activity"] + if (activity != null) { + flutterActivity = activity as String + } + } + + val logging = fluwx["debug_logging"] + if ("$logging" == "true" || "$logging" == "false") { + enableLogging = "$logging" + } + } + + generateFluwxConfigurations(interruptWeChatRequestByFluwx, flutterActivity, enableLogging) + } +} + +configure { + libraryVariants.configureEach { + registerGeneratedResFolders( + project.files(File("${layout.buildDirectory.get().asFile}/generated/src/kotlin/com/jarvan/fluwx")) + .builtBy(tasks.named("generateFluwxHelperFile")) + ) + } +} diff --git a/packages/_shared/android/consumer-proguard-rules.txt b/packages/_shared/android/consumer-proguard-rules.txt new file mode 100644 index 00000000..f1897d89 --- /dev/null +++ b/packages/_shared/android/consumer-proguard-rules.txt @@ -0,0 +1,38 @@ + +# 微信 + +-keep class com.tencent.mm.opensdk.** {*;} +-keep class com.tencent.wxop.** {*;} +-keep class com.tencent.mm.sdk.** {*;} + +## Kotlin + +# ServiceLoader support +-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} +-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} +-keepnames class kotlinx.coroutines.android.AndroidExceptionPreHandler {} +-keepnames class kotlinx.coroutines.android.AndroidDispatcherFactory {} + +# Most of volatile fields are updated with AFU and should not be mangled +-keepclassmembernames class kotlinx.** { + volatile ; +} + +## OkHttp + +# JSR 305 annotations are for embedding nullability information. +-dontwarn javax.annotation.** + +# A resource is loaded with a relative path so the package of this class must be preserved. +-keeppackagenames okhttp3.internal.publicsuffix.* +-adaptresourcefilenames okhttp3/internal/publicsuffix/PublicSuffixDatabase.gz + +# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java. +-dontwarn org.codehaus.mojo.animal_sniffer.* + +# OkHttp platform used only on JVM and when Conscrypt and other security providers are available. +-dontwarn okhttp3.internal.platform.** +-dontwarn org.conscrypt.** +-dontwarn org.bouncycastle.** +-dontwarn org.openjsse.** + diff --git a/packages/_shared/android/settings.gradle.kts b/packages/_shared/android/settings.gradle.kts new file mode 100644 index 00000000..37c7690b --- /dev/null +++ b/packages/_shared/android/settings.gradle.kts @@ -0,0 +1,3 @@ +package packages._shared.android + +rootProject.name = 'fluwx' diff --git a/packages/fluwx/android/.gitignore b/packages/fluwx/android/.gitignore new file mode 100644 index 00000000..161bdcda --- /dev/null +++ b/packages/fluwx/android/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.cxx diff --git a/packages/fluwx/android/build.gradle.kts b/packages/fluwx/android/build.gradle.kts deleted file mode 100644 index df565706..00000000 --- a/packages/fluwx/android/build.gradle.kts +++ /dev/null @@ -1,161 +0,0 @@ -import org.yaml.snakeyaml.Yaml - -group = "com.jarvan.fluwx" -version = "1.0-SNAPSHOT" - -buildscript { - val kotlinVersion = "2.1.0" - repositories { - google() - mavenCentral() - } - - dependencies { - classpath("com.android.tools.build:gradle:8.9.1") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") - classpath("org.yaml:snakeyaml:2.6") - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -apply(plugin = "com.android.library") -apply(plugin = "kotlin-android") - -android { - namespace = "com.jarvan.fluwx" - compileSdk = 34 - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - kotlinOptions { - jvmTarget = "17" - } - - sourceSets { - getByName("main") { - java.srcDirs("src/main/kotlin", "${layout.buildDirectory.get().asFile}/generated/src/kotlin") - } - getByName("test") { - java.srcDirs("src/test/kotlin") - } - } - - defaultConfig { - minSdk = 24 - consumerProguardFiles("consumer-proguard-rules.txt") - } - - dependencies { - api("com.tencent.mm.opensdk:wechat-sdk-android:6.8.34") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") - implementation("id.zelory:compressor:3.0.1") - implementation("com.squareup.okhttp3:okhttp:5.2.1") - testImplementation("org.jetbrains.kotlin:kotlin-test") - testImplementation("org.mockito:mockito-core:5.0.0") - } - - testOptions { - unitTests.all { - it.useJUnitPlatform() - it.testLogging { - events("passed", "skipped", "failed", "standardOut", "standardError") - outputs.upToDateWhen { false } - showStandardStreams = true - } - } - } -} - -fun Project.loadPubspec(): Map { - val yamlDir = if (rootProject.hasProperty("yamlDir")) rootProject.ext["yamlDir"] as String else "" - val pubspecPath = "${rootProject.projectDir.parent}${File.separator}${yamlDir}pubspec.yaml" - val pubspecFile = if (file(pubspecPath).exists()) { - File(pubspecPath) - } else { - val parentDir = File(file(".").absolutePath).parentFile - File(parentDir, "pubspec.yaml") - } - - @Suppress("UNCHECKED_CAST") - return Yaml().load>(pubspecFile.inputStream()) -} - -fun Project.generateFluwxConfigurations( - interruptWeChatRequestByFluwx: String, - flutterActivity: String, - enableLogging: String, -) { - val generateFolder = File("${layout.buildDirectory.get().asFile}/generated/src/kotlin/com/jarvan/fluwx") - val template = """ - package com.jarvan.fluwx - - // auto generated - internal object FluwxConfigurations { - val flutterActivity: String = "&&flutterActivity&&" - val enableLogging: Boolean = &&enableLogging&& - val interruptWeChatRequestByFluwx: Boolean = &&interruptWeChatRequestByFluwx&& - } - """.trimIndent() - - if (!generateFolder.exists()) { - generateFolder.mkdirs() - } - - val source = template - .replace("&&interruptWeChatRequestByFluwx&&", interruptWeChatRequestByFluwx) - .replace("&&flutterActivity&&", flutterActivity) - .replace("&&enableLogging&&", enableLogging) - File("${generateFolder.absolutePath}/FluwxConfigurations.kt").writeText(source) -} - -tasks.register("generateFluwxHelperFile") { - doFirst { - val config = loadPubspec() - @Suppress("UNCHECKED_CAST") - val fluwx = config["fluwx"] as? Map - var enableLogging = "false" - var interruptWeChatRequestByFluwx = "true" - var flutterActivity = "" - - if (fluwx != null) { - @Suppress("UNCHECKED_CAST") - val androidConfig = fluwx["android"] as? Map - if (androidConfig != null) { - val iwr = androidConfig["interrupt_wx_request"] - if (iwr != null && (iwr == "true" || iwr == "false")) { - interruptWeChatRequestByFluwx = iwr as String - } - val activity = androidConfig["flutter_activity"] - if (activity != null) { - flutterActivity = activity as String - } - } - - val logging = fluwx["debug_logging"] - if ("$logging" == "true" || "$logging" == "false") { - enableLogging = "$logging" - } - } - - generateFluwxConfigurations(interruptWeChatRequestByFluwx, flutterActivity, enableLogging) - } -} - -configure { - libraryVariants.configureEach { - registerGeneratedResFolders( - project.files(File("${layout.buildDirectory.get().asFile}/generated/src/kotlin/com/jarvan/fluwx")) - .builtBy(tasks.named("generateFluwxHelperFile")) - ) - } -} diff --git a/packages/fluwx/android/build.gradle.kts b/packages/fluwx/android/build.gradle.kts new file mode 120000 index 00000000..d847acc2 --- /dev/null +++ b/packages/fluwx/android/build.gradle.kts @@ -0,0 +1 @@ +../../_shared/android/build.gradle.kts \ No newline at end of file diff --git a/packages/fluwx/android/consumer-proguard-rules.txt b/packages/fluwx/android/consumer-proguard-rules.txt deleted file mode 100644 index f1897d89..00000000 --- a/packages/fluwx/android/consumer-proguard-rules.txt +++ /dev/null @@ -1,38 +0,0 @@ - -# 微信 - --keep class com.tencent.mm.opensdk.** {*;} --keep class com.tencent.wxop.** {*;} --keep class com.tencent.mm.sdk.** {*;} - -## Kotlin - -# ServiceLoader support --keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} --keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} --keepnames class kotlinx.coroutines.android.AndroidExceptionPreHandler {} --keepnames class kotlinx.coroutines.android.AndroidDispatcherFactory {} - -# Most of volatile fields are updated with AFU and should not be mangled --keepclassmembernames class kotlinx.** { - volatile ; -} - -## OkHttp - -# JSR 305 annotations are for embedding nullability information. --dontwarn javax.annotation.** - -# A resource is loaded with a relative path so the package of this class must be preserved. --keeppackagenames okhttp3.internal.publicsuffix.* --adaptresourcefilenames okhttp3/internal/publicsuffix/PublicSuffixDatabase.gz - -# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java. --dontwarn org.codehaus.mojo.animal_sniffer.* - -# OkHttp platform used only on JVM and when Conscrypt and other security providers are available. --dontwarn okhttp3.internal.platform.** --dontwarn org.conscrypt.** --dontwarn org.bouncycastle.** --dontwarn org.openjsse.** - diff --git a/packages/fluwx/android/consumer-proguard-rules.txt b/packages/fluwx/android/consumer-proguard-rules.txt new file mode 120000 index 00000000..c55300f7 --- /dev/null +++ b/packages/fluwx/android/consumer-proguard-rules.txt @@ -0,0 +1 @@ +../../_shared/android/consumer-proguard-rules.txt \ No newline at end of file diff --git a/packages/fluwx/android/settings.gradle b/packages/fluwx/android/settings.gradle deleted file mode 100644 index 15566533..00000000 --- a/packages/fluwx/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'fluwx' diff --git a/packages/fluwx/android/settings.gradle.kts b/packages/fluwx/android/settings.gradle.kts new file mode 120000 index 00000000..aed101a0 --- /dev/null +++ b/packages/fluwx/android/settings.gradle.kts @@ -0,0 +1 @@ +../../_shared/android/settings.gradle.kts \ No newline at end of file diff --git a/packages/fluwx/android/src/main/res b/packages/fluwx/android/src/main/res new file mode 120000 index 00000000..494cfab2 --- /dev/null +++ b/packages/fluwx/android/src/main/res @@ -0,0 +1 @@ +../../../../_shared/android/src/main/res \ No newline at end of file diff --git a/packages/fluwx_no_pay/android/.gitignore b/packages/fluwx_no_pay/android/.gitignore new file mode 100644 index 00000000..161bdcda --- /dev/null +++ b/packages/fluwx_no_pay/android/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.cxx diff --git a/packages/fluwx_no_pay/android/build.gradle.kts b/packages/fluwx_no_pay/android/build.gradle.kts deleted file mode 100644 index df565706..00000000 --- a/packages/fluwx_no_pay/android/build.gradle.kts +++ /dev/null @@ -1,161 +0,0 @@ -import org.yaml.snakeyaml.Yaml - -group = "com.jarvan.fluwx" -version = "1.0-SNAPSHOT" - -buildscript { - val kotlinVersion = "2.1.0" - repositories { - google() - mavenCentral() - } - - dependencies { - classpath("com.android.tools.build:gradle:8.9.1") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") - classpath("org.yaml:snakeyaml:2.6") - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -apply(plugin = "com.android.library") -apply(plugin = "kotlin-android") - -android { - namespace = "com.jarvan.fluwx" - compileSdk = 34 - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - kotlinOptions { - jvmTarget = "17" - } - - sourceSets { - getByName("main") { - java.srcDirs("src/main/kotlin", "${layout.buildDirectory.get().asFile}/generated/src/kotlin") - } - getByName("test") { - java.srcDirs("src/test/kotlin") - } - } - - defaultConfig { - minSdk = 24 - consumerProguardFiles("consumer-proguard-rules.txt") - } - - dependencies { - api("com.tencent.mm.opensdk:wechat-sdk-android:6.8.34") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") - implementation("id.zelory:compressor:3.0.1") - implementation("com.squareup.okhttp3:okhttp:5.2.1") - testImplementation("org.jetbrains.kotlin:kotlin-test") - testImplementation("org.mockito:mockito-core:5.0.0") - } - - testOptions { - unitTests.all { - it.useJUnitPlatform() - it.testLogging { - events("passed", "skipped", "failed", "standardOut", "standardError") - outputs.upToDateWhen { false } - showStandardStreams = true - } - } - } -} - -fun Project.loadPubspec(): Map { - val yamlDir = if (rootProject.hasProperty("yamlDir")) rootProject.ext["yamlDir"] as String else "" - val pubspecPath = "${rootProject.projectDir.parent}${File.separator}${yamlDir}pubspec.yaml" - val pubspecFile = if (file(pubspecPath).exists()) { - File(pubspecPath) - } else { - val parentDir = File(file(".").absolutePath).parentFile - File(parentDir, "pubspec.yaml") - } - - @Suppress("UNCHECKED_CAST") - return Yaml().load>(pubspecFile.inputStream()) -} - -fun Project.generateFluwxConfigurations( - interruptWeChatRequestByFluwx: String, - flutterActivity: String, - enableLogging: String, -) { - val generateFolder = File("${layout.buildDirectory.get().asFile}/generated/src/kotlin/com/jarvan/fluwx") - val template = """ - package com.jarvan.fluwx - - // auto generated - internal object FluwxConfigurations { - val flutterActivity: String = "&&flutterActivity&&" - val enableLogging: Boolean = &&enableLogging&& - val interruptWeChatRequestByFluwx: Boolean = &&interruptWeChatRequestByFluwx&& - } - """.trimIndent() - - if (!generateFolder.exists()) { - generateFolder.mkdirs() - } - - val source = template - .replace("&&interruptWeChatRequestByFluwx&&", interruptWeChatRequestByFluwx) - .replace("&&flutterActivity&&", flutterActivity) - .replace("&&enableLogging&&", enableLogging) - File("${generateFolder.absolutePath}/FluwxConfigurations.kt").writeText(source) -} - -tasks.register("generateFluwxHelperFile") { - doFirst { - val config = loadPubspec() - @Suppress("UNCHECKED_CAST") - val fluwx = config["fluwx"] as? Map - var enableLogging = "false" - var interruptWeChatRequestByFluwx = "true" - var flutterActivity = "" - - if (fluwx != null) { - @Suppress("UNCHECKED_CAST") - val androidConfig = fluwx["android"] as? Map - if (androidConfig != null) { - val iwr = androidConfig["interrupt_wx_request"] - if (iwr != null && (iwr == "true" || iwr == "false")) { - interruptWeChatRequestByFluwx = iwr as String - } - val activity = androidConfig["flutter_activity"] - if (activity != null) { - flutterActivity = activity as String - } - } - - val logging = fluwx["debug_logging"] - if ("$logging" == "true" || "$logging" == "false") { - enableLogging = "$logging" - } - } - - generateFluwxConfigurations(interruptWeChatRequestByFluwx, flutterActivity, enableLogging) - } -} - -configure { - libraryVariants.configureEach { - registerGeneratedResFolders( - project.files(File("${layout.buildDirectory.get().asFile}/generated/src/kotlin/com/jarvan/fluwx")) - .builtBy(tasks.named("generateFluwxHelperFile")) - ) - } -} diff --git a/packages/fluwx_no_pay/android/build.gradle.kts b/packages/fluwx_no_pay/android/build.gradle.kts new file mode 120000 index 00000000..d847acc2 --- /dev/null +++ b/packages/fluwx_no_pay/android/build.gradle.kts @@ -0,0 +1 @@ +../../_shared/android/build.gradle.kts \ No newline at end of file diff --git a/packages/fluwx_no_pay/android/consumer-proguard-rules.txt b/packages/fluwx_no_pay/android/consumer-proguard-rules.txt deleted file mode 100644 index f1897d89..00000000 --- a/packages/fluwx_no_pay/android/consumer-proguard-rules.txt +++ /dev/null @@ -1,38 +0,0 @@ - -# 微信 - --keep class com.tencent.mm.opensdk.** {*;} --keep class com.tencent.wxop.** {*;} --keep class com.tencent.mm.sdk.** {*;} - -## Kotlin - -# ServiceLoader support --keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} --keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} --keepnames class kotlinx.coroutines.android.AndroidExceptionPreHandler {} --keepnames class kotlinx.coroutines.android.AndroidDispatcherFactory {} - -# Most of volatile fields are updated with AFU and should not be mangled --keepclassmembernames class kotlinx.** { - volatile ; -} - -## OkHttp - -# JSR 305 annotations are for embedding nullability information. --dontwarn javax.annotation.** - -# A resource is loaded with a relative path so the package of this class must be preserved. --keeppackagenames okhttp3.internal.publicsuffix.* --adaptresourcefilenames okhttp3/internal/publicsuffix/PublicSuffixDatabase.gz - -# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java. --dontwarn org.codehaus.mojo.animal_sniffer.* - -# OkHttp platform used only on JVM and when Conscrypt and other security providers are available. --dontwarn okhttp3.internal.platform.** --dontwarn org.conscrypt.** --dontwarn org.bouncycastle.** --dontwarn org.openjsse.** - diff --git a/packages/fluwx_no_pay/android/consumer-proguard-rules.txt b/packages/fluwx_no_pay/android/consumer-proguard-rules.txt new file mode 120000 index 00000000..c55300f7 --- /dev/null +++ b/packages/fluwx_no_pay/android/consumer-proguard-rules.txt @@ -0,0 +1 @@ +../../_shared/android/consumer-proguard-rules.txt \ No newline at end of file diff --git a/packages/fluwx_no_pay/android/settings.gradle b/packages/fluwx_no_pay/android/settings.gradle deleted file mode 100644 index 85499872..00000000 --- a/packages/fluwx_no_pay/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'fluwx_no_pay' diff --git a/packages/fluwx_no_pay/android/settings.gradle.kts b/packages/fluwx_no_pay/android/settings.gradle.kts new file mode 120000 index 00000000..aed101a0 --- /dev/null +++ b/packages/fluwx_no_pay/android/settings.gradle.kts @@ -0,0 +1 @@ +../../_shared/android/settings.gradle.kts \ No newline at end of file diff --git a/packages/fluwx_no_pay/android/src/main/res b/packages/fluwx_no_pay/android/src/main/res new file mode 120000 index 00000000..494cfab2 --- /dev/null +++ b/packages/fluwx_no_pay/android/src/main/res @@ -0,0 +1 @@ +../../../../_shared/android/src/main/res \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index f258d7ca..2b0ab25d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,6 +53,14 @@ melos: test -L packages/fluwx_no_pay/ios/fluwx_no_pay/CocoaPodsSources/fluwx_no_pay/Resources/PrivacyInfo.xcprivacy || (echo "❌ fluwx_no_pay CocoaPods privacy symlink missing" && exit 1) test -L packages/fluwx/android/src/main/kotlin || (echo "❌ fluwx Android kotlin symlink missing" && exit 1) test -L packages/fluwx_no_pay/android/src/main/kotlin || (echo "❌ fluwx_no_pay Android kotlin symlink missing" && exit 1) + test -L packages/fluwx/android/src/main/res || (echo "❌ fluwx Android res symlink missing" && exit 1) + test -L packages/fluwx_no_pay/android/src/main/res || (echo "❌ fluwx_no_pay Android res symlink missing" && exit 1) + test -L packages/fluwx/android/build.gradle.kts || (echo "❌ fluwx Android build.gradle.kts symlink missing" && exit 1) + test -L packages/fluwx/android/consumer-proguard-rules.txt || (echo "❌ fluwx Android consumer-proguard-rules.txt symlink missing" && exit 1) + test -L packages/fluwx/android/settings.gradle.kts || (echo "❌ fluwx Android settings.gradle.kts symlink missing" && exit 1) + test -L packages/fluwx_no_pay/android/build.gradle.kts || (echo "❌ fluwx_no_pay Android build.gradle.kts symlink missing" && exit 1) + test -L packages/fluwx_no_pay/android/consumer-proguard-rules.txt || (echo "❌ fluwx_no_pay Android consumer-proguard-rules.txt symlink missing" && exit 1) + test -L packages/fluwx_no_pay/android/settings.gradle.kts || (echo "❌ fluwx_no_pay Android settings.gradle.kts symlink missing" && exit 1) test -L packages/fluwx/example/lib/pages || (echo "❌ fluwx example pages symlink missing" && exit 1) test -L packages/fluwx_no_pay/example/lib/pages || (echo "❌ fluwx_no_pay example pages symlink missing" && exit 1) test -L packages/fluwx/example/images || (echo "❌ fluwx example images symlink missing" && exit 1)