Travis CI 持续集成(Android)
在 Android 项目中使用 Travis CI 完成构建、签名与打包,并将签名后的 apk 自动发布到蒲公英。
本文介绍如何在 Android 项目中使用 Travis CI 进行持续集成,并将签名后的 apk 自动发布到蒲公英。
Travis CI 产品分类
Travis CI 是一款用于构建和测试 GitHub 托管代码的持续集成工具。其产品分为:
- Travis CI.org:面向 GitHub 开源项目的免费产品。
- Travis CI.com:面向私有项目的付费产品。
前置要求
需要在本地安装 Travis CI 命令行工具。
-
确保本地 Ruby 版本在 1.9 以上:
ruby -v -
安装 Travis CI(如使用 macOS,建议先将 Ruby 升级到最新版本):
gem install travis --no-rdoc --no-ri -
验证是否安装成功,输出版本号即表示安装成功:
travis -v
启用 Travis CI
通过 GitHub 账号登录 Travis 平台,Travis 会自动同步 GitHub 账号下所有的开源项目,在列表中选择需要启用的项目即可。

创建 Travis CI 构建
在工程根目录下新建 .travis.yml,用于描述 Travis CI 需要执行的构建。
Travis CI 提供基本的构建能力和语言支持,可以通过 .travis.yml 自定义构建操作,同时需遵循 Travis CI 的构建生命周期,详见 官方文档。
完成 .travis.yml 后,可通过以下命令验证语法:
travis lint [path to your .travis.yml]语法正确时会出现如下提示:

Android 工程基本模板
在 .travis.yml 中定义以下内容:
language: android # 语言说明
jdk: oraclejdk8 # jdk 版本
sudo: required # 权限要求
env: # 环境变量
global:
- ANDROID_API=26
- EMULATOR_API=21
- ANDROID_BUILD_TOOLS=26.0.2
- ADB_INSTALL_TIMEOUT=5 # minutes
android: # Android 环境要求
components:
- tools
- platform-tools
- build-tools-$ANDROID_BUILD_TOOLS
- android-$ANDROID_API
- android-$EMULATOR_API
- extra-google-m2repository
- extra-android-m2repository # 配置 design 库
- addon-google_apis-google-19 # 配置 google play services
- sys-img-armeabi-v7a-android-$ANDROID_API
- sys-img-armeabi-v7a-android-$EMULATOR_API
licenses: # 内容许可添加
- android-sdk-preview-license-.+
- android-sdk-license-.+
- google-gdk-license-.+此处的 Android 版本需与项目中的版本一致。如果构建过程用到不同的 android 版本或 build-tool 版本,都需要在这里声明,否则 CI 会出现类似以下错误:

配置缓存(可选)
设置缓存可避免每次重新下载依赖,缩短构建时间。若更新了基础环境配置(例如 Gradle 版本),建议先清除缓存再运行 CI。
before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/
cache: # 指定缓存目录
directories:
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/Travis CI 的缓存也可以手动删除:

启动模拟器(可选)
仅在需要跑测试用到模拟器时添加。
此处声明的模拟器 Android 版本需要在 .travis.yml 的 android 部分同步声明,否则启动模拟器时会报错并停止构建,Travis CI 状态变为 errored。
before_script:
- echo no | android create avd --force -n test -t android-$EMULATOR_API --abi armeabi-v7a
- emulator -avd test -no-skin -no-audio -no-window &
- android-wait-for-emulator如果模拟器的 Android 版本未添加,会出现如下错误:

运行脚本
用于跑测试的脚本:
script:
- ./gradlew clean build connectedCheck -PdisablePreDex --stacktrace直接打包 release apk 的脚本:
script:
- ./gradlew assembleRelease自动打包签名 apk
-
在 Android Studio 中生成 apk 签名文件(Build → Generate Signed APK → Create new),得到
.jks文件:
-
使用 GitHub 账户登录 Travis:
travis login # 根据提示依次输入项目所属 GitHub 的账户和密码 -
使用 Travis 命令对签名文件加密(加密后的文件需要放在项目根目录一并提交到仓库):
travis encrypt-file [文件名].jks命令会生成加密后的
*.jks.enc文件,并按脚本提示将以下命令添加到before_install生命周期下:
before_install: - openssl aes-256-cbc -K $encrypted_df44b3ae1834_key -iv $encrypted_df44b3ae1834_iv -in demo.jks.enc -out demo.jks -d -
对签名文件中的参数加密:
travis encrypt storepass=YOUR_STORE_PASSWORD --add env.global travis encrypt keypass=YOUR_KEY_PASSWORD --add env.global命令执行后,会在
.travis.yml的env: global:中生成以下部分:
同一个签名文件和密钥,若更换了 GitHub 所属账号,需要先退出当前账号再重新登录,并重新生成所有加密部分:
travis logout travis login -
配置 Travis CI 打包流程:
after_success: - cp $TRAVIS_BUILD_DIR/demo.jks $HOME - cd app/build/outputs/apk/ - jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore $HOME/demo.jks -storepass $storepass -keypass $keypass app-release-unsigned.apk demo # demo 是签名文件的 key alias - jarsigner -verify app-release-unsigned.apk # 验证未签名的 apk - "${ANDROID_HOME}/build-tools/24.0.2/zipalign -v 4 app-release-unsigned.apk yourapp.apk" # apk 优化并重命名
上传 apk 到蒲公英
-
在
before_install中下载蒲公英上传脚本:before_install: - cd $TRAVIS_BUILD_DIR - wget -c https://raw.githubusercontent.com/Pgyer/TravisFile/master/pgyer_upload.sh -O pgyer_upload.sh - chmod +x pgyer_upload.sh -
在
after_script中添加上传步骤:after_script: - set -e - $TRAVIS_BUILD_DIR/pgyer_upload.sh "${TRAVIS_BUILD_DIR}/app/build/outputs/apk/release/<apk名称>" <蒲公英 API_KEY> -
蒲公英的 API_KEY 可在 API 信息页面 查看。
完整示例 Demo 已上传至 GitHub:https://github.com/Pgyer/TravisUploadAndroidDemo。
使用独立脚本上传 apk,是因为在参数错误等情况下,若直接使用 curl 命令,Travis CI 会将构建结果判定为 passed,但实际上并未完成上传。脚本中针对常见情况做了处理,并根据不同结果返回对应的命令状态,使 Travis CI 能完整反映集成结果。