Flutter:如何重命名flutter-apk下APK并控制其生成逻辑?
Flutter APK输出目录与文件名自定义解决方案
我已经能通过Android的build.gradle配置自定义build/app/outputs/apk目录下的APK文件名,配置代码如下:
applicationVariants.all { variant -> variant.outputs.each { output -> }}
但执行flutter run --flavor production --release等命令时,build/app/outputs/flutter-apk目录会同步生成同内容的APK,命名规则为flavorDimensions-productFlavor-buildType.apk。针对以下三个问题给出解决方案:
1. 修改flutter-apk目录下的APK文件名与apk目录一致
在android/app/build.gradle中添加afterEvaluate块,在构建完成后重命名flutter-apk目录下的APK文件,复用你已有的自定义命名逻辑:
afterEvaluate { android.applicationVariants.all { variant -> variant.outputs.each { output -> // 替换成你在apk目录使用的自定义文件名逻辑 def customFileName = "App_${variant.flavorName}_${variant.buildType.name}_${android.defaultConfig.versionName}.apk" tasks.named("assemble${variant.name.capitalize()}").configure { doLast { def flutterApkDir = file("${buildDir}/outputs/flutter-apk") // 匹配对应变体的APK文件 def targetApk = flutterApkDir.listFiles()?.find { it.name.endsWith(".apk") && it.name.contains(variant.flavorName) && it.name.contains(variant.buildType.name) } if (targetApk) { targetApk.renameTo(new File(flutterApkDir, customFileName)) } } } } } }
2. 禁用flutter-apk目录生成,仅保留apk目录
Flutter构建流程默认依赖flutter-apk目录作为输出入口,无法直接禁用,但可以在构建完成后自动删除该目录:
afterEvaluate { tasks.withType(com.android.build.gradle.tasks.AssembleAndroidTask) { task -> task.doLast { def flutterApkDir = file("${buildDir}/outputs/flutter-apk") if (flutterApkDir.exists()) { flutterApkDir.deleteDir() } } } }
如果不需要使用flutter run命令,直接执行Android原生gradle打包命令(如./gradlew assembleProductionRelease),只会生成apk目录下的APK,不会创建flutter-apk目录。
3. 除flutter clean外,高效控制APK输出路径或生成单个目录
- 指定统一输出路径:修改gradle配置,让
flutter-apk和apk目录的输出合并到同一位置:
applicationVariants.all { variant -> variant.outputs.each { output -> def unifiedOutputDir = file("${buildDir}/outputs/apk/unified") def customFileName = "你的自定义文件名.apk" // 设置apk目录的输出 output.outputFileName = customFileName output.outputDirectory = unifiedOutputDir // 让flutter-apk的输出指向同一目录 tasks.named("package${variant.name.capitalize()}").configure { outputs.dir(unifiedOutputDir) } } }
- 高效清理缓存:使用
./gradlew cleanBuildCache替代flutter clean,仅清理构建缓存,不删除所有构建输出,速度更快。 - 直接执行原生gradle任务:跳过flutter命令,直接运行Android打包任务(如
./gradlew assembleProductionRelease),仅生成apk目录下的APK文件。
内容的提问来源于stack exchange,提问作者SY MY
相关产品推荐
相关产品推荐

