1. 程式人生 > >利用bat實現Android的自動化編譯

利用bat實現Android的自動化編譯

標題起得有點浮誇哈,本文將介紹利用Bat指令以及Git等工具實現自動化拉取遠端分支,同時使用gradle自動編譯打包傳送郵件到指定郵箱的過程,實現自動化編譯與通知功能,因為當時的需求只有自動打包與通知,所以也沒有加入異常處理機制,日誌記錄也不完善,但是整體思路是一致的,其餘的是體驗上的加強,有興趣的朋友可以自己試試,可以藉助實現了功能bat檔案搭建一個web的更平易近人的介面來供每個專案使用。

一、前言

一些基礎的東西這裡將不作贅述,如git、gralde、bat指令等,以及過程中涉及的各個工具的環境搭建,這些都可以自行百度,資料非常多。

二、配置檔案

為了使用上的便利,最好能提供給使用者自行配置具體專案具體引數的檔案,畢竟不是所有人都瞭解bat,下面提供該編譯工具配置所需要的git資源的樣例:
git郵箱|git密碼|git地址|git分支|該分支具體某次提交記錄(放空預設最新)|git專案名
打包完成後郵件地址配置樣例:
發件人郵箱
發件人郵箱密碼
這是郵件標題
這是具體郵件內容
收件人1郵箱
收件人2郵箱

三、自動編譯bat檔案內容

因為git內容比較多,所以具體的講解我直接註釋在程式碼裡面,bat的註釋以rem開頭,其中一些重要命令也會稍加註釋,如果有一些沒有註釋的又不清楚的可以百度瞭解一下。
@echo off & setlocal enabledelayedexpansion 
COLOR 0A
:cloneBegin
rem *初始化引數.*
set gitUser="" 
set gitPwd=""
set gitUrl=""
set gitBranch=""
set gitCommit=""
set gitProjectName=""
set cloneStr=""
set /a index=0
set cloneRootPath=""
set cloneBranchPath=""
set cloneCommitPath=""
set currentGitName=""
set /a status=0
set /a mailIndex=0
rem *從git-config檔案中逐行讀取配置資訊,並將專案及其依賴庫拉去至本地.*
for /f "tokens=1-6 delims==|" %%a in (git-config.txt) do (
	rem *初始化引數.*
	set "gitUser=%%a"
	set "gitPwd=%%b"
	set "gitUrl=%%c"
	set "gitBranch=%%d"
	set "gitCommit=%%e"
	rem *轉義@字元.*
	set gitUser=!gitUser:@=%%40!
	set gitUrl=!gitUrl:https://=!
	set gitUrl=!gitUrl:http://=!
	rem *生成git clone的指令.*
	set cloneStr=http://!gitUser!:
[email protected]
!gitUrl! -b !gitBranch! set "currentGitName=%%f" echo !cloneStr! if !index! EQU 0 ( set "gitProjectName=%%f" echo ***************!currentGitName! start clone...*************** rem *拉去主專案到當前目錄下的專案名目錄下.* git clone !cloneStr! ./!gitProjectName! ) else ( echo ***************!currentGitName! start clone...*************** cd !gitProjectName! rem *拉去依賴專案到主專案目錄下的依賴庫名目錄下.* git clone !cloneStr! ./!currentGitName! rem *dp0 表示當前該bat檔案的目錄下.* cd %~dp0 ) rem *設定當前專案的build.gradle路徑以及其分支名與提交記錄路徑.* if !index! EQU 0 ( set "cloneRootPath=%~dp0!gitProjectName!\build.gradle" set "cloneBranchPath=%~dp0!gitProjectName!\.git\HEAD" set "cloneCommitPath=%~dp0!gitProjectName!\.git\refs\heads\!gitBranch!" ) else ( set "cloneRootPath=%~dp0!gitProjectName!\%%f" set "cloneBranchPath=%~dp0!gitProjectName!\%%f\.git\HEAD" set "cloneCommitPath=%~dp0!gitProjectName!\%%f\.git\refs\heads\!gitBranch!" ) rem *判斷當前專案是否拉取成功,其分支與當前所處提交記錄是否正確* if exist !cloneRootPath! ( echo *******!currentGitName! clone complete...******* find /i "!gitBranch!" !cloneBranchPath! && ( echo *******!currentGitName! clone branch correctly...******* if "!gitCommit!"==" " ( echo *******!currentGitName! clone latest commit correctly...******* )||( find /i "!gitCommit!" !cloneCommitPath! && ( echo *******!currentGitName! clone seleteced commit correctly...******* )||( if !index! EQU 0 ( cd %~dp0!gitProjectName! ) else ( cd %~dp0!gitProjectName!\!currentGitName! ) rem *更改分支* git reset --hard !gitCommit! cd %~dp0 find /i "!gitCommit!" !cloneCommitPath! && ( echo *******!currentGitName! clone seleteced commit correctly...******* )||( echo *******!currentGitName! clone seleteced commit failed...******* rem rd /s /q %~dp0!gitProjectName! goto cloneError ) ) ) )||( echo *******!currentGitName! clone branch failed...******* rem rd /s /q %~dp0!gitProjectName! goto cloneError ) ) else ( echo *******!gitProjectName! clone failed, please try again...******* rem rd /s /q %~dp0!gitProjectName! goto cloneError ) set /a index+=1 ) rem *編譯專案.* if exist !cloneRootPath! ( cd !gitProjectName! :buildApk gradle assembleRelease rem *after call other batch such as gradle, turn echo off to make command disappear.* @echo off & setlocal enabledelayedexpansion rem *編譯完成的後續處理bat檔案.* call build-after.bat PAUSE ) else ( :cloneError rem *錯誤處理,列印當前的資訊判斷是否配置錯誤,修改錯誤的配置資訊後按回車重新開始編譯.* echo *******!gitProjectName! clone failed, there are your configs in !currentGitName! as follow:******* echo *******gitUser=!gitUser!******* echo *******gitPwd=!gitPwd!******* echo *******gitUrl=!gitUrl!******* echo *******gitBranch=!gitBranch!******* echo *******gitCommit=!gitCommit!******* echo *******repositoryName=!currentGitName!******* echo *******please check for errors and correct them, press any key to reclone after all******* PAUSE goto :cloneBegin ) PAUSE

