MADEYE

使用 Maven 和 Travis 构建 Android 应用

Android 应用开发时往往会涉及大量的依赖,官方的做法是将所有依赖放在 libs 目录下,使用 eclipse 或 ant 构建项目时都可以自动从中寻找到相应的 jar 包或 so 库。这样的实现似乎显得不够优雅,而最为理想的实现则是所有依赖都可以像 gem 或者 pip 那样在构建时自动的下载到本地并编译。

对于 Java 来说,Maven 是当下最为流行的自动构建方案,通过编写配置文件的方式,我们可以非常容易的自动化解决依赖,编译与链接,单元测试,以及安装与部署。具体到 Android 应用的构建,还需要引入 android-maven-plugin 来预编译资源文件、转换为 dex 格式、打包成 apk 文件、对 apk 进行签名等。一些现成的例子可以见这个仓库:android-maven-samples

若要把已经存在 Android 项目改写成由 Maven 构建并不需要太多的工作,只是有些细节需要注意。

  1. 使用 maven-android-sdk-deployer 来链接 Google Maps / Play 等闭源依赖。Maven 的公共仓库中不会有闭源的 jar 包,因此 Google 相关的依赖需要在本地通过 SDK 来导入。这种做法的最大问题依然是不够优美,人为的造成构建环节变得复杂。因此有一种不算办法的办法是自己搭建私人的 Maven 仓库,然后把这个仓库放在 GitHub 或者 Google Code 上。一个简单的例子见我在 GitHub 上的仓库:madeye/maven-repository
  2. Maven 对 apk 文件进行签名时需要为其指定 keystore 和 alias。当涉及到多个 key 时(比如 release 和 debug 两个版本的 key),可以通过 profile 的方式解决。一个更加优美的方式是利用 properties 文件来指定不同的 key 文件,不过需要引入 properties-maven-plugin
  3. 自动为 apk 文件命名并自动修改 AndroidManifest。通过使用 android-maven-plugin 可以非常方便为生成的 apk 文件命名,比如 ${project.artifactId}-${project.version}.apk 意味着生成的 apk 文件将以版本号结尾,另外还可以额外的加入编译时间、构建号、渠道类型等信息。

完成对 Android 项目的 Maven 化改造后,第一个用处就是引入持续集成系统。当前最成熟的持续集成系统是 Jenkins,但考虑到持续集成系统部署与维护的成本较高,若你恰好正在 GitHub 上做一款开源的应用,那么 Travis 则是你最好的选择。Travis 是一款非常灵活的新型持续集成系统,虽然暂时功能还不完善(缺少 Jenkins 庞大的社区与插件支持),但用在 Android 应用构建上已经绰绰有余。

Travis 依赖于 .travis.yml 这样一个配置文件来完成整个构建流程。对于 Android 项目,可以直接套用下面这个配置文件:

Sample Travis configuration for Android Project
1
2
3
4
5
6
7
8
9
10
11
language: java
before_install:
  - wget http://dl.google.com/android/android-sdk_r21-linux.tgz
  - tar -zxf android-sdk_r21-linux.tgz
  - export ANDROID_HOME=~/builds/username/project/android-sdk-linux
  - export PATH=${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools
  - android update sdk --filter tools,platform-tools,android-16,addon-google_apis-google-16,extra-android-support,extra-google-admob_ads_sdk,extra-google-analytics_sdk,extra-google-gcm,extra-google-play_apk_expansion,extra-google-play_billing,extra-google-play_licensing --no-ui --force --no-https -a
install:
  - sudo pip install python-swiftclient
script:
  - mvn clean install

简单解释一下上面的配置。首先我们在 before_install 小节完成了 Android SDK 的下载与环境变量的设置。需要注意的是 android update adk 时使用的 filter 关键词,针对不同的应用,我们要在这儿安装不同的 SDK 版本与相关的闭源依赖。

另外如例子中 pip 一句,在 Travis 环境中我们甚至可以使用 sudo 命令安装某些依赖,这儿不用担心安全性的问题,Travis 的所有构建节点都在不同的虚拟机实例中互不干扰,每一次新的构建都会退回到一个完全干净的 SNAPSHORT。

在 Travis 的构建环境中,我们还可以引入自动测试的环节,甚至直接将构建结果部署到开发环境或发布 Nightly Build。值得称赞的是 Travis 的构建服务器性能非常棒,从下载所有依赖到完成整个项目的构建往往只需要几分钟时间。

于是一个理想的开发环境是这样:使用任意的设备在任意的地点编写修改代码,偶尔连接一次网络提交代码并等待构建结果。

更多细节可以参考我的几个开源项目:github/madeye

Comments