You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何为不同Flavor配置独立代码库与资源?

在Flutter中实现Flavor专属源码与资源分离(缩小APK体积)

要实现和Android原生类似的Flavor专属源码、资源分离,从而缩小APK体积,你可以通过调整项目目录结构、配置Gradle的sourceSets、指定Flutter专属入口文件这几个步骤来完成,具体如下:

1. 搭建专属目录结构

首先在项目根目录下,为每个Flavor创建独立的源码和资源目录,同时保留公共目录存放共用代码与资源:

你的项目/
├── lib/                 # 公共Flutter代码
├── assets/              # 公共资源(图片、字体等)
├── lib_flavorA/         # FlavorA专属代码
├── assets_flavorA/      # FlavorA专属资源
├── lib_flavorB/         # FlavorB专属代码
├── assets_flavorB/      # FlavorB专属资源
└── android/

2. 配置Android端Gradle的sourceSets

打开android/app/build.gradle,在productFlavors块中为每个Flavor配置专属的资源与源码目录,确保构建时只打包当前Flavor的内容:

android {
    // ... 其他配置

    flavorDimensions "app"
    productFlavors {
        flavorA {
            dimension "app"
            sourceSets {
                main {
                    // 关联FlavorA专属资源+公共资源
                    assets.srcDirs += ["../assets_flavorA", "../assets"]
                    // 若有Android原生专属代码,可在此配置
                    java.srcDirs += "src/flavorA/java"
                    res.srcDirs += "src/flavorA/res"
                }
            }
        }
        flavorB {
            dimension "app"
            sourceSets {
                main {
                    assets.srcDirs += ["../assets_flavorB", "../assets"]
                    java.srcDirs += "src/flavorB/java"
                    res.srcDirs += "src/flavorB/res"
                }
            }
        }
    }

    // ... 其他配置
}

3. 为每个Flavor创建独立入口文件

在lib/目录下为每个Flavor创建专属的入口文件,用于加载对应Flavor的专属代码:

  • lib/main_flavorA.dart
import 'package:flutter/material.dart';
import '../lib_flavorA/flavor_specific_page.dart';

void main() {
  runApp(const FlavorAApp());
}

class FlavorAApp extends StatelessWidget {
  const FlavorAApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flavor A',
      home: const FlavorSpecificPage(), // 加载FlavorA专属页面
    );
  }
}
  • lib/main_flavorB.dart
import 'package:flutter/material.dart';
import '../lib_flavorB/flavor_specific_page.dart';

void main() {
  runApp(const FlavorBApp());
}

class FlavorBApp extends StatelessWidget {
  const FlavorBApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flavor B',
      home: const FlavorSpecificPage(), // 加载FlavorB专属页面
    );
  }
}

接着回到android/app/build.gradle,为每个Flavor指定对应的Flutter入口文件:

android {
    // ... 其他配置

    productFlavors {
        flavorA {
            // ... 之前的sourceSets配置
            manifestPlaceholders = [
                flutterMainActivityArgs: "--target=lib/main_flavorA.dart"
            ]
        }
        flavorB {
            // ... 之前的sourceSets配置
            manifestPlaceholders = [
                flutterMainActivityArgs: "--target=lib/main_flavorB.dart"
            ]
        }
    }
}

4. 构建指定Flavor的APK

使用Flutter构建命令打包对应Flavor的APK,此时构建工具会只打包该Flavor的专属代码、资源,以及公共部分,从而缩小APK体积:

# 构建FlavorA的release APK
flutter build apk --flavor flavorA --release

# 构建FlavorB的release APK
flutter build apk --flavor flavorB --release

关键说明

  • 专属目录中的代码不会被其他Flavor打包,因为Gradle的sourceSets仅为当前Flavor关联对应目录,避免了冗余代码。
  • 资源方面,未被当前Flavor关联的专属资源目录不会被打包进APK,直接减少了体积。
  • 如果需要处理iOS端的Flavor分离,逻辑类似,可在Xcode中为每个Target配置专属的源码与资源目录。

内容的提问来源于stack exchange,提问作者dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:55:40