flutter run -d android_device_target 卡死? -> 下载缓慢!



  • 前置知识/需要了解
    • gradle 是什么
    • flutter run 的流程
    • gradle 手动下载
    • kotlin-compiler-embeddable-1.7.0.jar 手动下载
    • 仓库
      • flutter pub 仓库
      • android 等依赖的 jar 包(maven,google仓库)

现象和背景

  1. 过去了一年, 今天再次打开 android studio, 创建了最初始的 Flutter 的跨平台项目
  2. 执行 flutter run -d XXX(这里指定的平台式 android ),在 windows 平台或者是 web 平台都是可以正常运行的
  3. 结果: 卡在执行 Flutter 调用 gradlew.bat assembleDebug 这里, 查看资源管理器,android studio 占用的资源均是接近 0 (操作系统应该类似C语言那样向下取整了,因为经过调查发现,实际的网络IO速度是 10KB/S)

原因分析

  • 本质上是下载 gradle 相关的 jar 慢包导致的
  1. 可能是没有下载的仓库位于国外或者是没有使用加速器导致的
  2. 网络相关(猜测是header不正确被限速了)

验证和解决

  1. 针对可能的 <原因1>

    • 将下载的仓库地址设置成阿里云的或者是其他的国内镜像网站,或者是使用加速器
    • 结果还是老样子,甚至更慢了(当然要是这样能够解决很好)
  2. 针对可能的 <原因2>

    • flutter run -d XXX_android 本质还是调用 gradle 实现的,只是不同版本使用的 gradle 可能不一样
    • 本质上调用的命令是 gradlew.bat assembleDebug, 我们通过调用 gradlew.bat assembleDebug 或者 flutter run -d XXX_android -verbose 将会显式具体的操作出来
    • 当我们使用 gradlew.bat assembleDebug 将会给我们显示出具体的下载过程,我们就会发现在现在 gradle 以及后面的一个 Gradle:Download kotlin-compiler-embeddable-1.7.0.jar 这里卡主,下载的速度非常低,下载 50M
    • 的 jar 用去了 1h (算下来就是 14k/s ),但是我们打开那个下载的链接直接进去下载的话,速度就会很快(因此在这里考虑是第二个原因,这里的 header 没有像正常访问那样,而是通过 IDE 或者命令行下载, 了解过爬虫的话,这里更加容易理解一些)
    • 现在我们已经自己下载好了 gradle 和 相关的 jar 包,该如何放呢?
    • 这里不进行深究,但是显然 gradle 的文件的存放是很直接的,但是 kotlin-compiler-embeddable-1.7.0.jar 就不一样了 我们可以发现 .gradle\caches\modules-2\metadata-2.97中发现一个可疑文件“resource-at-url.bin”,
      而需要存放的位置以及文件夹的命名就在这个二进制文件里面

比较有意思的掘金博客

部分别人博客提到的问题(下面是自己尝试之后的解决办法)

  1. 关于下载 gradle.zip

    • 直接把zip文件放在对应的文件下面就可以了,没必要改名字为ok什么的,.lck文件表示的事锁的意思,也就是计算机里面里面的概念,.ok 和 lck 文件都是为下载 .zip 文件服务的
  2. 网络限速

    • 这个问题上面提到过,使用IDE下载的链接直接去境外官网下载,网速完全没有问题的,因此需要配置国内镜像或者是自己手动下载来配置
      • 国内镜像参考链接(settings.gradle)

            repositories {
        //        maven { url 'https://mirrors.cloud.tencent.com/gradle/'}
                maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' }
        //        maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
        //        maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
        //        maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
        //        maven { url 'https://maven.aliyun.com/repository/jcenter' }
        //        maven { url 'https://maven.aliyun.com/repository/google' }
                google()
                mavenCentral()
                gradlePluginPortal()
            }