diff --git a/apps/aixue/android/app/build.gradle.kts b/apps/aixue/android/app/build.gradle.kts index 38fd73e..360d292 100644 --- a/apps/aixue/android/app/build.gradle.kts +++ b/apps/aixue/android/app/build.gradle.kts @@ -5,7 +5,17 @@ plugins { id("dev.flutter.flutter-gradle-plugin") } +import java.util.Properties +import java.io.FileInputStream + +val keystoreProperties = Properties() +val keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + android { + namespace = "com.yuanxuan.aixue" compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion @@ -29,14 +39,21 @@ android { versionCode = flutter.versionCode versionName = flutter.versionName } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.getByName("debug") + signingConfigs { + create("release") { + keyAlias = keystoreProperties["keyAlias"] as String? + keyPassword = keystoreProperties["keyPassword"] as String? + storeFile = keystoreProperties["storeFile"]?.let { file(it as String) } + storePassword = keystoreProperties["storePassword"] as String? } } + + buildTypes { + getByName("release") { + signingConfig = signingConfigs.getByName("release") + } + } + } flutter { diff --git a/apps/aixue/pubspec.lock b/apps/aixue/pubspec.lock index 138f441..1fcb372 100644 --- a/apps/aixue/pubspec.lock +++ b/apps/aixue/pubspec.lock @@ -1,22 +1,6 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - ansicolor: - dependency: transitive - description: - name: ansicolor - sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.3" - archive: - dependency: transitive - description: - name: archive - sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff - url: "https://pub.flutter-io.cn" - source: hosted - version: "4.0.9" args: dependency: transitive description: @@ -49,22 +33,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.4.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.4" - cli_util: - dependency: transitive - description: - name: cli_util - sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.4.2" clock: dependency: transitive description: @@ -105,14 +73,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "0.3.5+2" - csslib: - dependency: transitive - description: - name: csslib - sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.0.2" cupertino_icons: dependency: "direct main" description: @@ -214,14 +174,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_launcher_icons: - dependency: "direct dev" - description: - name: flutter_launcher_icons - sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.14.4" flutter_lints: dependency: "direct dev" description: @@ -230,14 +182,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "6.0.0" - flutter_native_splash: - dependency: "direct dev" - description: - name: flutter_native_splash - sha256: "4fb9f4113350d3a80841ce05ebf1976a36de622af7d19aca0ca9a9911c7ff002" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.4.7" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -256,14 +200,6 @@ packages: description: flutter source: sdk version: "0.0.0" - html: - dependency: transitive - description: - name: html - sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.15.6" http: dependency: transitive description: @@ -280,14 +216,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "4.1.2" - image: - dependency: transitive - description: - name: image - sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce - url: "https://pub.flutter-io.cn" - source: hosted - version: "4.8.0" image_picker: dependency: transitive description: @@ -352,14 +280,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "0.2.2" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8 - url: "https://pub.flutter-io.cn" - source: hosted - version: "4.11.0" leak_tracker: dependency: transitive description: @@ -504,14 +424,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.1.8" - posix: - dependency: transitive - description: - name: posix - sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" - url: "https://pub.flutter-io.cn" - source: hosted - version: "6.5.0" sky_engine: dependency: transitive description: flutter @@ -573,14 +485,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" - universal_io: - dependency: transitive - description: - name: universal_io - sha256: f63cbc48103236abf48e345e07a03ce5757ea86285ed313a6a032596ed9301e2 - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.3.1" url_launcher: dependency: transitive description: @@ -732,14 +636,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "6.6.1" - yaml: - dependency: transitive - description: - name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.1.3" sdks: dart: ">=3.11.0 <4.0.0" flutter: ">=3.38.0" diff --git a/apps/aixue/pubspec.yaml b/apps/aixue/pubspec.yaml index bd6ccec..eef422a 100644 --- a/apps/aixue/pubspec.yaml +++ b/apps/aixue/pubspec.yaml @@ -47,8 +47,6 @@ dev_dependencies: # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^6.0.0 - flutter_launcher_icons: ^0.14.4 - flutter_native_splash: ^2.4.7 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/apps/test/android/app/build.gradle.kts b/apps/test/android/app/build.gradle.kts index c5e8098..2223b05 100644 --- a/apps/test/android/app/build.gradle.kts +++ b/apps/test/android/app/build.gradle.kts @@ -5,7 +5,17 @@ plugins { id("dev.flutter.flutter-gradle-plugin") } +import java.util.Properties +import java.io.FileInputStream + +val keystoreProperties = Properties() +val keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + android { + namespace = "com.yuanxuan.test" compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion @@ -29,14 +39,21 @@ android { versionCode = flutter.versionCode versionName = flutter.versionName } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.getByName("debug") + signingConfigs { + create("release") { + keyAlias = keystoreProperties["keyAlias"] as String? + keyPassword = keystoreProperties["keyPassword"] as String? + storeFile = keystoreProperties["storeFile"]?.let { file(it as String) } + storePassword = keystoreProperties["storePassword"] as String? } } + + buildTypes { + getByName("release") { + signingConfig = signingConfigs.getByName("release") + } + } + } flutter { diff --git a/apps/test/pubspec.lock b/apps/test/pubspec.lock index 138f441..1fcb372 100644 --- a/apps/test/pubspec.lock +++ b/apps/test/pubspec.lock @@ -1,22 +1,6 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - ansicolor: - dependency: transitive - description: - name: ansicolor - sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.3" - archive: - dependency: transitive - description: - name: archive - sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff - url: "https://pub.flutter-io.cn" - source: hosted - version: "4.0.9" args: dependency: transitive description: @@ -49,22 +33,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.4.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.4" - cli_util: - dependency: transitive - description: - name: cli_util - sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.4.2" clock: dependency: transitive description: @@ -105,14 +73,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "0.3.5+2" - csslib: - dependency: transitive - description: - name: csslib - sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.0.2" cupertino_icons: dependency: "direct main" description: @@ -214,14 +174,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_launcher_icons: - dependency: "direct dev" - description: - name: flutter_launcher_icons - sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.14.4" flutter_lints: dependency: "direct dev" description: @@ -230,14 +182,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "6.0.0" - flutter_native_splash: - dependency: "direct dev" - description: - name: flutter_native_splash - sha256: "4fb9f4113350d3a80841ce05ebf1976a36de622af7d19aca0ca9a9911c7ff002" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.4.7" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -256,14 +200,6 @@ packages: description: flutter source: sdk version: "0.0.0" - html: - dependency: transitive - description: - name: html - sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.15.6" http: dependency: transitive description: @@ -280,14 +216,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "4.1.2" - image: - dependency: transitive - description: - name: image - sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce - url: "https://pub.flutter-io.cn" - source: hosted - version: "4.8.0" image_picker: dependency: transitive description: @@ -352,14 +280,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "0.2.2" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8 - url: "https://pub.flutter-io.cn" - source: hosted - version: "4.11.0" leak_tracker: dependency: transitive description: @@ -504,14 +424,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.1.8" - posix: - dependency: transitive - description: - name: posix - sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" - url: "https://pub.flutter-io.cn" - source: hosted - version: "6.5.0" sky_engine: dependency: transitive description: flutter @@ -573,14 +485,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" - universal_io: - dependency: transitive - description: - name: universal_io - sha256: f63cbc48103236abf48e345e07a03ce5757ea86285ed313a6a032596ed9301e2 - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.3.1" url_launcher: dependency: transitive description: @@ -732,14 +636,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "6.6.1" - yaml: - dependency: transitive - description: - name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.1.3" sdks: dart: ">=3.11.0 <4.0.0" flutter: ">=3.38.0" diff --git a/apps/test/pubspec.yaml b/apps/test/pubspec.yaml index 9e0d897..de6b073 100644 --- a/apps/test/pubspec.yaml +++ b/apps/test/pubspec.yaml @@ -47,8 +47,6 @@ dev_dependencies: # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^6.0.0 - flutter_launcher_icons: ^0.14.4 - flutter_native_splash: ^2.4.7 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/apps/yunxiao/android/app/build.gradle.kts b/apps/yunxiao/android/app/build.gradle.kts index f1fe6df..46078ef 100644 --- a/apps/yunxiao/android/app/build.gradle.kts +++ b/apps/yunxiao/android/app/build.gradle.kts @@ -5,7 +5,17 @@ plugins { id("dev.flutter.flutter-gradle-plugin") } +import java.util.Properties +import java.io.FileInputStream + +val keystoreProperties = Properties() +val keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + android { + namespace = "com.yuanxuan.yunxiao" compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion @@ -29,14 +39,21 @@ android { versionCode = flutter.versionCode versionName = flutter.versionName } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.getByName("debug") + signingConfigs { + create("release") { + keyAlias = keystoreProperties["keyAlias"] as String? + keyPassword = keystoreProperties["keyPassword"] as String? + storeFile = keystoreProperties["storeFile"]?.let { file(it as String) } + storePassword = keystoreProperties["storePassword"] as String? } } + + buildTypes { + getByName("release") { + signingConfig = signingConfigs.getByName("release") + } + } + } flutter { diff --git a/apps/yunxiao/pubspec.lock b/apps/yunxiao/pubspec.lock index 138f441..1fcb372 100644 --- a/apps/yunxiao/pubspec.lock +++ b/apps/yunxiao/pubspec.lock @@ -1,22 +1,6 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - ansicolor: - dependency: transitive - description: - name: ansicolor - sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.3" - archive: - dependency: transitive - description: - name: archive - sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff - url: "https://pub.flutter-io.cn" - source: hosted - version: "4.0.9" args: dependency: transitive description: @@ -49,22 +33,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.4.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.4" - cli_util: - dependency: transitive - description: - name: cli_util - sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.4.2" clock: dependency: transitive description: @@ -105,14 +73,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "0.3.5+2" - csslib: - dependency: transitive - description: - name: csslib - sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.0.2" cupertino_icons: dependency: "direct main" description: @@ -214,14 +174,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_launcher_icons: - dependency: "direct dev" - description: - name: flutter_launcher_icons - sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.14.4" flutter_lints: dependency: "direct dev" description: @@ -230,14 +182,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "6.0.0" - flutter_native_splash: - dependency: "direct dev" - description: - name: flutter_native_splash - sha256: "4fb9f4113350d3a80841ce05ebf1976a36de622af7d19aca0ca9a9911c7ff002" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.4.7" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -256,14 +200,6 @@ packages: description: flutter source: sdk version: "0.0.0" - html: - dependency: transitive - description: - name: html - sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.15.6" http: dependency: transitive description: @@ -280,14 +216,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "4.1.2" - image: - dependency: transitive - description: - name: image - sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce - url: "https://pub.flutter-io.cn" - source: hosted - version: "4.8.0" image_picker: dependency: transitive description: @@ -352,14 +280,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "0.2.2" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8 - url: "https://pub.flutter-io.cn" - source: hosted - version: "4.11.0" leak_tracker: dependency: transitive description: @@ -504,14 +424,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.1.8" - posix: - dependency: transitive - description: - name: posix - sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" - url: "https://pub.flutter-io.cn" - source: hosted - version: "6.5.0" sky_engine: dependency: transitive description: flutter @@ -573,14 +485,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" - universal_io: - dependency: transitive - description: - name: universal_io - sha256: f63cbc48103236abf48e345e07a03ce5757ea86285ed313a6a032596ed9301e2 - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.3.1" url_launcher: dependency: transitive description: @@ -732,14 +636,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "6.6.1" - yaml: - dependency: transitive - description: - name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.1.3" sdks: dart: ">=3.11.0 <4.0.0" flutter: ">=3.38.0" diff --git a/apps/yunxiao/pubspec.yaml b/apps/yunxiao/pubspec.yaml index fce00c0..6070a81 100644 --- a/apps/yunxiao/pubspec.yaml +++ b/apps/yunxiao/pubspec.yaml @@ -47,8 +47,6 @@ dev_dependencies: # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^6.0.0 - flutter_launcher_icons: ^0.14.4 - flutter_native_splash: ^2.4.7 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/tool/generate_app.dart b/tool/generate_app.dart index 40daf1b..c57c6d8 100644 --- a/tool/generate_app.dart +++ b/tool/generate_app.dart @@ -80,6 +80,9 @@ Future main(List args) async { // 8. 在 pubspec.yaml 中注册 Flutter assets await _registerFlutterAssets(appDir); + // 9. 配置签名 (KeyStore) + await _configureSigning(appDir, config); + print('\x1B[32m✔ 应用 $brand 已生成到 $appDir!\x1B[0m'); print('\x1B[34m构建应用请执行:\x1B[0m'); print(' cd $appDir && flutter build apk'); @@ -337,6 +340,15 @@ flutter_native_splash: exit(1); } print('\x1B[32m✔ 启动页已生成。\x1B[0m'); + + // ── 6. 移除资源生成器依赖以避免干扰 release 打包 ── + print('\x1B[34m[信息] 正在移除资源生成器依赖...\x1B[0m'); + await Process.run('flutter', [ + 'pub', + 'remove', + 'flutter_launcher_icons', + 'flutter_native_splash', + ], workingDirectory: appDir); } Future _registerFlutterAssets(String appDir) async { @@ -356,3 +368,79 @@ Future _registerFlutterAssets(String appDir) async { } print('\x1B[32m✔ Flutter assets 已注册。\x1B[0m'); } + +Future _configureSigning(String appDir, YamlMap config) async { + print('\x1B[34m[信息] 正在配置应用签名...\x1B[0m'); + + // 提取配置,默认为工具根目录下的 key.jks + final YamlMap? signing = config['signing'] as YamlMap?; + final String keyAlias = signing?['key_alias'] as String? ?? 'my-key-alias'; + final String keyPassword = signing?['key_password'] as String? ?? '123456'; + final String storePassword = signing?['store_password'] as String? ?? '123456'; + + // key.properties 会放在 apps//android/ 目录下 + // 但它被 app/build.gradle.kts 读取和求值,所以在 build.gradle.kts 中它的相对基准是 android/app/ + // 指向 tool/key.jks 的相对路径是: ../../../../tool/key.jks + final String storeFile = signing?['store_file'] as String? ?? '../../../../tool/key.jks'; + + // 1. 写入 android/key.properties + final String keyPropsContent = ''' +storePassword=$storePassword +keyPassword=$keyPassword +keyAlias=$keyAlias +storeFile=$storeFile +'''; + await File('$appDir/android/key.properties').writeAsString(keyPropsContent); + + // 2. 修改 build.gradle.kts + final File gradleFile = File('$appDir/android/app/build.gradle.kts'); + if (!gradleFile.existsSync()) { + print('\x1B[33m[警告] 未找到 build.gradle.kts,跳过注入签名配置。\x1B[0m'); + return; + } + + String content = await gradleFile.readAsString(); + + // 注入 Properties 加载代码 + if (!content.contains('val keystoreProperties = Properties()')) { + content = content.replaceFirst('android {', ''' +import java.util.Properties +import java.io.FileInputStream + +val keystoreProperties = Properties() +val keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + +android { +'''); + } + + // 注入 signingConfigs 并修改 buildTypes.release + if (!content.contains('signingConfigs {\\n create("release") {')) { + final String newBuildTypes = ''' + signingConfigs { + create("release") { + keyAlias = keystoreProperties["keyAlias"] as String? + keyPassword = keystoreProperties["keyPassword"] as String? + storeFile = keystoreProperties["storeFile"]?.let { file(it as String) } + storePassword = keystoreProperties["storePassword"] as String? + } + } + + buildTypes { + getByName("release") { + signingConfig = signingConfigs.getByName("release") + } + } +'''; + + // 匹配原始的 buildTypes { release { ... } } 块 + final RegExp buildTypeRegex = RegExp(r'\s*buildTypes\s*\{[\s\S]*?signingConfigs\.getByName\("debug"\)\s*\}\s*\}'); + content = content.replaceFirst(buildTypeRegex, '\n$newBuildTypes'); + } + + await gradleFile.writeAsString(content); + print('\x1B[32m✔ 签名配置注入完成。\x1B[0m'); +}