Flutter号称统一Android端和IOS端开发,做到一份代码同时运行在两个平台上,从实际效果来看,流畅的体验、完善的文档,还是很值得一试的。不过其中却藏了一个神坑(对我来说),那就是你的Flutter应用要在IOS上运行,必须在macOS主机上打包才可以,吃着苹果的童鞋自然不用担心了。然而本人一台y400征战多年,目前资金池也处于资源紧缩状态,换苹果机这种高消耗的任务基本是排在优先级队列尾端(求土豪公司“包养” ?)。不过好在,还有线上自动构建工具TravisCI帮忙,打两个平台的安装包也不是梦。
本文目标
- 通过TravisCI为Flutter项目 生成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 stagejobs: include: - stage: test - stage: deployAPK - stage: deployIPA复制代码
-
Test 阶段
- stage: test os: linux language: generic sudo: false addons: 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: linux language: android licenses: - 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: oraclejdk8 sudo: false # 以上都是在安装AndroidSDK env: APK_OUTPUT=build/app/outputs/apk/release/app-release.apk addons: 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: releases skip_cleanup: true # 用你的api_key替代 api_key: secure: uDRE0d3gZ5JYhl/jBiDp5z... file: $APK_OUTPUT on: tags: true复制代码
首先是安装AndroidSDK,这个TravisCI已经有很多现成的例子了,主要关注script阶段我们如何利用flutter build apk --release
生成签名APK。
- 准备key.properties和.jks 搞过Android开发的应该对这两个文件不陌生,如何生成jks网上有很多教程,这里就不再赘述了,key.properties其实就是jks中的密码等参数,文件内容如下
storePassword=yourpasskeyPassword=yourpasskeyAlias=aliasstoreFile=../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中忽略
- 加密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
文件也是一样的操作。
- 上传到GithubRelease 上传到Release就很简单了,利用TravisCI提供的命令行工具,执行
travis setup releases
就会自动在你的.travis.yml中添加deploy语句,我们主要需要api_key那块,替换示例代码的标记部分。 经过以上步骤,你应该就能在Github Release上看到打包好的app_release.apk,可以直接下载安装。
如果碰到问题,建议多查看TravisCI官方文档,和蒲公英的持续集成介绍。对照Chic的.travis.yml文件修复问题。
-
打包IPA
- stage: deployIPA os: osx language: objective-c osx_image: xcode9.2 before_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: releases skip_cleanup: true #跟Android的api_key是一致的 api_key: secure: uDRE0d3gZ5JYhl/jBiDp5zv32fH... file: Runner.ipa on: tags: true复制代码
打IOS平台的安装包相对Android麻烦了很多,主要是证书不好搞,个人开发者证书一年99美元。网上一些的证书服务也不便宜,所以目前虽然打了一个IPA包,但是没有签名,不能安装。等以后有条件了再更新使用方法,有条件的童鞋可以在这个IPA包的基础上继续探索,比如fastlane
自动打包、发布啥的,国内也有蒲公英
提供类似的服务。
效果
项目地址: