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
相关产品推荐
相关产品推荐

