解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南

解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南

前言

在开发Flutter应用时,经常会遇到Gradle构建卡在Running Gradle task 'assembleDebug'阶段的问题。本文将分享如何通过配置华为云镜像和使用自定义脚本下载依赖的方法解决这些问题。

问题描述

典型错误如下:

FAILURE: Build failed with an exception.

* Where:
Settings file 'android/settings.gradle.kts' line: 28

* What went wrong:
Error resolving plugin [id: 'dev.flutter.flutter-plugin-loader', version: '1.0.0']
> A problem occurred configuring project ':gradle'.
   > Could not resolve all artifacts for configuration ':gradle:classpath'.
      > Could not download kotlin-compiler-embeddable-1.9.24.jar
         > Could not get resource 'https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.9.24/kotlin-compiler-embeddable-1.9.24.jar'.

或者构建过程长时间卡在:

Configuration on demand is an incubating feature.
<-------------> 0% INITIALIZING [26s]
> Evaluating settings

解决方案1: 配置华为云镜像

步骤1: 修改settings.gradle.kts

pluginManagement {
            
    val flutterSdkPath = run {
            
        val properties = java.util.Properties()
        file("local.properties").inputStream().use {
             properties.load(it) }
        val flutterSdkPath = properties.getProperty("flutter.sdk")
        require(flutterSdkPath != null) {
             "flutter.sdk not set in local.properties" }
        flutterSdkPath
    }

    includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")

    repositories {
            
        // 优先使用华为云镜像
        maven {
            
            url = uri("https://mirrors.huaweicloud.com/repository/maven")
            isAllowInsecureProtocol = true
        }
        // 华为云的gradle插件镜像
        maven {
            
            url = uri("https://repo.huaweicloud.com/repository/maven")
            isAllowInsecureProtocol = true
        }
        // 备用镜像
        maven {
            
            url = uri("https://maven.aliyun.com/repository/central")
            isAllowInsecureProtocol = true
        }
        maven {
            
            url = uri("https://maven.aliyun.com/repository/public")
            isAllowInsecureProtocol = true
        }
        maven {
            
            url = uri("https://maven.aliyun.com/repository/gradle-plugin")
            isAllowInsecureProtocol = true
        }
        maven {
            
            url = uri("https://maven.aliyun.com/repository/google")
            isAllowInsecureProtocol = true
        }
        maven {
            
            url = uri("https://maven.aliyun.com/repository/jcenter")
            isAllowInsecureProtocol = true
        }
        maven {
            
            url = uri("https://repo.spring.io/plugins-release")
        }
        maven {
            
            url = uri("https://jitpack.io")
        }
        gradlePluginPortal()
        mavenCentral()
        google()
    }
}

plugins {
            
    id("dev.flutter.flutter-plugin-loader") version "1.0.0"
    id("com.android.application") version "8.7.0" apply false
    id("org.jetbrains.kotlin.android") version "1.8.22" apply false
}

include(":app")

步骤2: 修改build.gradle.kts

allprojects {
            
    repositories {
            
        // 优先使用华为云镜像
        maven {
            
            url = uri("https://mirrors.huaweicloud.com/repository/maven")
            isAllowInsecureProtocol = true
        }
        // 华为云的gradle插件镜像
        maven {
            
            url = uri("https://repo.huaweicloud.com/repository/maven")
            isAllowInsecureProtocol = true
        }
        // 备用镜像
        maven {
            
            url = uri("https://maven.aliyun.com/repository/central")
            isAllowInsecureProtocol = true
        }
        maven {
            
            url = uri("https://maven.aliyun.com/repository/public")
            isAllowInsecureProtocol = true
        }
        maven {
            
            url = uri("https://maven.aliyun.com/repository/gradle-plugin")
            isAllowInsecureProtocol = true
        }
        maven {
            
            url = uri("https://maven.aliyun.com/repository/google")
            isAllowInsecureProtocol = true
        }
        maven {
            
            url = uri("https://maven.aliyun.com/repository/jcenter")
            isAllowInsecureProtocol = true
        }
        maven {
            
            url = uri("https://jitpack.io")
        }
        gradlePluginPortal()
        mavenCentral()
        google()
    }
}

val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get()
rootProject.layout.buildDirectory.value(newBuildDir)

subprojects {
            
    val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
    project.layout.buildDirectory.value(newSubprojectBuildDir)
}
subprojects {
            
    project.evaluationDependsOn(":app")
}

tasks.register<Delete>("clean") {
            
    delete(rootProject.layout.buildDirectory)
}

步骤3: 优化gradle.properties

