Flutter号称统一Android端和IOS端开发,做到一份代码同时运行在两个平台上,从实际效果来看,流畅的体验、完善的文档,还是很值得一试的。不过其中却藏了一个神坑(对我来说),那就是你的Flutter应用要在IOS上运行,必须在macOS主机上打包才可以,吃着苹果的童鞋自然不用担心了。然而本人一台y400征战多年,目前资金池也处于资源紧缩状态,换苹果机这种高消耗的任务基本是排在优先级队列尾端(求土豪公司“包养” ��)。不过好在,还有线上自动构建工具TravisCI帮忙,打两个平台的安装包也不是梦。

本文目标

  • 通过TravisCI为Flutter项目 Chic 生成Android和IOS的安装包。
  • 把安装包放到Github Release供下载。

怎么把Github项目接入TravisCI这里就不再介绍了,网上已经有很多相关教程,接入工作非常的简单。我们要实现持续集成,说白了就是提供一个yml文件,让CI照着它跑一遍,至于它的语法,可以参考TravisCI官方文档介绍,其实跟Gitlab的CI差不多,说起来,目前工作中用的就是Gitlab,感觉界面、使用逻辑等比Github方便很多,尤其是WebIDE简直牛逼,线上就能做很多事,省去了把项目clone下来的麻烦。言归正传,因为是要打包APK和IPA,所以Chic里写的.travis.yml应该适用于大部分Flutter项目。我把CI分成三个阶段:test、打包APK、打包IPA。下面就这三个阶段分别介绍一下:

# jobs 用于执行不同的build stage
jobs:include:- stage: test
  - stage: deployAPK
  - stage: deployIPA

Test 阶段

  - stage: test
    os: linuxlanguage: genericsudo: falseaddons:apt:sources:- ubuntu-toolchain-r-test
        packages:# Flutter依赖- libstdc++6
        - fonts-droid
    before_script:- git clone https://github.com/flutter/flutter.git -b beta --depth 1
    script:- "./flutter/bin/flutter upgrade"
    - "./flutter/bin/flutter test"

测试主要是运行一下flutter test,跑一下测试用例,这个没啥好说的,根据官网的例子来写就可以。

打包APK

  - stage: deployAPK
    os: linuxlanguage: androidlicenses:- android-sdk-preview-license-.+
    - android-sdk-license-.+
    - google-gdk-license-.+
    android:components:- tools
      - platform-tools
      - build-tools-27.0.3
      - android-27
      - sys-img-armeabi-v7a-google_apis-25
      - extra-android-m2repository
      - extra-google-m2repository
      - extra-google-android-support
    jdk: oraclejdk8sudo: false# 以上都是在安装AndroidSDKenv: APK_OUTPUT=build/app/outputs/apk/release/app-release.apkaddons:apt:sources:- ubuntu-toolchain-r-test
        packages:- libstdc++6
        - fonts-droid
    #以上为Flutter环境搭建before_script:# 用你自己的解密命令替代- openssl aes-256-cbc -K $encrypted_faf484425141_key -iv $encrypted_faf484425141_iv -in key.properties.enc -out android/key.properties -d
    - openssl aes-256-cbc -K $encrypted_a1a476bece9a_key -iv $encrypted_a1a476bece9a_iv -in feng.jks.enc -out android/feng.jks -d
    - git clone https://github.com/flutter/flutter.git -b beta --depth 1
    script:- "./flutter/bin/flutter upgrade"
    - "./flutter/bin/flutter -v build apk --release"
    deploy:provider: releasesskip_cleanup: true# 用你的api_key替代api_key:secure: uDRE0d3gZ5JYhl/jBiDp5z...file: $APK_OUTPUTon:tags: true

首先是安装AndroidSDK,这个TravisCI已经有很多现成的例子了,主要关注script阶段我们如何利用flutter build apk --release生成签名APK。

1.准备key.properties和.jks

搞过Android开发的应该对这两个文件不陌生,如何生成jks网上有很多教程,这里就不再赘述了,key.properties其实就是jks中的密码等参数,文件内容如下

storePassword=yourpass
keyPassword=yourpass
keyAlias=alias
storeFile=../your.jks

把这两个文件放在Flutter项目的android目录下,修改app中的build.gradle

// -- New --
def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))android {...// -- New --signingConfigs {release {keyAlias keystoreProperties['keyAlias']keyPassword keystoreProperties['keyPassword']storeFile file(keystoreProperties['storeFile'])storePassword keystoreProperties['storePassword']}}// -- Change --buildTypes {release {signingConfig signingConfigs.release}}...
}

注意:key.properties和jks文件必须在Git中忽略

2.加密key.properties和jks

利用TravisCI提供的cli工具,可以对单个文件进行加密:

travis encrypt-file [文件名].jks

会生成一个加密文件*.jks.enc,和解密命令

openssl aes-256-cbc -K $encrypted_faf484425141_key -iv $encrypted_faf484425141_iv -in key.properties.enc -out android/key.properties -d

把这个enc文件放在android下并加入Git,解密命令可以替换上面的示例代码中的标记部分。key.properties文件也是一样的操作。

3. 上传到Github Release

上传到Release就很简单了,利用TravisCI提供的命令行工具,执行

travis setup releases

就会自动在你的.travis.yml中添加deploy语句,我们主要需要api_key那块,替换示例代码的标记部分。

经过以上步骤,你应该就能在Github Release上看到打包好的app_release.apk,可以直接下载安装。

如果碰到问题,建议多查看TravisCI官方文档,和蒲公英的持续集成介绍。对照Chic的.travis.yml文件修复问题。

