Linux 上 为 Jenkins 配置 Android-sdk 及其它

用 Jenkins 编译APK,在Jenkins所在的Linux (Ubuntu) 服务器配置 Android-sdk。

惯例踩坑,不是完整教程。

Gradle

配置完 Git 库直接开跑

1
java.io.IOException: Cannot run program "gradle"

指定了本地gradle,但服务器上并没有gradle,改为使用gradle wrapper。

……结果跑了一个周末,gradlew还停在:

1
Downloading https://services.gradle.org/distributions/gradle-2.14.1-all.zip

[捂脸]国内的开发者就是困难,gradle不同版本改动大,gradle wrapper多好一个解决方案,我们享受不到。

好吧,好好地根据目前项目的需要,安装一个在服务器,然后到 Jenkins > 系统管理 > Global Tool Configuration 添加一个gradle的版本。

Android-sdk

再跑,这回找不到ANDROID_HOME。当然,我没装SDK,也没配置环境变量。一个一个去想装什么多累啊,报什么错解决什么就好了。

心想我不需要在服务器开发,只是要管理依赖,只要sdk-tools就好了。官方源各种连不上,到腾讯大师兄 下载一个 tools_r25.2.3-linux.zip,在要安装的地方(这次是/opt/下某目录)建一个android-sdk/tools目录,然后解压到里面,执行

1
2
$ cd android-sdk/tools
$ sudo ./android

我去,默认运行居然是GUI工具,不过我也不愿意敲一堆参数,那就配置一下x11 forwarding 然后本地开一个Xming就好了。(当然也可以选择 ./android update sdk --no-ui --filter sdk1, sdk2, sdk3,...

安装好之后,定义 ANDROID_HOMEandroid-sdk 所在目录,并且把 $ANDROID_HOME/tools$ANDROID_HOME/platform-tools 加入 PATH 。如果不确定配置的 ANDROID_HOME 能不能被Jenkins读到,也可以在Jenkins的全局配置里添加这个环境变量。

好了,接下来就是编译报缺什么就装什么了。不过每次失败只能看到遇到的第一个错误,如果自己判断不准依赖,往往要浪费好几个build。还好build号完全不值钱。

这里有一个被误导的点:每次遇到缺什么依赖的时候,报的错误是

1
Before building your project, you need to accept the license agreements and complete the installation of the missing components using the Android Studio SDK Manager.

焦点很容易被引导到License上面去,加上我们很容易以外自己都已经安装了需要的东西,然后就开始折腾License。网上的教程往往默认你依赖的包已经安装好了(或者从别的机器挪过来了),只是没有好好同意License(或License没有一起挪过来),然后告诉你sdk-manager 会对License文件做一个签名保存在 licenses/ 目录,要么从原来的机器导出,要么怎样同意重新生成签名云云。

实际上无论是 没有accept license,还是根本没有安装,都会报这个错误,所以在检查License之前,首先要确认包真的安装了。实际上确实很多时候就是安装漏了东西。要仔细留意是不是名字像,或者同一个包依赖了不同的版本。

不过这里有个我没想明白的地方,一开始我想直接从Windows本地将包和License一起拷到Linux时,发现sdk目录下根本没有 licenses/ 目录,Linux上也没有发现,我以为是最新的版本不再这样存放License(实际上是License的sha-1签名)。因为这样,我选择了全部在Linux上用UI重新accept然后安装一次。还好配置了大师兄的镜像速度还是很快的,比拷过去再研究自己生成签名要省事。(配置镜像请看这里

然后今天我写这篇文章的时候重新进去,忽然发现 licenses/ 目录不知道啥时候生成了…… 里面只有一个 android-sdk-license 文件,里面只有一行sha-1 签名,也不知道是对哪个包的,没搞懂原理,暂时能用也先不追究了。

Android Studio

一路这样一个build号搞定一个依赖,直到一个包在sdk-manager怎么也找不到

1
2
3
4
> You have not accepted the license agreements of the following SDK components:
[com.android.support.constraint:constraint-layout:1.0.0-alpha4, com.android.support.constraint:constraint-layout-solver:1.0.0-alpha4].
Before building your project, you need to accept the license agreements and complete the installation of the missing components using the Android Studio SDK Manager.
Alternatively, to learn how to transfer the license agreements from one workstation to another, go to http://d.android.com/r/studio-ui/export-licenses.html

网上找了半天,发现大家都是在Android Studio的SDK Manager里安装,我就在Windows上试了一下,果然只能在Android Studio里看得到……

好吧先不追究原因,我装一个AS还不行吗。同样是在大师兄下载AS的包,解压到对应目录,然后执行

1
2
$ cd bin
$ ./studio.sh

注意这个必须要有界面,不像sdk-manager还有 –no-ui 参数可选,所以 x-server是必须的,我还是x11 forwarding + Xming。

然后就是第一次启动的Setup Wizard。Linux的AS不带SDK,而是在Setup Wizard时从官方(dl.google.com)下载,一般是一个最新的SDK-Tools 和 一个推荐的platform。platform和一些其他的推荐是可以取消复选框的,但是SDK-Tools是强制选中的。官方网址自然很卡,而且我们前面已经安装了一堆东西,没有必要重来,所以只要把 android-sdk 目录指定给AS就好,它会自动检测,有了的东西不会重复安装 ,所以正常应该什么都会装就过了。启动之后进入 settings,然后在SDK-Manager部分把缺的这两个包安装了,AS的使命就完成了(我又不在服务器写代码[捂脸])。

gradle task

按理说到了这里,应该没什么错误了,再开一个build,成功了,但是却没有生成物(Artifacts)。

看输出日志

1
2
3
4
5
6
7
8
9
10
11
:help
Welcome to Gradle 2.14.1.
To run a build, run gradle <task> ...
To see a list of available tasks, run gradle tasks
To see a list of command-line options, run gradle --help
To see more detail about a task, run gradle help --task <task>

额…光顾着搞SDK了,都没有给gradle指定task。

增加一个参数 BUILD_TYPE,然后把task指定为 clean assemble${BUILD_TYPE} --stacktrace --debug ,收工。(task是顺序执行的,这里是两个task,先clean,然后再assemble,参数是为了输出详细的gradle编译信息,好出问题时分析。)


知识共享 “署名-非商业性使用-相同方式共享” 4.0 (CC BY-NC-SA 4.0)”许可协议
本文为本人原创,采用知识共享 “署名-非商业性使用-相同方式共享” 4.0 (CC BY-NC-SA 4.0)”许可协议进行许可。
本作品可自由复制、传播及基于本作品进行演绎创作。如有以上需要,请留言告知,在文章开头明显位置加上署名(Jayce Chant)、原链接及许可协议信息,并明确指出修改(如有),不得用于商业用途。谢谢合作。
详情请点击查看协议具体内容。