org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true
org.gradle.parallel=true
org.gradle.daemon=true
org.gradle.configureondemand=false
org.gradle.unsafe.io=true
# 增加更长的超时时间
systemProp.org.gradle.internal.http.connectionTimeout=300000
systemProp.org.gradle.internal.http.socketTimeout=300000
systemProp.http.keepAlive=false
# 启用更多的调试信息
org.gradle.logging.level=info
# 设置较低的内存消耗
org.gradle.workers.max=2

解决方案2: 使用自定义脚本下载依赖

有时即使配置了镜像,某些特定依赖仍然无法下载,比如kotlin-compiler-embeddable-1.9.24.jar。我们可以创建一个脚本手动下载并安装到本地Maven仓库。

创建download_kotlin_compiler.bat脚本

@echo off
echo 正在下载Kotlin编译器依赖...

mkdir temp_kotlin_deps 2>nul
cd temp_kotlin_deps

echo 尝试从华为云镜像下载...
curl -kL -o kotlin-compiler-embeddable-1.9.24.jar https://mirrors.huaweicloud.com/repository/maven/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.9.24/kotlin-compiler-embeddable-1.9.24.jar

if not exist kotlin-compiler-embeddable-1.9.24.jar (
    echo 华为云镜像下载失败,尝试从阿里云下载...
    curl -kL -o kotlin-compiler-embeddable-1.9.24.jar https://maven.aliyun.com/repository/public/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.9.24/kotlin-compiler-embeddable-1.9.24.jar
)

if exist kotlin-compiler-embeddable-1.9.24.jar (
    echo 下载成功,正在安装到本地Maven仓库...
    
    echo 创建目录结构...
    mkdir -p %USERPROFILE%.m2
epositoryorgjetbrainskotlinkotlin-compiler-embeddable1.9.24
    
    echo 复制文件...
    copy kotlin-compiler-embeddable-1.9.24.jar %USERPROFILE%.m2
epositoryorgjetbrainskotlinkotlin-compiler-embeddable1.9.24
    
    echo 安装完成!
) else (
    echo 所有下载尝试均失败。请检查网络连接或手动下载文件。
)

cd ..
echo 清理临时文件...
rmdir /s /q temp_kotlin_deps

echo 完成

使用方法

将上述内容保存为download_kotlin_compiler.bat
双击运行脚本
脚本会自动尝试从华为云和阿里云镜像下载依赖,并安装到本地Maven仓库

解决方案3: 清理Gradle缓存

有时Gradle缓存可能损坏,导致构建过程卡住。我们可以创建一个清理脚本。

创建clean_gradle_cache.bat脚本

@echo off
echo 正在清理Gradle缓存...

cd android

echo 删除.gradle目录...
rmdir /s /q .gradle

echo 删除build目录...
rmdir /s /q build

echo 执行Gradle清理任务...
call gradlew clean --refresh-dependencies --no-daemon

echo 清理本地缓存的依赖...
call gradlew cleanBuildCache

echo 完成!现在尝试重新构建项目:
echo flutter clean
echo flutter pub get
echo flutter run

cd ..

使用方法

将上述内容保存为clean_gradle_cache.bat
双击运行脚本
然后执行以下命令:

flutter clean
flutter pub get
flutter run

避免代理问题

如果你配置了代理服务器,但代理服务器不可用,也会导致构建失败。检查并修改~/.gradle/gradle.properties文件:

# 注释掉或删除以下代理设置
#systemProp.http.proxyHost=127.0.0.1
#systemProp.http.proxyPort=10810
#systemProp.https.proxyHost=127.0.0.1
#systemProp.https.proxyPort=10810

进阶优化

减少依赖库版本:考虑使用较稳定的旧版本库,如将Kotlin从1.9.24降至1.8.22
本地缓存依赖:考虑使用Gradle的依赖缓存功能
增加JVM内存:适当增加Gradle运行时的内存分配

总结

通过以上方法,我们可以解决Flutter项目中常见的Gradle构建问题。配置华为云镜像是首选方案,它能够稳定快速地下载大多数依赖;对于特殊的依赖问题,可以使用自定义脚本手动下载安装;清理Gradle缓存则可以解决潜在的缓存损坏问题。

希望这篇文章对你有所帮助!如果你有任何问题或者更好的解决方案,欢迎在评论区分享。

参考资料

Flutter官方文档
Gradle官方文档
华为云开源镜像站
阿里云开源镜像站

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
灵魂小妖作妖纪的头像 - 宋马
评论 抢沙发

请登录后发表评论

    暂无评论内容