打包IPA

  - stage: deployIPA
    os: osxlanguage: objective-cosx_image: xcode9.2before_script:- pip2 install six
    - brew update
    - brew install libimobiledevice
    - brew install ideviceinstaller
    - brew install ios-deploy
    # 以上安装xcode环境- git clone https://github.com/flutter/flutter.git -b beta --depth 1
    script:- "./flutter/bin/flutter upgrade"
    - gem install cocoapods
    - pod setup
    - "./flutter/bin/flutter -v build ios --release --no-codesign"
    - mkdir Runner
    - mkdir Runner/Payload
    - cp -r build/ios/iphoneos/Runner.app Runner/Payload/Runner.app
    - cd Runner
    - zip -r Runner.ipa Payload
    deploy:provider: releasesskip_cleanup: true#跟Android的api_key是一致的api_key:secure: uDRE0d3gZ5JYhl/jBiDp5zv32fH...file: Runner.ipaon:tags: true

打IOS平台的安装包相对Android麻烦了很多,主要是证书不好搞,个人开发者证书一年99美元。网上一些的证书服务也不便宜,所以目前虽然打了一个IPA包,但是没有签名,不能安装。等以后有条件了再更新使用方法,有条件的童鞋可以在这个IPA包的基础上继续探索,比如fastlane自动打包、发布啥的,国内也有蒲公英提供类似的服务。

效果

项目地址: Chic

参考

  • posse_gallery TravisCI

  • Flitter TravisCI

  • 蒲公英文档 – 使用 Travis CI 实现持续集成

  • TravisCI 文档

Flutter学习 ---- TravisCI加持相关推荐

  1. Flutter学习指南:文件、存储和网络

    Flutter学习指南 交互.手势和动画 UI布局和控件 熟悉Dart语言 编写第一个应用 开发环境搭建 本篇文章我们先学习 Flutter IO 相关的基础知识,然后在 Flutter学习指南:交互 ...

  2. flutter学习(排雷)一

    flutter官网:https://flutter.dev/docs/get-started/install 终于下定决心开始flutter学习了呢. 首先需要说的是flutter中的配置文件真的很严 ...

  3. flutter scrollview_简单易上手的Flutter学习指南App,2020一起来玩转Flutter吧~

    Flutter是谷歌的移动UI框架,可以快速在iOS.Android.Web和PC上构建高质量的原生用户界面. Flutter可以与现有的代码一起工作.在全世界,Flutter正在被越来越多的开发者和 ...

  4. Flutter学习笔记(10)--容器组件、图片组件

    如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 上一篇Flutter学习笔记(9)--组件Widget我们说到了在Flutter中一个非常重要的理念"一切皆为组件 ...

  5. Flutter学习日记之底部导航栏BottomNavigationBar组件的使用

    本文地址:https://blog.csdn.net/qq_40785165/article/details/116953235,转载需附上此地址 大家好,我是小黑,一个还没秃头的程序员~~~ 空袋子 ...

  6. iOS程序猿的flutter学习之路

    日常学习Flutter开发的积累 推荐一些平时自己学习Flutter开发当中接触到的优秀文章 -------------------------基础知识 ----------------------- ...

  7. Flutter 学习

    Flutter 学习 参照:https://book.flutterchina.club/ 参照:https://flutter.cn/docs/development/platform-integr ...

  8. Flutter学习笔记 —— 完成一个简单的新闻展示页

    Flutter学习笔记 -- 完成一个简单的新闻展示页 前言 思路分析 案例代码 结束语 上图 前言 刚学Flutter不久,今天我们来看看如何使用 Container & ListView实 ...

  9. Flutter学习-多子布局Widget

    Flutter学习-多子布局Widget 1. Flex 2. Row组件 2.1 Row组件介绍 2.2 属性解析 2.2.1 mainAxisSize 2.2.2 mainAxisAlignmen ...

最新文章

  1. C语言scanf函数详解
  2. GUI(一) 一些自已看的东西
  3. jQuery extend方法介绍
  4. MacBook双开微信
  5. python量化数据处理小细节(以后还会不断补充)
  6. 基于JAVA+SpringBoot+Vue+Mybatis+MYSQL的大学生健康档案管理系统
  7. 回顾我个人的创业经历
  8. shell编程之 cut命令详解
  9. mysql怎样在bat脚本中添加日志_如何在windows下用bat脚本定时备份mysql
  10. springboot实现查询手机号归属地
  11. orcale :SQL语句小测试select * from emp order by hiredate asc;
  12. [日更-2019.5.21] Android 系统的分区和文件系统(一)--Android分区的大概框架
  13. 10行代码玩转弹性调度的小把戏
  14. 如何恢复删除好友的微信聊天记录?iPhone手机高效操作方法
  15. 政府大数据的资源库建设
  16. AutoFac基本使用-笔记
  17. 全志V3S零基础教程
  18. Android 7.0平台开机启动
  19. 使用决策树预测大盘指数
  20. 网页基础(九)选择器

热门文章

  1. 如何利用TensorFlow.js部署简单的AI版「你画我猜」图像识别应用
  2. sql 使用汇总(PQSQL)
  3. 互联网金融行业名词笔记
  4. centos 搭建dns服务器 解析任意域名
  5. Pytest教程__钩子方法setup、teardown、setup_class、teardown_class(8)
  6. Linux Input子系统
  7. 3G时代来临,java程序员能做点啥???
  8. android模拟器一直显示启动中,蓝手指安卓模拟器(BlueStacks)一直显示“启动中”如何解决?...
  9. 微信 沙箱验证签名失败 请确认沙箱签名key是否正确 解决办法
  10. 数据库系统概论(第五版)学习笔记