一 、前言
目前遇到一个应用场景,一些测试的功能还在测试APP中,所以需要使用测试APP,但是平时需要用到正式的APP,由于正式和测试APP包名冲突,导致经常需要来回卸载安装,非常麻烦。
所以就想到使用jenkins来编译APP,将包名参数化掉,正式和测试APP使用不同的包名,就可以实现正式版和测试版APP在同一个手机上共存了。没用过jenkins,也没编译过android,不过同事都比较忙 ,只能自己硬着头皮上了。这里做个记录。
参考:
https://blog.youkuaiyun.com/zhuyb829/article/details/78899465
https://www.jianshu.com/p/dc78cbf5080d
二、准备工作
jenkins已经部署好了,只要用就行了~
APP源码也已经上传到git上了,已经做好了参数化 ,拉取就行了。
三、正式开始编译
本次编译参照了bear_android的攻略,附上链接:https://www.jianshu.com/p/dc78cbf5080d
四、编译中踩过的坑
重点记录下踩过的坑,各种坑各种解决不掉/(ㄒoㄒ)/~~
1、找不到android sdk
错误提示:The SDK directory '/var/lib/jenkins/workspace/xxxxxx /C:\xxxx\Android\Sdk' does not exist.
1)jenkins中配置的环境变量ANDROID_HOME没发挥作用
原来源码中SDK路径写死了路径,导致jenkins中的ANDROID_HOME没有发挥作用。
解决方案:修改local.properties文件,注释sdk.dir就好了,默认就变成使用ANDROID_HOME的环境变量了。需要协调研发人员将这个配置改为环境变量。
2)SDK目录不存在
错误提示:> The SDK directory '/root/android-sdk-linux/SDK' does not exist.
多次确认这个目录是存在的,但是就是提示路径不存在,jenkins中使用的也是root账号了。
解决方案:将文件复制到jenkins目录下,重新配置环境变量(包括 jenkins和linux的环境变量)
2、android sdk licences have not been accepted
错误提示:Caused by: org.gradle.api.GradleException: Failed to install the following Android SDK packages as some licences have not been accepted. platforms;android-28 Android SDK Platform 28 build-tools;27.0.3 Android SDK Build-Tools 27.0.3
解决步骤:
1)安装指定的build tool
解决方案:需要使用sdkmanager安装build tool
参考:https://blog.youkuaiyun.com/weixin_43819222/article/details/90692598
2)/tools/bin/下面找不到sdkmanager
解决方案:到tools执行 # sudo ./android
结果遇到了下文3、4问题,依次解决 ,发现必须支持UI,原来的putty不支持,改用XManager。
先启动Xmanager - Passive,再启用XShell,根据Xmanager - Passive的提示 :0.0
执行:# export DISPLAY=本机ip:0.0
3)提示java环境错误
错误提示:
./android: line 84: java: command not found
./android: line 94: java: command not found
./android: line 110: exec: java: not found
排查发现java已经安装,java -version也正常,复制了其它的jar包也能够正常执行,就是执行 sudo ./android时会报错。
找了很久没找到解决方案,最后偶然在某篇博文中找到了,但是链接丢失了,非常抱歉。
解决方案:建立软连接,将java的目录连接到usr/bin下面去,不知道是什么原理。
ln -s /xxx/jdk1.8.0_111/bin/java /usr/bin/java
备注:删除链接
rm -rf symbolic_name
注意不是rm -rf symbolic_name/
4)提示动态链接库 错误
错误提示:
[root@localhost tools]# sudo ./android
Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-pi-gtk-3550 or swt-pi-gtk in swt.library.path, java.library.path or the jar file
这个问题找了很久,好不容易找到资料:https://blog.youkuaiyun.com/lsylovezsl/article/details/94382971
同样执行:ldd libswt-pi-gtk-3550.so
可以看到少了这两个包,安装起来。
安装libxtst:
yum -y install libxtst
安装libgtk2.0:
yum -y install libgnomeui-devel
yum -y install gtk2 gtk2-devel gtk2-devel-docs
yum -y install gnome-devel gnome-devel-docs
5)终于启动 ./android
3、重启后jenkins数据全部丢失
现象:jenkins重启后,进去发现被初始化了
原因:jenkins的路径不是默认的/root/.jenkins,需要 重新配置环境变量
解决方案:停止jenkins,配置环境变量JENKINS_HOME,路径为原来jenkins文件的路径,切记务必先停止jenkins。
参考:https://blog.youkuaiyun.com/weixin_39517591/article/details/81781661
4、找不到junit
报错:error: package org.junit does not exist
原因:没有安装junit,或者junit.jar不在classpath的环境变量里。
解决方案:安装junit,并配置环境变量classpath,都试过了,还是不行,最后采取的方法,在gradle编译参数中添加-x test,跳过单元测试。
5、打包出来的release包安装提示没有证书
排查:经确认/app/build.gradle文件中,已经包含了数字证书的相关配置,百度发现,需要增加一行配置,不清楚原理,参考:https://blog.51cto.com/fengwan/2286023
解决方案:按照下土配置,增加signingConfig这一行。
buildTypes {
release {
signingConfig signingConfigs.release #缺少这段,或者buildtypes在signingconfigs签名
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
至此终于结束了。
六、参数化构建
参数化构建,按照百度到的攻略,基本没遇到什么问题,就多级联动和git的参数化简单说下。
如果希望多级参数联动,即选择某个参数(如编译环境选择测试环境或生产环境),其它参数跟着变化,需要安装Choice Parameter插件。切记有个小坑,referenced parameters一定要写,表明根据那个参数变化而变化。
参考:https://www.jianshu.com/p/d4d9d60a3e53
如果希望构建时手动选择git分支的,可以安装Git Parameter插件。
参考:https://www.cnblogs.com/peng-lan/p/12001977.html