从2025年8月开始,Google Play要求所有新应用和更新都必须目标API级别35 (Android 15)。以下是我升级Flutter项目以满足Play商店最新要求的经验分享。
🔧 主要变更
1. 更新 compileSdkVersion 和 targetSdkVersion
在文件 android/app/build.gradle 中:
android {
compileSdkVersion 35 // 之前:34或更旧版本
defaultConfig {
targetSdkVersion 35 // 之前:34或更旧版本
// ... 其他配置
}
}
2. Flutter Local Notifications配置(如果使用)
⚠️ 重要说明: 此步骤仅在您的项目使用flutter_local_notifications插件时才需要。如果您不使用此插件,请跳到步骤3。
A. 添加Core Library Desugaring
在文件 android/app/build.gradle 中:
android {
compileSdkVersion 35
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
targetSdkVersion 35
minSdkVersion 21 // 确保最低SDK 21或更高
// ... 其他配置
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.0.4"
}
B. 更新通知权限
在文件 android/app/src/main/AndroidManifest.xml 中:
<!-- 现有的通知权限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE" />
<!-- API 35+必需 -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
并更新服务配置:
<application>
<!-- ... 现有配置 ... -->
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ActionBroadcastReceiver" />
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
</application>
3. 更新Android Gradle Plugin
在文件 android/build.gradle 中:
dependencies {
classpath 'com.android.tools.build:gradle:8.3.2' // 更新到最新版本
// ... 其他依赖
}
4. 更新Gradle Wrapper
在文件 android/gradle/wrapper/gradle-wrapper.properties 中:
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip
5. 添加构建日志器(可选)
如果您想在构建期间记录Flutter/Dart版本详情以帮助新开发者设置本地环境,请在 android/build.gradle 中添加:
// BUILD LOGGER - 用于跟踪环境版本
def buildId = UUID.randomUUID().toString().substring(0, 8)
def buildStartTime = new Date()
def buildStatus = "SUCCESS"
def hasLoggedThisBuild = false
gradle.taskGraph.afterTask { task, state ->
if (state.failure) {
buildStatus = "FAILED"
}
def mainTasks = ['assembleRelease', 'assembleDebug', 'bundleRelease', 'bundleDebug']
if (task.name in mainTasks && !hasLoggedThisBuild) {
def endTime = new Date()
def duration = (endTime.time - buildStartTime.time) / 1000
def pubspec = new File("${rootDir.parent}/pubspec.yaml")
def versionLine = pubspec.readLines().find { it.startsWith("version:") }
def appVersion = versionLine?.replace("version:", "")?.trim() ?: "unknown"
def flutterVersion = "flutter --version".execute().text.trim()
def logFile = new File("${rootDir.parent}/build_history.md")
if (!logFile.exists()) {
logFile.text = "# Build History\n\n"
}
def buildLog = """
## Build ${buildId}
- **App Version:** ${appVersion}
- **Date:** ${endTime.format("dd/MM/yyyy HH:mm:ss")}
- **Build Type:** ${task.name}
- **Duration:** ${duration}s
- **Status:** ${buildStatus}
- **Flutter Version:** ${flutterVersion.split('\n')[0]}
---
"""
logFile.text = buildLog + logFile.text
hasLoggedThisBuild = true
}
}
🚨 注意事项
- 升级前备份项目
- 升级后在各种Android设备上测试
- 注意您使用的依赖项的破坏性更改
- 将所有插件更新到支持API 35的最新版本
- Core library desugaring仅在使用特定插件如
flutter_local_notifications时才需要
💡 故障排除提示
- 如果遇到
AAPT2错误,删除android/.gradle文件夹并重新构建 - 确保在Android Studio中安装了Android SDK Platform 35
- 使用
flutter doctor确保环境正确 - 如果不使用
flutter_local_notifications,跳过desugaring配置 - 如果遇到desugaring相关错误,确保Java 8兼容性配置正确
🎯 结论
对于大多数Flutter项目,升级到API 35非常简单 - 只需将compileSdkVersion和targetSdkVersion更新为35。像core library desugaring这样的额外配置仅在使用需要Java 8+功能的特定插件时才需要。
最重要的是升级后进行全面测试,确保所有功能仍能正常工作。
📚 参考资料
本文基于升级生产环境Flutter项目到target API 35的经验。如果您有疑问或其他问题,欢迎讨论!