四、編譯後bat檔案內容

該檔案在上一個bat檔案末尾自動呼叫,也可在編譯後直接執行,判斷是否編譯成功,若編譯成功則呼叫blat工具傳送郵件到指定給指定的收件人。
@echo off & setlocal enabledelayedexpansion 
set status=0
set sendUser=""
set sendPwd=""
set mailTitle=""
set mailContent=""
set /a mailIndex=0
cd %~dp0
rem *從git-config檔案中讀取主專案名.*
for /f "tokens=1-6 delims==|" %%a in (git-config.txt) do (
	if !status! EQU 0 (
		set status=1
		rem *判斷主專案名是否編譯成功.*
		if exist %~dp0%%f\app\build\outputs\apk\app-release.apk (
			echo *******%%f build success*******
			rem *生成當前時間.*
			set time=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%
			rem *重新命名生成的apk檔案,並將其移至指定目錄.*
			ren %~dp0%%f\app\build\outputs\apk\app-release.apk %%f_1.0.0_!time!.apk
			move %~dp0%%f\app\build\outputs\apk\%%f_1.0.0_!time!.apk %~dp0
			rd /s /q %~dp0%%f
			rem *逐行讀取郵件配置檔案內容,最後呼叫blat傳送郵件給每個收件人.*
			for /f "" %%a in (mail-config.txt) do (
				if !mailIndex! EQU 0 (
					set "sendUser=%%a"
				)
				if !mailIndex! EQU 1 (
					set "sendPwd=%%a"
				)
				if !mailIndex! EQU 2 (
					set "mailTitle=%%a"
				)
				if !mailIndex! EQU 3 (
					set "mailContent=%%a"
				)
				if !mailIndex! GTR 3 (
					blat -body "!mailContent!" -to %%a -s "!mailTitle!" -u !sendUser! -pw !sendPwd! -charset UTF-8
				)
				set /a mailIndex+=1
			)
		) else (
			echo *******%%f build failed*******
			echo *******please check for errors and correct them, press any key to rebuild after all*******
			PAUSE
		)
	)
)
PAUSE

五、結尾

寫這個自動化編譯工具時自己對bat語言一無所知,gradle、blat這些工具也是邊做邊學,但是主要難度還是在於bat的編寫上,有時候一條語句就要琢磨個半天,而且由於所花時間有限,寫的工具只能算是勉強能用,若要談到良好的體驗那肯定是差之甚遠,有興趣的朋友可以自己拿去優化優化然後分享出來,也可以大家一起交流討論,如果有看得上想要轉載的朋友請註明一下本部落格出處,多謝。



相關推薦

利用bat實現Android自動化編譯

標題起得有點浮誇哈,本文將介紹利用Bat指令以及Git等工具實現自動化拉取遠端分支,同時使用gradle自動編譯打包傳送郵件到指定郵箱的過程,實現自動化編譯與通知功能,因為當時的需求只有自動打包與通知,所以也沒有加入異常處理機制,日誌記錄也不完善,但是整體思路是一致的,其

底部導航欄:利用viewpager實現Android底部標題欄

設定小紅點和數字方法: http://blog.csdn.net/yancychas/article/details/77331177 方法一. ViewPager + List<View> + PagerAdapter 先看activity_main

利用Appium實現App自動化測試

一、工具 Appium的核心其實是一個暴露了一系列REST API的service 這個service的功能是監聽一個埠(4723),然後接受由client傳送來的command,然後翻譯這些命令,再把這些命令轉換成移動裝置可以理解的形式傳送給移動裝置,移動裝置執行完這些命苦後把執行結果返回

使用JavaWeb實現Android自動化構建打包加固多渠道-GUI篇(上)

一、前言:   Android打包是一件比較繁瑣又耗時的操作,相信很多朋友都想自己搞一個屬於自己的自動化構建程式,本文則是對這一程式的實現提供一個思路方法,沒有采用 Jenkins持續整合 這種方式來實現,但大概思路都大同小異。   關於本文需要了解的一些東西:   1. 實現思

Jenkins實現Android自動化打包

1、Tomcat 進入 https://tomcat.apach e.org/ 官網,下載最新的 tomcat 安裝包並且安裝。 安裝完成後,啟動 tomcat 後,在瀏覽器中輸入 http://localhost:8080/ , 如果看到下面的介

Python-UiAutomator2實現Android自動化測試

本帖轉自搜狗測試公眾號   【一、前言】        基於Python-UiAutomator2實現Android自動化測試,小編在Android應用的自動化效能測試中進行了實踐。本篇將簡單介紹python中使用adb、aapt命令的方法以及Py

利用AspectJ實現Android端非侵入式埋點

前言 最近在專案中遇到通過埋點對使用者行為進行收集的需求,由於專案執行在區域網,而且有一些很細化的需求,比較幾種技術方案之後,選擇了通過AspectJ進行埋點。本文主要介紹筆者對學習和使用AspectJ的總結。 AspectJ是什麼 正如面向物件程式設

利用Bundle實現Android Activity間訊息的傳遞

Activity間的通訊是通過Intent類。  比如有兩個類A.class, B.class 由A啟動新的activity B(單向),當B退出的時候A將不會接收到任何資訊:Intent i = new Intent(this,B.class); startActiv

利用JEXL實現動態表示式編譯

背景 做專案突然遇到這樣的需求: 系統要獲取多個數據源的資料,並進行處理,最後輸出多個欄位。欄位的計算規則一般是簡單的取值最多加一點條件判斷。 而且需要動態變動!!例如一個欄位a的取值,如果a > 10的時候輸出10,a <= 10則輸出a。這

詳解Shell指令碼實現iOS自動化編譯打包提交

目錄 前言Shell指令碼涉及的工具 xcodebuild和xcrunaltoolfir-cliPlistBuddy一些概念的區別具體實現 xcodebuild和xcrun準備Plist檔案獲取命令列引數清理構建目錄編譯打包成Archive將Archive匯出上傳到Fir

Jenkins+Gradle+Grovvy實現Android自動化構建及加固

上次配置了這個環境,也進行了測試,但忙於其他事情了,今日抽空總結一下。 Jenkins 下載與安裝配置 下載這裡提供兩種方式: 安裝配置 1.將下載的jenkins.war放到Tomcat下的webapps目錄下,然後啟動Tomcat。 2.在瀏覽器中訪問”

利用.bat檔案清除Keil編譯生成的無用檔案

前言:相信大家在用keil進行開發專案時,會發現keil編譯時會生成一大堆無用的檔案,使得編譯後的整個工程專案佔用的空間會很大,例如: 編譯前: 編譯後: 執行.bat檔案後: 好吧,我們一起來看下.bat檔案的內容吧 del *.ba

Android自動化編譯設定AndroidManifest.xml中package值(包名)

手動修改Android的AndroidManifest.xml中package值(包名)很簡單,手動修改即可。但是專案中需要把Android的專案原始碼放到伺服器端在客戶下載時候動態編譯生成,且生成的

利用cobbler 實現系統自動化安裝

name oot c4c check edi oar shm available med 1 安裝包和配置服務 root:~# yum install cobbler dhcp -y root:~# systemctl enable tftp dhcpd httpd co

centos7.3 編譯安裝lamp,利用wordpress實現個人博客搭建

編譯安裝apache、編譯安裝mariadb、編譯安裝php   搭建個人博客軟件環境:centos7.3軟件包:apr-1.5.2.tar.bz2apr-util-1.5.4.tar.bz2httpd-2.4.27.tar.bz2mariadb-10.2.7-linux-x86_64.tar.gz

android AppWidget的使用以及利用TimerTask實現widget的定時更新

.class pbm fcm 頻率 http article this statistic service服務 第一步:首先是Widget的定義聲明: 在資源文件下

使用 jenkins 自動化編譯cordova for android 生成 APK

apk app 開發 啟動 安卓 自動 class 系統 編寫 地址 引言 前文中已經介紹了什麽是cordova 為什麽要用cordova,基礎的環境搭建以及如何編譯打包生成APK安裝包,接下來我們介紹如何使用Jenkins 自動化編譯打包生成APK安裝包! 服務器搭建

利用SecureCrt實現自動化指令碼

引言 最近除錯裝置,需要通過Telnet或者ssh遠端到裝置中,進行不斷的輸入相關命令,並且檢視相關的裝置狀態,為了節省時間利用SecureCrt功能實現上述功能,本文簡單介紹其使用,各位看官可以根據自己的具體情況充分自己的主觀能動性實現自己的功能,提供工作效率。 SecureCrt

Android利用ViewPager實現滑動放大縮小

效果圖: 實現這個效果需要先處理佈局檔案 處理如下: ViewPager控制元件的父佈局需要設定  android:clipChildren="false" 這個屬性的解釋是Defines whether a child is limited to draw in

spring_cloud config 配置中心及利用Github實現自動化熱載入配置

    spring_cloud有著強大的生態支援,其自帶的分散式配置中心可以有效解決分散式環境中配置不統一的問題,提供一箇中心化的配置中心。並且依靠其spring_bus(rabbitMq提供訂閱)和github或者gitlab自帶的webhook(鉤子函式