用 Jenkins 编译APK,在Jenkins所在的Linux (Ubuntu) 服务器配置 Android-sdk。
惯例踩坑,不是完整教程。
Gradle
配置完 Git 库直接开跑
|
|
指定了本地gradle,但服务器上并没有gradle,改为使用gradle wrapper。
……结果跑了一个周末,gradlew还停在:
|
|
[捂脸]国内的开发者就是困难,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目录,然后解压到里面,执行
|
|
我去,默认运行居然是GUI工具,不过我也不愿意敲一堆参数,那就配置一下x11 forwarding 然后本地开一个Xming就好了。(当然也可以选择 ./android update sdk --no-ui --filter sdk1, sdk2, sdk3,...
)
安装好之后,定义 ANDROID_HOME
为 android-sdk
所在目录,并且把 $ANDROID_HOME/tools
和 $ANDROID_HOME/platform-tools
加入 PATH
。如果不确定配置的 ANDROID_HOME
能不能被Jenkins读到,也可以在Jenkins的全局配置里添加这个环境变量。
好了,接下来就是编译报缺什么就装什么了。不过每次失败只能看到遇到的第一个错误,如果自己判断不准依赖,往往要浪费好几个build。还好build号完全不值钱。
这里有一个被误导的点:每次遇到缺什么依赖的时候,报的错误是
|
|
焦点很容易被引导到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怎么也找不到
|
|
网上找了半天,发现大家都是在Android Studio的SDK Manager里安装,我就在Windows上试了一下,果然只能在Android Studio里看得到……
好吧先不追究原因,我装一个AS还不行吗。同样是在大师兄下载AS的包,解压到对应目录,然后执行
|
|
注意这个必须要有界面,不像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)。
看输出日志
|
|
额…光顾着搞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)”许可协议进行许可。
本作品可自由复制、传播及基于本作品进行演绎创作。如有以上需要,请留言告知,在文章开头明显位置加上署名(Jayce Chant)、原链接及许可协议信息,并明确指出修改(如有),不得用于商业用途。谢谢合作。
详情请点击查看协议具体内容。