一 、前言
目前遇到一個應用場景,一些測試的功能還在測試APP中,所以需要使用測試APP,但是平時需要用到正式的APP,由於正式和測試APP包名衝突,導致經常需要來回卸載安裝,非常麻煩。
所以就想到使用jenkins來編譯APP,將包名參數化掉,正式和測試APP使用不同的包名,就可以實現正式版和測試版APP在同一個手機上共存了。沒用過jenkins,也沒編譯過android,不過同事都比較忙 ,只能自己硬着頭皮上了。這裏做個記錄。
參考:
https://blog.csdn.net/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.csdn.net/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.csdn.net/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.csdn.net/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