flutter 项目的艰难编译历程

flutter 的安装应该比较简单,已经记不清楚具体过程了,反正由于国情的特殊性,貌似是搭过梯子的。当时准备就绪后并未立即深度着手,以至于昨天重拾,就遇到了一堆问题。

前一阵有合作伙伴对产品提了个要求,说要支持内网的 C/S 结构访问服务,而不要只支持 B/S 结构的。三太爷在最短的时间给团队指了一条明路,那就是用 Electron,在本地把浏览器包装起来,最后在与其时间范围内基本达到了想要的效果。

昨天又来了一拨合作伙伴,希望能在移动设备上访问服务。老夫第一时间又想到一个完美的技术栈:flutter。正好记起电脑上之前安装过,就顺手编译个例子吧。在基友哈勃上下载了个两年前别人写的例子,仿知乎客户端。编译过程举步维艰,困难重重。

flutter 的项目编译,最简洁的方式,很有点 Web 项目的风格,就是把一台手机连接到电脑,命令行执行 flutter run。这会触发其一系列的连锁反应,编译、链接、打包、安装、启动、调试。随之而来的,当然就是这各个环节都可能发生的问题,需要仔细辨别,分而治之。

三太爷有个不是很稳当的习惯,就是喜欢顺手把这种各样的东西 upgrade。不管是 apt,还是 yum/dnf,或者 brew、npm 之流。flutter 也有这个命令,但是一直失败,因为你翻或不翻,墙就在那里。后来才知道,flutter 项目为了解决大家遇到的这个问题,甚至都给出了变通的解决方案,指定以下的环境变量:

然后再正常 flutter upgrade。另外最好记住,flutter 提供的 flutter doctor 命令是诊断帮手,它也会触发更新。在我的电脑上,它的执行结果如下:

解决了更新问题,接下来的 flutter run 又出问题,从错误信息来看,都与网络相关,不是 connection shutdown 就是 download failed,要不就是 unknown host 异常,最后切到香港的线路才算勉强应付过去。

第三关是这样的:

这个错误原来写 Android 项目也遇到过,通常是 gradle 版本导致的问题,找了个别的可以正常编译的工程看了一下,把项目的 build.gradle 中以下代码段

里面的 3.0.1 照着改成了 4.0.1。于是跟着第四关就来了:

这一关很简单,因为答案就在信息里,4.1 -> 6.1.1 之后,第五关:

也按图索骥,打开 settings.gradle,加入了 android.useAndroidX=true。从而直达第七关:

哦,对不起,又是下载问题,原来是在香港链路上要下载墙内资源,我改,撤梯;第八关长这样:

网上搜了一下,解决方法是,把 app/build.gradle 里的 compileSdkVersion27 升到 28。第九关:

大意是,编译呢,需要版本 21.0.6113669 的 NDK,但本地只找到了 21.3.6528147 版本的。最直观的解决办法就是用 SDK Manager 把它需要的版本下载安装到本地,但那个一听就有点逊,多装一份 NDK 不说,还特么是个老版本的。最后在 app/build.gradle 里的 android 节中加入了 ndkVersion "21.3.6528147" 让它强制使用本地已经安装好的版本的 NDK 即可。然后,历经这许多难,俺就愉快地玩耍了:

记录这么详细,就是怕哪天需要返回来看,悲哀。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注