有多少人是通过原生混合Flutter的方式去搞项目的?
关于打包这事,一切还是从
"假如你的flutter module又依赖了三方的flutter plugin,打包之后没法把plugin内容也打进去"
这个问题开始说起。
以前在还算可以的厂上班,搞Flutter打包都是CI系统点点按钮自动搞定,没想那么多,现在出来混了,重新又搞Flutter,需要自己去打包,还以为就 build aar 完事。谁知道一运行,一搜索才知道有这个破问题。

那么网上解决方案其实都是用 fat-aar 这个插件去解决,然后都是几句话带过,也没细讲,我TM看不懂啊,所以经过自己实践后想写篇文章记录下来如何打包(如果你也有同样问题,看了本文章后看不懂,请在评论区打上我TM也看不懂。。)。
首先是扫盲图,下面是打包后的产物目录:

每一个文件夹下可都有一个 aar,里面包含着各自插件的原生代码。他们可不会合到你的主包 aar 里面。
可行的方案
其实这破问题还是有几种解决方案的。
第一种:
将这些aar全部复制粘贴到你的原生项目里面,这是最简单也是最傻逼的方法,正经人不会用。
第二种:
如果你有产物仓库的,比如阿里云,云效之类的,可以将这些aar全都上传上去,然后再一一依赖。这种最符合谷歌规范(AI说的),但是实际操作起来贼麻烦,版本管理也麻烦,放弃。
第三种:
使用fat-aar,将这些aar合成一个,方便快捷。
fat-aar使用注意事项
- 你的原生项目最好支持gradle8.0,可以避免很多打包报错,因为现在创建flutter项目基本的代码模版都是8.0以上的,然后很多第三方库也是要求8.0以上,不升级报错很难搞哦。
- fat-aar搜索一般都会搜到这个地址:github.com/kezong/fat-... 但是,这个库不要用,因为停止维护并且不支持gradle高版本。我们要用这个:github.com/aasitnikov/...
- fat-aar也有些问题,就是打包出来的abi架构都是全的,想只要某一种还不知道怎么搞,反正试了各种方案没效果,有大佬知道可以说下。
打包脚本
因为 .android 文件夹是动态生成的,所以打包一定要用脚本形式,选用shell脚本,新建一个叫 build_aar.sh 的文件放到项目根目录。下面我将详情讲解:
第一步,打包配置
首先要先处理一些基本的配置,比如打包版本号,debug包还是release包:
shell
# 获取用户输入的版本号
echo "请输入打包版本号(例如:1.0.0):"
read version_number
# 验证版本号格式
if [[ ! $version_number =~ ^[0-9]+.[0-9]+.[0-9]+$ ]]; then
echo "错误:版本号格式不正确,请使用 x.y.z 格式(例如:1.0.0)"
exit 1
fi
echo "您输入的版本号为:${version_number}"
# 获取用户输入的构建类型
echo "请选择构建类型:"
echo "1. Debug 包"
echo "2. Release 包"
read -p "请输入选项(1 或 2): " build_type_choice
# 验证构建类型输入
case $build_type_choice in
1)
build_type="debug"
;;
2)
build_type="release"
;;
*)
echo "错误:无效的选项,请输入 1 或 2"
exit 1
;;
esac
echo "您选择的构建类型为:${build_type}"
第二步,不管那么多先clean一下
配置完基础的东西后,先clean一下总没错:
shell
# 设置默认项目目录(如果未定义)
projectDir="${projectDir:-$(pwd)}"
echo "当前项目目录:${projectDir}"
echo "请确认项目目录是否正确。如果不正确,请设置 projectDir 变量,例如:"
echo "export projectDir=/path/to/your/project"
## 清理项目
echo "清理当前项目..."
flutter clean
rm -rf .dart_tool/flutter_build/
if [ -d "${projectDir}/.android/build" ]; then
rm -rf "${projectDir}/.android/build"
echo "清理 .android/build 目录完成!"
else
echo "提示:.android/build 目录不存在,跳过清理..."
fi
flutter pub get
先定义根目录,方便后面使用,然后执行 flutter clean 和 flutter pub get。
第三步,处理上传脚本
打包完成功自然要上传到产物仓库上来依赖使用,那么就需要上传脚本,新建一个名字叫 publish.gradle 的文件同样放到项目根目录,然后写上一些最基础的变量:
gradle
apply plugin: 'maven-publish'
// 版本和包名配置
def versionRelease = '1.0.0'
def versionDebug = '1.0.0'
project.ext.buildType = project.hasProperty('buildType') ? project.buildType : 'debug'
def groupIdStr = 'com.xxx.xxx'
def artifactIdStr = 'flutter'
versionRelease 和 versionDebug 主要是用于记录当前打包的版本号,避免忘记当前打包打倒什么版本了,只是个标记,没使用的地方。
然后就是获取 buildType,定义一下 groupId 和 artifactId。
(这里的脚本代码都是按照我实际项目中需要的东西节奏来,在使用中根据自己的实际情况进行调节)
回到 shell 脚本,在clean后,我们更新下 publish.gradle 中的基础变量:
shell
# 更新 publish.gradle 中的 buildType
PUBLISH_GRADLE="${projectDir}/publish.gradle"
echo "更新 ${PUBLISH_GRADLE} 中的 buildType 为 ${build_type}..."
if [ -f "$PUBLISH_GRADLE" ]; then
# 检查文件是否可写
if [ ! -w "$PUBLISH_GRADLE" ]; then
echo "错误:${PUBLISH_GRADLE} 不可写,请检查文件权限!"
exit 1
fi
# 使用 sed 更新 buildType 变量
sed -i '' "s/def buildType = '.*'/def buildType = '${build_type}'/" "$PUBLISH_GRADLE"
if [ $? -eq 0 ]; then
echo "成功更新 publish.gradle 中的 buildType 为 ${build_type}!"
else
echo "错误:更新 publish.gradle 失败!"
exit 1
fi
else
echo "错误:${PUBLISH_GRADLE} 不存在!"
exit 1
fi
第四步,修改 Flutter/build.gradle
我们要修改 .android/Flutter/build.gradle文件,往里面引用 fat-aar插件和处理一些基础配置, (我的脚本方法都是修改源文件,还有一种非常简单的脚本方法是先写好修改后的代码文件,然后直接文件替换,推荐替换这种方式,脚本简单,修改也简单,我是写好了才想到,所以懒得改了)
首先,目标是将 Flutter/build.gradle 文件修改成下面那样(点击链接查看): gitee.com/lzx_xzl/flu...
脚本:
shell
# 修改 Flutter/build.gradle
FLUTTER_BUILD_GRADLE="${projectDir}/.android/Flutter/build.gradle"
echo "目标文件路径:${FLUTTER_BUILD_GRADLE}"
if [ -f "$FLUTTER_BUILD_GRADLE" ]; then
# 检查文件是否可写
if [ ! -w "$FLUTTER_BUILD_GRADLE" ]; then
echo "错误:${FLUTTER_BUILD_GRADLE} 不可写,请检查文件权限!"
echo "尝试:chmod +w ${FLUTTER_BUILD_GRADLE}"
exit 1
fi
echo "检查并修改 Flutter/build.gradle..."
# 检查是否已存在 buildscript 块
if ! grep -q "buildscript {" "$FLUTTER_BUILD_GRADLE"; then
echo "添加 buildscript 块..."
# 在文件顶部添加 buildscript 块
sed -i '' '1i\
buildscript {\
repositories {\
google()\
mavenCentral()\
maven {\
url "https://jitpack.io"\
content {\
includeGroup("com.github.aasitnikov")\
}\
}\
}\
dependencies {\
classpath "com.github.aasitnikov:fat-aar-android:1.4.2"\
}\
}\
' "$FLUTTER_BUILD_GRADLE"
else
echo "buildscript 块已存在,跳过添加..."
fi
# 添加 dependencies_gradle_plugin.gradle 引用
if ! grep -q "apply from: "../dependencies_gradle_plugin.gradle"" "$FLUTTER_BUILD_GRADLE"; then
echo "apply from: "../dependencies_gradle_plugin.gradle"" >> "$FLUTTER_BUILD_GRADLE"
fi
# 禁用混淆和资源压缩
if ! grep -q "minifyEnabled true" "$FLUTTER_BUILD_GRADLE"; then
echo "开启代码混淆和资源压缩..."
# 在 buildTypes 块中添加 minifyEnabled 和 shrinkResources 配置
if grep -q "buildTypes {" "$FLUTTER_BUILD_GRADLE"; then
# 如果 buildTypes 块存在,在 release 块中添加配置
sed -i '' '/release {/a\
minifyEnabled true\
shrinkResources false' "$FLUTTER_BUILD_GRADLE"
else
# 如果 buildTypes 块不存在,添加完整的 buildTypes 块
cat << EOF >> "$FLUTTER_BUILD_GRADLE"
android {
buildTypes {
release {
minifyEnabled true
shrinkResources false
}
}
}
EOF
fi
fi
echo "Flutter/build.gradle 修改完成!"
else
echo "错误:${FLUTTER_BUILD_GRADLE} 不存在!"
echo "请确认 projectDir 是否正确,或者手动指定文件路径。"
exit 1
fi
代码比较长,但是看着注释还行,步骤是,往里面添加 buildscript 模块,用于引用 fat-aar 插件。 然后引用 dependencies_gradle_plugin.gradle 文件,这个文件是动态生成的,用于处理 fat-aar 逻辑,后面会说到。最后添加 buildTypes 配置。
第五步,修改 .android/build.gradle
同样的,目标是将文件修改成下面这样(点击链接查看): gitee.com/lzx_xzl/flu...
脚本:
shell
# 修改 .android/build.gradle
BUILD_GRADLE="${projectDir}/.android/build.gradle"
echo "目标文件路径:${BUILD_GRADLE}"
if [ -f "$BUILD_GRADLE" ]; then
# 检查文件是否可写
if [ ! -w "$BUILD_GRADLE" ]; then
echo "错误:${BUILD_GRADLE} 不可写,请检查文件权限!"
exit 1
fi
echo "检查并修改 build.gradle..."
# 添加 fat-aar 插件
if ! grep -q "com.kezong.fat-aar" "$BUILD_GRADLE"; then
sed -i '' '/apply plugin: "kotlin-android"/a\
apply plugin: "com.kezong.fat-aar"' "$BUILD_GRADLE"
fi
# 添加 buildscript 配置,使用 AGP 8.1.0
if ! grep -q "com.github.kezong:fat-aar" "$BUILD_GRADLE"; then
cat << EOF >> "$BUILD_GRADLE"
buildscript {
repositories {
google()
mavenCentral()
maven {
url "https://jitpack.io"
content {
includeGroup("com.github.aasitnikov")
}
}
}
dependencies {
classpath 'com.android.tools.build:gradle:8.1.0'
classpath 'com.github.aasitnikov:fat-aar-android:1.4.2'
}
}
EOF
else
# 确保 AGP 版本是 8.1.0
sed -i '' 's/classpath *['''"]com.android.tools.build:gradle:[0-9.]*['''"]/classpath '''com.android.tools.build:gradle:8.1.0'''/' "$BUILD_GRADLE"
fi
echo "build.gradle 修改完成!"
else
echo "错误:${BUILD_GRADLE} 不存在!"
exit 1
fi
同样的,修改目的也是引用 fat-aar 插件,不多讲。
第六步,设置NDK版本
我是打包的时候报错提示NDK版本不对才有这个步骤,如果没报错可以忽略。主要是修改 .android/app。build.gradle文件:
这是修改的目标效果(点击查看):gitee.com/lzx_xzl/flu...
脚本:
shell
# 修改 .android/app/build.gradle,设置 NDK 版本
APP_BUILD_GRADLE="${projectDir}/.android/app/build.gradle"
echo "目标文件路径:${APP_BUILD_GRADLE}"
if [ -f "$APP_BUILD_GRADLE" ]; then
# 检查文件是否可写
if [ ! -w "$APP_BUILD_GRADLE" ]; then
echo "错误:${APP_BUILD_GRADLE} 不可写,请检查文件权限!"
exit 1
fi
echo "检查并修改 app/build.gradle,设置 NDK 版本..."
if ! grep -q "ndkVersion" "$APP_BUILD_GRADLE"; then
# 使用 awk 插入 ndkVersion,确保换行正确
awk '/android {/ {print; print " ndkVersion = "27.0.12077973""; next}1' "$APP_BUILD_GRADLE" > temp && mv temp "$APP_BUILD_GRADLE"
fi
echo "app/build.gradle 修改完成!"
else
echo "警告:${APP_BUILD_GRADLE} 不存在,跳过修改..."
fi
第七步,修改 setting.gradle
修改 setting.gradle 的目的主要是为了引用 setting_gradle_plugin.gradle 文件,这个文件也是动态生成的,里面同样的处理一些 fat-aar 脚本逻辑。 目的修改效果(点击查看):gitee.com/lzx_xzl/flu...
脚本:
shell
# 修改 settings.gradle
SETTINGS_GRADLE="${projectDir}/.android/settings.gradle"
echo "目标文件路径:${SETTINGS_GRADLE}"
if [ -f "$SETTINGS_GRADLE" ]; then
# 检查文件是否可写
if [ ! -w "$SETTINGS_GRADLE" ]; then
echo "错误:${SETTINGS_GRADLE} 不可写,请检查文件权限!"
exit 1
fi
echo "检查并修改 settings.gradle..."
if ! grep -q "apply from: "./setting_gradle_plugin.gradle"" "$SETTINGS_GRADLE"; then
echo "apply from: "./setting_gradle_plugin.gradle"" >> "$SETTINGS_GRADLE"
fi
echo "settings.gradle 修改完成!"
else
echo "错误:${SETTINGS_GRADLE} 不存在!"
exit 1
fi
第七步,创建 dependencies_gradle_plugin.gradle
这个文件的主要作用是使用fat-aar去处理添加插件,文件内容如下(点击查看): gitee.com/lzx_xzl/flu... 这是创建的脚本:
shell
# 创建 dependencies_gradle_plugin.gradle
DEPENDENCIES_PLUGIN="${projectDir}/.android/dependencies_gradle_plugin.gradle"
echo "目标文件路径:${DEPENDENCIES_PLUGIN}"
if [ ! -f "$DEPENDENCIES_PLUGIN" ]; then
echo "创建 dependencies_gradle_plugin.gradle..."
cat << EOF > "$DEPENDENCIES_PLUGIN"
apply plugin: 'com.kezong.fat-aar'
fataar {
transitive = false
}
dependencies {
// 嵌入 Flutter 核心依赖
def flutterSdkDir = rootProject.projectDir.parentFile.toPath()
def flutterJar = new File(flutterSdkDir.toFile(), '.android/Flutter/build/intermediates/flutter/release/flutter.jar')
if (flutterJar.exists()) {
println "嵌入 Flutter 核心依赖: ${flutterJar.getAbsolutePath()}"
embed files(flutterJar)
} else {
println "警告: Flutter 核心依赖文件 ${flutterJar.getAbsolutePath()} 不存在,跳过嵌入!"
}
// 嵌入 Flutter 插件依赖
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
def totalPlugins = 0
def includedPlugins = []
println "检查 .flutter-plugins 文件: ${pluginsFile.getAbsolutePath()}"
if (pluginsFile.exists()) {
println ".flutter-plugins 文件存在,开始加载..."
pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
totalPlugins = plugins.size()
println "加载 .flutter-plugins 成功,找到 ${totalPlugins} 个插件"
} else {
println "错误: .flutter-plugins 文件不存在,请确保已执行 'flutter pub get'!"
System.exit(1)
}
plugins.each { name, path ->
if (!name.endsWith('_linux') && !name.endsWith('_darwin') && !name.endsWith('_windows') && !name.endsWith('_web')) {
def pluginAndroidDir = flutterProjectRoot.resolve(path).resolve('android').toFile()
if (pluginAndroidDir.exists()) {
try {
println "添加插件依赖: ${name} (路径: ${path})"
embed project(path: ":${name}", configuration: 'default')
includedPlugins.add(name)
} catch (Exception e) {
println "警告: 无法嵌入插件 ${name},错误: ${e.getMessage()}"
}
} else {
println "警告: 插件 ${name} 的 Android 模块不存在 (路径: ${pluginAndroidDir.getAbsolutePath()}),跳过嵌入!"
}
}
}
println "插件依赖处理完成:"
println " 总插件数: ${totalPlugins}"
println " 成功添加: ${includedPlugins.size()} 个插件 (${includedPlugins})"
println " 跳过: ${totalPlugins - includedPlugins.size()} 个插件"
if (includedPlugins.size() == 0) {
println "警告: 没有成功添加任何插件,请检查 .flutter-plugins 文件和插件配置!"
}
}
configurations {
embed
api.extendsFrom(embed)
implementation.extendsFrom(embed)
}
EOF
echo "dependencies_gradle_plugin.gradle 创建完成!"
else
echo "dependencies_gradle_plugin.gradle 已存在,跳过创建..."
fi
第八步,创建 setting_gradle_plugin.gradle
这个文件的作用主要是通过遍历 .flutter-plugins 文件,去找出android相关的插件添加,文件内容如下(点击查看): gitee.com/lzx_xzl/flu...
脚本:
shell
# 创建 setting_gradle_plugin.gradle
SETTING_PLUGIN="${projectDir}/.android/setting_gradle_plugin.gradle"
echo "目标文件路径:${SETTING_PLUGIN}"
if [ ! -f "$SETTING_PLUGIN" ]; then
echo "创建 setting_gradle_plugin.gradle..."
cat << EOF > "$SETTING_PLUGIN"
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
def totalPlugins = 0
def includedPlugins = []
println "检查 .flutter-plugins 文件: ${pluginsFile.getAbsolutePath()}"
if (pluginsFile.exists()) {
println ".flutter-plugins 文件存在,开始加载..."
pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
totalPlugins = plugins.size()
println "加载 .flutter-plugins 成功,找到 ${totalPlugins} 个插件"
} else {
println "错误: .flutter-plugins 文件不存在,请确保已执行 'flutter pub get'!"
System.exit(1)
}
// 首先处理主插件(非平台特定的插件)
plugins.each { name, path ->
if (!name.contains('_linux') && !name.contains('_darwin') && !name.contains('_windows') && !name.contains('_web')) {
def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
if (pluginDirectory.exists()) {
include ":${name}"
project(":${name}").projectDir = pluginDirectory
includedPlugins.add(name)
println "添加插件 include: ${name} (路径: ${pluginDirectory.getAbsolutePath()})"
} else {
println "警告: 插件 ${name} 的 Android 模块不存在 (路径: ${pluginDirectory.getAbsolutePath()}),跳过包含!"
}
}
}
// 然后处理平台特定的插件,但只处理 Android 平台的
plugins.each { name, path ->
if (name.endsWith('_android')) {
def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
if (pluginDirectory.exists()) {
include ":${name}"
project(":${name}").projectDir = pluginDirectory
includedPlugins.add(name)
println "添加插件 Android include: ${name} (路径: ${pluginDirectory.getAbsolutePath()})"
} else {
println "警告: 插件 ${name} 的 Android 模块不存在 (路径: ${pluginDirectory.getAbsolutePath()}),跳过包含!"
}
}
}
println "插件包含处理完成:"
println " 总插件数: ${totalPlugins}"
println " 成功包含: ${includedPlugins.size()} 个插件 (${includedPlugins})"
println " 跳过: ${totalPlugins - includedPlugins.size()} 个插件"
if (includedPlugins.size() == 0) {
println "错误: 没有成功包含任何插件,请检查 .flutter-plugins 文件和插件配置!"
System.exit(1)
}
EOF
echo "setting_gradle_plugin.gradle 创建完成!"
else
echo "setting_gradle_plugin.gradle 已存在,跳过创建..."
fi
这里重点说明一下,我使用的flutter sdk版本是 3.29.3,dart版本是 3.7.2 ,当我使用最新版本是,发现 .flutter-plugins 文件不会生成,不知道为什么。
第九步 创建 proguard-rules.pro 文件
混淆文件主要创建位于 .android/Flutter 下面,文件内容如下(点击查看):gitee.com/lzx_xzl/flu...
这是脚本:
shell
# 创建 proguard-rules.pro 文件
PROGUARD_FILE="${projectDir}/.android/Flutter/proguard-rules.pro"
echo "目标文件路径:${PROGUARD_FILE}"
if [ ! -f "$PROGUARD_FILE" ]; then
echo "创建 proguard-rules.pro..."
cat << EOF > "$PROGUARD_FILE"
# 保持默认构造函数,解决 R8 警告
-dontwarn java.lang.invoke.StringConcatFactory
-keep class java.lang.invoke.StringConcatFactory { *; }
-keep class com.google.vending.licensing.ILicensingService { void <init>(); }
-keep class com.android.vending.licensing.ILicensingService { void <init>(); }
-keep class com.google.android.vending.licensing.ILicensingService { void <init>(); }
-keep class android.support.annotation.Keep { void <init>(); }
-keep class **.R { void <init>(); }
-keep class * extends androidx.startup.Initializer { void <init>(); }
-keep class * implements androidx.versionedparcelable.VersionedParcelable { void <init>(); }
-keep class androidx.versionedparcelable.ParcelImpl { void <init>(); }
-keep class <1> { void <init>(); }
EOF
echo "proguard-rules.pro 创建完成!"
else
echo "proguard-rules.pro 已存在,跳过创建..."
fi
第十步, 修改 AndroidManifest.xml,移除 package 属性
我忘记为啥要这一步了,可能是遇到报错?
脚本:
shell
# 修改 AndroidManifest.xml,移除 package 属性
MANIFEST_FILE="${projectDir}/.android/Flutter/src/main/AndroidManifest.xml"
echo "目标文件路径:${MANIFEST_FILE}"
if [ -f "$MANIFEST_FILE" ]; then
# 检查文件是否可写
if [ ! -w "$MANIFEST_FILE" ]; then
echo "错误:${MANIFEST_FILE} 不可写,请检查文件权限!"
exit 1
fi
echo "检查并修改 AndroidManifest.xml,移除 package 属性..."
sed -i '' 's/package="[^"]*"//' "$MANIFEST_FILE"
echo "AndroidManifest.xml 修改完成!"
else
echo "错误:${MANIFEST_FILE} 不存在!"
exit 1
fi
第十一步,执行打包命令
shell
# 构建 AAR
echo "构建 AAR..."
echo "执行 flutter build aar,生成 AAR 和 pom 文件..."
flutter build aar --build-number "$version_number" --no-profile --no-debug -v > build_aar.log 2>&1
if [ $? -eq 0 ]; then
echo "flutter build aar 执行成功!版本号:${version_number}"
else
echo "flutter build aar 执行失败!请检查 build_aar.log 获取详细信息。"
exit 1
fi
echo "AAR 打包完成!版本号:${version_number}"
打包命令一定要打 release 包,因为你打 debug 包,包体积非常大的。
第十二步,配置打包脚本:
首先,我的上传脚本完整代码如下(点击查看):gitee.com/lzx_xzl/flu...
主要逻辑是,根据 buildType,去判断上传仓库的地址,然后如果是debug包,版本号后面给他添加上 "-SNAPSHOT",最后就是遍历 pom 文件,给他自动添加上依赖 flutter_embedding_release 和 arm64_v8a_release。
下面脚本主要围绕着 publish.gradle 编写:
shell
echo "开始执行上传脚本..."
# 1. Append 'apply from: "../../publish.gradle"' to .android/Flutter/build.gradle
FLUTTER_BUILD_GRADLE="${projectDir}/.android/Flutter/build.gradle"
echo "目标文件路径:${FLUTTER_BUILD_GRADLE}"
if [ -f "$FLUTTER_BUILD_GRADLE" ]; then
# Check if the file is writable
if [ ! -w "$FLUTTER_BUILD_GRADLE" ]; then
echo "错误:${FLUTTER_BUILD_GRADLE} 不可写,请检查文件权限!"
echo "尝试:chmod +w ${FLUTTER_BUILD_GRADLE}"
exit 1
fi
# Check if the line already exists to avoid duplication
if ! grep -q "apply from: "../../publish.gradle"" "$FLUTTER_BUILD_GRADLE"; then
echo "往 ${FLUTTER_BUILD_GRADLE} 添加 publish.gradle 引用..."
echo "apply from: "../../publish.gradle"" >> "$FLUTTER_BUILD_GRADLE"
if [ $? -eq 0 ]; then
echo "成功添加 publish.gradle 引用!"
else
echo "错误:添加 publish.gradle 引用失败!"
exit 1
fi
else
echo "publish.gradle 引用已存在,跳过添加..."
fi
else
echo "错误:${FLUTTER_BUILD_GRADLE} 不存在!"
exit 1
fi
# 2. Navigate to .android directory and execute publish.gradle
echo "进入 .android 目录并执行 publish.gradle..."
cd "${projectDir}/.android" || { echo "错误:无法进入 ${projectDir}/.android 目录!"; exit 1; }
# Check if publish.gradle exists
PUBLISH_GRADLE="${projectDir}/publish.gradle"
if [ "$build_type" = "release" ]; then
sed -i '' "s/def versionRelease = '.*'/def versionRelease = '${version_number}'/" "$PUBLISH_GRADLE"
else
sed -i '' "s/def versionDebug = '.*'/def versionDebug = '${version_number}'/" "$PUBLISH_GRADLE"
fi
if [ -f "$PUBLISH_GRADLE" ]; then
echo "执行 Gradle 发布任务..."
./gradlew publish -PflutterVersion="${version_number}" -PbuildType="${build_type}"
if [ $? -eq 0 ]; then
if [ "$build_type" = "release" ]; then
echo "✅ 发布任务成功完成!已成功发布到 Maven 仓库。版本号:${version_number}"
else
echo "✅ 发布任务成功完成!已成功发布到 Maven 仓库。版本号:${version_number}-SNAPSHOT"
fi
else
echo "错误:执行 publish.gradle 失败!请检查 Gradle 日志。"
exit 1
fi
else
echo "错误:${PUBLISH_GRADLE} 不存在!请确保 publish.gradle 文件已正确配置。"
exit 1
fi
echo "<<<<<<<<<<<<<<<<<<<<<<<<<< 上传脚本执行结束 >>>>>>>>>>>>>>>>>>>>>>>>>"
到此,所有脚本代码已经完成,这是完整文件(点击查看):gitee.com/lzx_xzl/flu...
然后在命令行那,直接输入 build_aar.sh 就能执行了,这是我的执行日志(证明是可行的,不全贴,太长了):



好了,就这样,希望能帮到你。
