Android混合Flutter项目打包aar细说

有多少人是通过原生混合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使用注意事项

  1. 你的原生项目最好支持gradle8.0,可以避免很多打包报错,因为现在创建flutter项目基本的代码模版都是8.0以上的,然后很多第三方库也是要求8.0以上,不升级报错很难搞哦。
  2. fat-aar搜索一般都会搜到这个地址:github.com/kezong/fat-... 但是,这个库不要用,因为停止维护并且不支持gradle高版本。我们要用这个:github.com/aasitnikov/...
  3. 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 就能执行了,这是我的执行日志(证明是可行的,不全贴,太长了):

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

相关推荐
zacksleo1 小时前
哪些鸿蒙原生应用在使用Flutter
前端·flutter·harmonyos
vvilkim2 小时前
Flutter布局系统全面解析:从基础组件到复杂界面构建
flutter
程序员老刘3 小时前
MCP:新时代的API,每个程序员都应该掌握
人工智能·flutter·mcp
恋猫de小郭3 小时前
Flutter 小技巧之:实现 iOS 26 的 “液态玻璃”
android·前端·flutter
帅次4 小时前
Flutter Container 组件详解
android·flutter·ios·小程序·kotlin·iphone·xcode
机器瓦力5 小时前
Flutter开发:扫码枪应用
flutter
帅次8 小时前
Flutter setState() 状态管理详细使用指南
android·flutter·ios·小程序·kotlin·android studio·iphone
Huang兄8 小时前
鸿蒙-flutter-使用FlutterEntry的路由管理和参数传递_中_flutter打开native页面传递参数
flutter·harmonyos·arkui
Huang兄8 小时前
鸿蒙-flutter-使用FlutterEntry的路由管理和参数传递_下_页面返回时透传数据
flutter·harmonyos·arkui
肥肥呀呀呀9 小时前
flutter bloc进行写app
flutter