diff --git a/app/android/app/build.gradle.kts b/app/android/app/build.gradle.kts index e60d1ab..d3d6d57 100644 --- a/app/android/app/build.gradle.kts +++ b/app/android/app/build.gradle.kts @@ -1,9 +1,19 @@ +import java.util.Properties +import java.io.FileInputStream + plugins { id("com.android.application") // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id("dev.flutter.flutter-gradle-plugin") } +// 从 key.properties 加载签名配置 +val keystorePropertiesFile = rootProject.file("key.properties") +val keystoreProperties = Properties() +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + android { namespace = "com.nuanji.nuanji_app" compileSdk = flutter.compileSdkVersion @@ -15,21 +25,33 @@ android { } defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "com.nuanji.nuanji_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion + minSdk = 24 // Android 7.0+ — 支持 Isar 原生库 + CameraX targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName } + signingConfigs { + create("release") { + if (keystorePropertiesFile.exists()) { + keyAlias = keystoreProperties["keyAlias"] as String + keyPassword = keystoreProperties["keyPassword"] as String + storeFile = file(keystoreProperties["storeFile"] as String) + storePassword = keystoreProperties["storePassword"] as String + } + } + } + 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") + signingConfig = signingConfigs.getByName("release") + isMinifyEnabled = true + isShrinkResources = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) } } } diff --git a/app/android/app/proguard-rules.pro b/app/android/app/proguard-rules.pro new file mode 100644 index 0000000..ac3bd76 --- /dev/null +++ b/app/android/app/proguard-rules.pro @@ -0,0 +1,38 @@ +# 暖记 ProGuard 规则 +# 保留 Flutter 引擎 +-keep class io.flutter.app.** { *; } +-keep class io.flutter.plugin.** { *; } +-keep class io.flutter.util.** { *; } +-keep class io.flutter.view.** { *; } +-keep class io.flutter.** { *; } +-keep class io.flutter.plugins.** { *; } + +# Isar 数据库 — 保留 native 调用 +-keep class com.isor.** { *; } +-keep class isar.** { *; } +-keepclassmembers class ** { + native ; +} + +# Dio 网络库 +-dontwarn okhttp3.** +-dontwarn okio.** +-keep class okhttp3.** { *; } +-keep interface okhttp3.** { *; } + +# Gson / JSON 序列化 +-keepattributes Signature +-keepattributes *Annotation* +-keep class com.google.gson.** { *; } + +# freezed 生成的类 — 保留 JSON 序列化 +-keepclassmembers class **.models.** { + *** fromJson(...); + *** toJson(); +} + +# 保留所有序列化相关类 +-keepclassmembers class * { + *** INSTANCE; + *** Companion; +} diff --git a/app/android/app/src/main/AndroidManifest.xml b/app/android/app/src/main/AndroidManifest.xml index 791abdc..6432866 100644 --- a/app/android/app/src/main/AndroidManifest.xml +++ b/app/android/app/src/main/AndroidManifest.xml @@ -1,9 +1,20 @@ + + + + + + + + + + + android:networkSecurityConfig="@xml/network_security_config" + android:usesCleartextTraffic="false"> - + - - - - + android:src="@drawable/launch_logo" /> + diff --git a/app/android/app/src/main/res/drawable/launch_background_dark.xml b/app/android/app/src/main/res/drawable/launch_background_dark.xml new file mode 100644 index 0000000..e7e0f3d --- /dev/null +++ b/app/android/app/src/main/res/drawable/launch_background_dark.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/app/android/app/src/main/res/drawable/launch_logo.png b/app/android/app/src/main/res/drawable/launch_logo.png new file mode 100644 index 0000000..e91b019 Binary files /dev/null and b/app/android/app/src/main/res/drawable/launch_logo.png differ diff --git a/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4..85068aa 100644 Binary files a/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b7..b33c117 100644 Binary files a/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 09d4391..2c0edfa 100644 Binary files a/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d..799ec04 100644 Binary files a/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372e..f11fb2f 100644 Binary files a/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/android/app/src/main/res/values-night/colors.xml b/app/android/app/src/main/res/values-night/colors.xml new file mode 100644 index 0000000..beb5395 --- /dev/null +++ b/app/android/app/src/main/res/values-night/colors.xml @@ -0,0 +1,4 @@ + + + #1A1614 + diff --git a/app/android/app/src/main/res/values-night/styles.xml b/app/android/app/src/main/res/values-night/styles.xml index 06952be..ba9470a 100644 --- a/app/android/app/src/main/res/values-night/styles.xml +++ b/app/android/app/src/main/res/values-night/styles.xml @@ -1,17 +1,10 @@ - + - diff --git a/app/android/app/src/main/res/values-zh/strings.xml b/app/android/app/src/main/res/values-zh/strings.xml new file mode 100644 index 0000000..57719bb --- /dev/null +++ b/app/android/app/src/main/res/values-zh/strings.xml @@ -0,0 +1,4 @@ + + + 暖记 + diff --git a/app/android/app/src/main/res/values/colors.xml b/app/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..ef034bd --- /dev/null +++ b/app/android/app/src/main/res/values/colors.xml @@ -0,0 +1,9 @@ + + + + #FFF8F0 + #1A1614 + #E07A5F + #2D2420 + #F0E8DF + diff --git a/app/android/app/src/main/res/values/strings.xml b/app/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..57719bb --- /dev/null +++ b/app/android/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + 暖记 + diff --git a/app/android/app/src/main/res/values/styles.xml b/app/android/app/src/main/res/values/styles.xml index cb1ef88..fcc461a 100644 --- a/app/android/app/src/main/res/values/styles.xml +++ b/app/android/app/src/main/res/values/styles.xml @@ -1,17 +1,10 @@ - + - diff --git a/app/android/build.gradle.kts b/app/android/build.gradle.kts index dbee657..2147f68 100644 --- a/app/android/build.gradle.kts +++ b/app/android/build.gradle.kts @@ -1,5 +1,8 @@ allprojects { repositories { + // 阿里云 Maven 镜像 — 加速中国大陆依赖下载 + maven { url = uri("https://maven.aliyun.com/repository/google") } + maven { url = uri("https://maven.aliyun.com/repository/central") } google() mavenCentral() } @@ -15,6 +18,28 @@ subprojects { val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) project.layout.buildDirectory.value(newSubprojectBuildDir) } + +subprojects { + // 为缺少 namespace 的旧 Flutter 插件自动注入 namespace + // 解决 AGP 9.x 要求必须指定 namespace 的问题 + plugins.withId("com.android.library") { + val android = project.extensions.getByName("android") + if (android is com.android.build.gradle.LibraryExtension && android.namespace == null) { + val manifestFile = project.file("src/main/AndroidManifest.xml") + if (manifestFile.exists()) { + val packageName = manifestFile.readLines() + .firstOrNull { it.contains("package=") } + ?.let { line -> + Regex("package=\"([^\"]+)\"").find(line)?.groupValues?.get(1) + } + if (packageName != null) { + android.namespace = packageName + } + } + } + } +} + subprojects { project.evaluationDependsOn(":app") } diff --git a/app/android/gradle.properties b/app/android/gradle.properties index e96108c..2f4b32d 100644 --- a/app/android/gradle.properties +++ b/app/android/gradle.properties @@ -4,3 +4,8 @@ android.useAndroidX=true android.newDsl=false # This builtInKotlin flag was added by the Flutter template android.builtInKotlin=false +# 构建性能优化 +org.gradle.parallel=true +org.gradle.caching=true +# 暂不启用 configuration-cache(与 init 脚本冲突) +# org.gradle.configuration-cache=true diff --git a/app/android/settings.gradle.kts b/app/android/settings.gradle.kts index c21f0c5..2788107 100644 --- a/app/android/settings.gradle.kts +++ b/app/android/settings.gradle.kts @@ -11,6 +11,10 @@ pluginManagement { includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") repositories { + // 阿里云 Maven 镜像 — 加速中国大陆依赖下载 + maven { url = uri("https://maven.aliyun.com/repository/google") } + maven { url = uri("https://maven.aliyun.com/repository/central") } + maven { url = uri("https://maven.aliyun.com/repository/gradle-plugin") } google() mavenCentral() gradlePluginPortal()