不论在Ubuntu 还是 CentOS,强烈推荐使用snapd 安装,因为不用额外安装 Linux toolchain!
由于我在Linux和Flutter还是小白,又在CentOS 7上有采用了手动安装Flutter,导致安装 Linux toolchain 时可把我坑惨了。官方的toolchain 在Ubuntu 上很方便,但在CentOS上 ninja,pkgconfig,libgtk-3-dev 没有直接的源,导致安装起来非常麻烦:
apt-get install clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev
使用 snapd 安装则不需要这个步骤。
一、安装snap
Installing snap on CentOS | Snapcraft documentation
- yum install epel-release -y
-
- yum install snapd -y
-
- systemctl enable --now snapd.socket
-
- ln -s /var/lib/snapd/snap /snap
二、snap 安装 flutter:
snap install flutter --classic
source /etc/profile,或重启系统后,flutter可被识别到。而后执行
flutter doctor
注意,jenkins因为各种环境问题,可能会找不到 flutter,因此在脚本执行flutter前,PATH添加 snap路径:
export PATH=$PATH:/var/lib/snapd/snap/bin
三、升级 git
- yum -y install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm
-
- yum -y update git
或者使用snap 安装(还未尝试过)
sudo snap install git-ubuntu --classic
四、flutter的 git依赖组件(可选)
flutter pub 可以使用 git,但对于需要密码的git,如果使用http或https方式,用户名和秘密会有暴露的风险,建议使用SSH。如果是http或https,在jenkins flutter build 之前,将 pubspec.yaml 内的链接替换为git@xxx: :
sed -i 's|https://xxxxxxx/|git@xxxxxxxx:|g' pubspec.yaml
在打包机上生成ssh key:
- cd ~/.ssh
- # 没有 .ssh 则新建一个
-
- # xxxx 随意,key的名称
- ssh-keygen -t rsa -C "xxxx"
注意:回车后,不要填任何东西,直接回车,不然flutter 的 git找不到 ssh 密钥
Enter file in which to save the key (/xxx) (回车)
Enter passphrase (回车)
Enter same passphrase again: (回车)
而后 把 id_rsa.pub 内容贴到 git 仓库的 ssh 授权中(不同仓库操作不一样,请自行搜索)
最后验证 git 联通性:
ssh -T git@xxxx
当有提示 welcome 等信息时,就说明链接成功,有错误自行搜索下
六、repositories 覆盖
由于在app 的build.gradle中,flutter 要求添加以下脚本,导致我们自定义替换的repositories 无法替换掉它里面的 google 源:
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
flutter SDK 的 flutter.gradle中有以下强制配置:
- buildscript {
- repositories {
- google()
- mavenCentral()
- }
- dependencies {
- /* When bumping, also update ndkVersion above. */
- classpath 'com.android.tools.build:gradle:4.1.0'
- }
- }
导致如果google连不上,会出现很奇怪的 com.android.tools.build:gradle:4.1.0 找不到,google 仓库无法连接的编译bug。
此时,只能对flutter.gradle 进行强制修改:
- buildscript {
- repositories {
- maven {
- try {allowInsecureProtocol = true} catch (Throwable e) {}
- url "xxxxxxx" // 使用我们自己的 maven 或者国内源,例如 aliyun 的
- }
-
- // google()
- // mavenCentral()
- }
- dependencies {
- /* When bumping, also update ndkVersion above. */
- classpath 'com.android.tools.build:gradle:4.1.0'
- }
- }
此外,还有第三方插件也有类似的问题,也会出现各中 com.android.tools.build:gradle 找不到。此时需要在 rootProject 的build.gradle 添加以下脚本,以在依赖的子工程脚本执行前添加 我们的repositories覆盖顺序:
- subprojects {
- repositories {
- maven {
- url = "xxxx" // 要替换的 url
- }
- }
-
- buildscript.repositories {
- maven {
- url = "xxxx" // 要替换的 url
- }
- }
- }
七、替换 pub 源:
环境变量添加 PUB_HOSTED_URL 和 FLUTTER_STORAGE_BASE_URL,jenkins脚本增加:
- export PUB_HOSTED_URL=https://pub.flutter-io.cn
- export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
八、执行gradle task:
- # 先在工程目录下执行 packages get
- flutter packages get
-
- #同步完成后,cd到 Android目录执行 gradlew
- cd android
- chmod 777 gradlew
-
- ./gradlew xxxxTask
-
- cd ..
-
- flutter build xxxxxx
总结:
1、使用snap 安装flutter,升级git
2、repositories 覆盖
3、Jenkins脚本要修改环境变量,大致为:
- export PUB_HOSTED_URL=https://pub.flutter-io.cn
- export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
- export PATH=$PATH:/var/lib/snapd/snap/bin
-
- # git 替换 ssh访问
- sed -i 's|https://xxx/|git@xxx:|g' pubspec.yaml
-
- flutter packages get
-
- cd android
- chmod 777 gradlew
-
- ./gradlew xxxTask
-
- cd ..
-
- flutter build appbundle --obfuscate --split-debug-info=./debug_info
参考: