一妓湘、前言
作為開發(fā)者查蓉,除了日常可以輕松通過Android Studio編譯我們的安卓源碼項目外榜贴,有時候我們也需要額外搭建一個編譯環(huán)境豌研,比如一個一鍵編譯平臺,提供給除了開發(fā)人員以外的人員使用唬党。
- 為什么要使用Docker鹃共?
因為Docker可以輕松虛擬出一臺Linux(Ubuntu、CentOS等)且不用擔(dān)心損壞驶拱;創(chuàng)建和備份數(shù)據(jù)都相對容易霜浴,失敗了也可以很輕松的重來,可以說是一個非常完美的學(xué)習(xí)軟件屯烦。
二坷随、需要具備哪些知識
- Docker相關(guān)知識房铭,需要能夠?qū)崿F(xiàn)基本操作驻龟;
- Linux 命令行相關(guān)知識,比如cp缸匪、mv翁狐、vim等;
- Git相關(guān)知識凌蔬,熟悉基礎(chǔ)操作露懒;
- 安卓編譯-出現(xiàn)問題-解決問題相關(guān)經(jīng)驗闯冷,這就靠平時的積累了,因為什么情況都可能遇見懈词;
三蛇耀、準(zhǔn)備工作
1、在你的設(shè)備上安裝Docker坎弯,比如在我的Windows 10專業(yè)版本上纺涤,MAC也可,Linux更佳抠忘;
2撩炊、一個在git平臺托管的且可以正常編譯的安卓工程;確保在你的設(shè)備上能夠正常拉取代碼崎脉,并且找到你的SSH key(Windows在C:\Users\Administrator.ssh目錄下的3個文件)
四拧咳、開始搭建
1、拉取鏡像&運行虛擬機(本地計算機操作)
開啟命令行終端執(zhí)行如下docker命令:
//拉取鏡像,可能需要花費較長時間
docker pull mobiledevops/android-sdk-image:30.0.3
//啟動目標(biāo)鏡像
docker run -it -u root -v C:\Users\Administrator\.ssh:/gitkey --name="appbuilder" mobiledevops/android-sdk-image /bin/bash
//docker exec -it -u root appbuilder bash
- 這邊拉取的是包含SDK編譯版本(30.0.3) 的鏡像囚灼,具體版本號需要根據(jù)你的需求和Docker hub能夠提供的版本確定(版本號見: Github--MobileDevOps/android-sdk-image/tags)
-
-u root
使用root賬戶登錄Linux系統(tǒng)虛擬機 -
-v C:\Users\Administrator\.ssh:/gitkey
是將我的電腦的sshkey目錄掛載到虛擬機/gitkey
目錄下, 后面git拉取代碼需要用到骆膝,也可以不加,取決于你的git代碼拉取校驗規(guī)則灶体。
2谭网、git準(zhǔn)備&拉取代碼(虛擬機上操作)
- 生成本地的秘鑰(執(zhí)行命令后回車3次)
ssh-keygen -t rsa -b 4096
- 覆蓋我的私人秘鑰(為了拉取git代碼--非強制)
cp /gitkey/* /root/.ssh
此部分是為了跟我電腦上的秘鑰一致(/gitkey/目錄是掛著我電腦的秘鑰目錄), 以便能夠成功通過git服務(wù)器校驗拉取代碼, 具體需要根據(jù)實際情況變更。
- 拉取代碼
git clone -b dev_3.0 git@gitlab.***.com:xxx-android/aicamera.git
cd aicamera
git fetch origin dev_3.0
如下兩個參數(shù)需要根據(jù)你實際情況替換:
dev_3.0
是代碼的分支
git@gitlab.***.com:xxx-android/aicamera.git
是代碼拉取路徑
代碼拉取成功后繼續(xù)>>>>
3赃春、檢查java版本(虛擬機上操作)
按需安裝特定版本愉择,比如我需要jdk11,所以需要卸載默認(rèn)的jdk17织中,不然編譯報錯锥涕。
//輸出java版本,默認(rèn)是jdk17的
java -version
//更新下apt
apt-get update
//列出系統(tǒng)安裝的jdk版本
apt list --installed | grep jdk
//卸載jdk17
apt remove openjdk-17-jdk -y
apt remove openjdk-17-jre-headless -y
apt autoremove
//安裝jdk11
apt install openjdk-11-jdk -y
//檢查版本
java -version
4狭吼、編譯工程(虛擬機上操作)
./gradlew clean assembleRelease
如果編譯成功則會有類似輸出:
.....
BUILD SUCCESSFUL in 3m 49s
77 actionable tasks: 74 executed, 3 up-to-date
五层坠、遇到的問題及解決方案
1、gradle下載失敗
編譯錯誤并有類似輸出:
Exception in thread "main" java.io.IOException: Downloading from https://services.gradle.org/distributions/gradle-6.7.1-bin.zip failed: timeout
出現(xiàn)此問題是因為無法訪問https://services.gradle.org/distributions/gradle-6.7.1-bin.zip
導(dǎo)致的刁笙,可以檢查網(wǎng)絡(luò)或者自己搭建一個http服務(wù)破花,提供gradle-6.7.1-bin.zip
的下載服務(wù)。
搭建一個簡易http服務(wù)操作如下:
//安裝vim
apt-get update
apt install vim -y
//編輯gradle腳本
vim gradle/wrapper/gradle-wrapper.properties
將配置文件(gradle-wrapper.properties)中https://services.gradle.org/distributions/gradle-6.7.1-bin.zip
替換為我本地的http服務(wù)http\://172.29.112.1:8890/gradle-6.7.1-bin.zip
搭建http服務(wù)則是使用sfk, 在自己的Windows電腦上操作的, 前提是自己提前下載好了gradle-6.7.1-bin.zip(其他版本類似)
在文件相同目錄執(zhí)行命令如下:
sfk httpserv -port=8890
這樣就能下載訪問了
2疲吸、編譯異常中斷座每,源代碼項目工程確認(rèn)沒有問題,都是一些jdk包的異常堆棧輸出
檢查虛擬機的內(nèi)存大小摘悴,可能是內(nèi)存不足導(dǎo)致Daemon進程中斷峭梳。
確保RAM有7G,多個CPU核心
這是我出現(xiàn)問題后的設(shè)置蹂喻,可以編譯成功