flutter run -d android_device_target 卡死? -> 下载缓慢!
- 前置知识/需要了解
- gradle 是什么
- flutter run 的流程
- gradle 手动下载
- kotlin-compiler-embeddable-1.7.0.jar 手动下载
- 仓库
- flutter pub 仓库
- android 等依赖的 jar 包(maven,google仓库)
现象和背景
- 过去了一年, 今天再次打开 android studio, 创建了最初始的 Flutter 的跨平台项目
- 执行 flutter run -d XXX(这里指定的平台式 android ),在 windows 平台或者是 web 平台都是可以正常运行的
- 结果: 卡在执行 Flutter 调用 gradlew.bat assembleDebug 这里, 查看资源管理器,android studio 占用的资源均是接近 0 (操作系统应该类似C语言那样向下取整了,因为经过调查发现,实际的网络IO速度是 10KB/S)
原因分析
- 本质上是下载 gradle 相关的 jar 慢包导致的
- 可能是没有下载的仓库位于国外或者是没有使用加速器导致的
- 网络相关(猜测是header不正确被限速了)
验证和解决
-
针对可能的 <原因1>
- 将下载的仓库地址设置成阿里云的或者是其他的国内镜像网站,或者是使用加速器
- 结果还是老样子,甚至更慢了(当然要是这样能够解决很好)
-
针对可能的 <原因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”,
而需要存放的位置以及文件夹的命名就在这个二进制文件里面
比较有意思的掘金博客
部分别人博客提到的问题(下面是自己尝试之后的解决办法)
-
关于下载 gradle.zip
- 直接把zip文件放在对应的文件下面就可以了,没必要改名字为ok什么的,.lck文件表示的事锁的意思,也就是计算机里面里面的概念,.ok 和 lck 文件都是为下载 .zip 文件服务的
-
网络限速
- 这个问题上面提到过,使用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() }
-
- 这个问题上面提到过,使用IDE下载的链接直接去境外官网下载,网速完全没有问题的,因此需要配置国内镜像或者是自己手动下载来配置