Flutter项目升级到Target API 35的经验:遵循Google Play商店最新要求

完整指南:升级Flutter项目到target API 35以满足Google Play商店从2025年8月开始的最新要求。

Tags:
  • #Flutter
  • #Android
  • #API 35
  • #Google Play Store
  • #Mobile Development
  • #Upgrade Guide
Learning Path: Not Found | Category: Mobile Development

2025年8月开始,Google Play要求所有新应用和更新都必须目标API级别35 (Android 15)。以下是我升级Flutter项目以满足Play商店最新要求的经验分享。

🔧 主要变更

1. 更新 compileSdkVersiontargetSdkVersion

在文件 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
    }
}

🚨 注意事项

  1. 升级前备份项目
  2. 升级后在各种Android设备上测试
  3. 注意您使用的依赖项的破坏性更改
  4. 将所有插件更新到支持API 35的最新版本
  5. Core library desugaring仅在使用特定插件如flutter_local_notifications时才需要

💡 故障排除提示

🎯 结论

对于大多数Flutter项目,升级到API 35非常简单 - 只需将compileSdkVersiontargetSdkVersion更新为35。像core library desugaring这样的额外配置仅在使用需要Java 8+功能的特定插件时才需要。

最重要的是升级后进行全面测试,确保所有功能仍能正常工作。

📚 参考资料


本文基于升级生产环境Flutter项目到target API 35的经验。如果您有疑问或其他问题,欢迎讨论!

Logo Adib

© 2025 Adib

GitHub