native集成flutter 打包问题

1,011 阅读2分钟

flutter-boot

上一篇文章记录了详细的flutter-boot集成的步骤,当然,想要混合开发也不是非要用这种方式,flutter官方文档给的方式也很棒,而且最近flutter1.12发布之后,集成方式也做了一些修改,更加的简洁便利,感兴趣的小伙伴可以去学习一下。本文主要记录一下,不管是用哪种方式集成,最后都需要把你写的dart代码打包到项目里,简单说就是开发完成肯定要打包给测试呀~~

shell打包

电脑上有一套完整的jenkins构建环境,也是很久之前搭建好的,也一直在平时的开发中使用,本文就不在详细介绍jenkins的东西了,可以去看我之前的文章,里面有记录了一份比较详细的shell打包脚本。

xcode_backend.sh

构建dart代码主要是用了flutter库里面的xcode_backend.sh脚本,这个脚本的路径如下:

"$FLUTTER_ROOT"/packages/flutter_tools/bin/xcode_backend.sh 

下面是我自己的一点儿理解,可能有不对的地方,希望看过文章的小伙伴可以指出来。

构建dart代码应该是有下面两个步骤:

  • Run Flutter Build Script

  • BuildApp
//脚本中的源码 可以看到xcode中执行的是 xcode_backend.sh build 所以会调用BuildApp方法
if [[ $# == 0 ]]; then
  # Backwards-compatibility: if no args are provided, build.
  BuildApp
else
  case $1 in
    "build")
      BuildApp ;;
    "thin")
      ThinAppFrameworks ;;
    "embed")
      EmbedFlutterFrameworks ;;
  esac
fi
  • 根据build_mode 构建Flutter.framework ,App.framework
  • 主工程依赖Flutter.framework ,App.framework

以上只是一个比较简略的流程,实际这份脚本配合着podfile还做了很多工作

问题记录

本地native工程和flutter工程都编译通过之后,开始在jenkins服务器上构建,本以为“按理来说”是不会有任何问题的。

然后构建了好多次,一直在报错,其实只报了一个错误

这个错误信息还是很好理解的,在xcode_backend.sh也做了详细的注释,就是构建的时候用了xcode中配置的configration,flutter只支持Debug/Profile/Release这三种,而且构建的时候只能用release,导致了构建失败。

但是我们打包不可能只打release的包呀,除了Debug/Profile/Release,还有几个自定义的宏用来打包,那怎么能保证构建flutter的时候只用release呢。。。

尝试各种改改改啊,下面是我亲测有效的一种方式,改法还是来自xcode_backend.sh中的注释

 # This means that if someone wants to use an Xcode build config other than Debug/Profile/Release,
  # they _must_ set FLUTTER_BUILD_MODE so we know what type of artifact to build.

可以设置一个FLUTTER_BUILD_MODE的宏供xcode_backend.sh执行的时候使用,设置方式如下:

添加一个User-Defined

然后值设置为release

如果看到文章的小伙伴有别的解决方式欢迎一起学习讨论,如果有遇到别的问题,也欢迎一起学习讨论~~