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 就能执行了,这是我的执行日志(证明是可行的,不全贴,太长了):

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

相关推荐
0wioiw06 小时前
Flutter基础(FFI)
flutter
Georgewu9 天前
【HarmonyOS 5】鸿蒙跨平台开发方案详解(一)
flutter·harmonyos
爱吃鱼的锅包肉9 天前
Flutter开发中记录一个非常好用的图片缓存清理的插件
flutter
张风捷特烈10 天前
每日一题 Flutter#13 | build 回调的 BuildContext 是什么
android·flutter·面试
恋猫de小郭10 天前
Flutter 又双叒叕可以在 iOS 26 的真机上 hotload 运行了,来看看又是什么黑科技
android·前端·flutter
QC七哥10 天前
跨平台开发flutter初体验
android·flutter·安卓·桌面开发
小喷友11 天前
Flutter 从入门到精通(水)
前端·flutter·app
恋猫de小郭11 天前
Flutter 里的像素对齐问题,深入理解为什么界面有时候会出现诡异的细线?
android·前端·flutter
tbit11 天前
dart私有命名构造函数的作用与使用场景
flutter·dart