利用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的编写上,有时候一条语句就要琢磨个半天,而且由于所花时间有限,写的工具只能算是勉强能用,若要谈到良好的体验那肯定是差之甚远,有兴趣的朋友可以自己拿去优化优化然后分享出来,也可以大家一起交流讨论,如果有看得上想要转载的朋友请注明一下本博客出处,多谢。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 03:33:18

利用bat实现Android的自动化编译的相关文章

Gradle Android最新自动化编译脚本教程

转自:http://blog.csdn.net/changemyself/article/details/39927381 一.前言 Gradle 是以 Groovy 语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自动化构建工具. 上面这句话我觉得写得很官方,大家只需知道Gradle可以用来android开发中进行多个项目依赖的自动化编译脚本,知道这点也就知道我们使用它的目的: 为什么不使用Ant做自动化编译脚本,因为ant上手快,但是维护起来太不方便了,有了Gradle你可

Gradle Android最新自动化编译脚本教程(提供demo源码)

一.前言 Gradle 是以 Groovy 语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自动化构建工具. 上面这句话我觉得写得很官方,大家只需知道Gradle可以用来android开发中进行多个项目依赖的自动化编译脚本,知道这点也就知道我们使用它的目的: 为什么不使用Ant做自动化编译脚本,因为ant上手快,但是维护起来太不方便了,有了Gradle你可以跟项目组的同事说,用Ant的孩子们别苦逼的维护了,赶紧换成gradle吧. 本文面向gradle新手或者以前使用过grad

Windows下,Ant自动化编译Android项目具体步骤和方法

 备注:若Android项目引用有第三方库,步骤和方法亦适用. 前提是已经安装好Ant. 1,首先需要创建一个批处理命令(*.bat)文件:Ant for Android.bat,文件内写入以下命令: set path=C:\Windows\System32;D:\Java\JDK\bin;D:\Ant\apache-ant-1.9.3\bin;D:\Android\adt-bundle-windows-x86_64-20130522\sdk\tools; start "Ant for An

使用 jenkins 自动化编译cordova for android 生成 APK

引言 前文中已经介绍了什么是cordova 为什么要用cordova,基础的环境搭建以及如何编译打包生成APK安装包,接下来我们介绍如何使用Jenkins 自动化编译打包生成APK安装包! 服务器搭建 在搭建jerkins之前首先需要一台服务器环境,一个虚拟机或者阿里云租一台,这里我以阿里云服务器为例子: 准备一台阿里云服务器:系统为centos docker环境的搭建 准备一台阿里云服务器,准备一个域名指向该服务器,本例暂用 jenkins.zscode.com 不知道如何操作的小伙伴请自行百

Android自动化编译设置AndroidManifest.xml中package值(包名)

手动修改Android的AndroidManifest.xml中package值(包名)很简单,手动修改即可.但是项目中需要把Android的项目源代码放到服务器端在客户下载时候动态编译生成,且生成的app签名相同但包名不同(若此时包名相同就是相同的app),这种需求需要在服务器端自动化编译Android源代码时候自动调整AndroidManifest.xml中package值才能实现.查阅相关资料,结合Java对XML文件的读写技术,写了一个方法,让服务器端在编译之前预加载修改AndroidM

Android手机上,利用bat脚本模拟用户操作

---- 那么你就可以来看看这篇帖子了. 言归正传 利用bat脚本模拟用户操作,需要用到两点: ①就是adb命令了,adb命令可以用来模拟用户在手机上的操作 ②bat语言,就是批处理语言,主要用来进行逻辑处理,跟众多语言语法一样,批处理语言也包括for循环.if语句之类的语法: 一.adb命令 首先我们来介绍模拟用户在手机上操作的adb命令 input keyevent //发送键盘事件 用法说明: adb shell input keyevent "value" usage: inp

Android:反编译

下载>>>>>>>>>>>>>>> 使用图形化反编译工具:Androidfby 打开Androidfby中的Android反编译工具,选择相应的apk,点击“反编译”,就可以得到apk的布局文件和图片 另一种方法是用apktool.bat输入命令反编译,这个出错概率少一点,不过没上面那么方便 .......\apktool>apktool.bat d testAndroid.apk 利用jdgui.exe查看j

第1章 Android系统的编译和移植实例:

第一章 本章Android系统的编译和移植实例,其中移植涉及的主要内容有下载Android Linux内核,安装交叉工具链,移植Android Linux内核支持EZ6410平台,安装Android SDK,获得Android根文件系统,设置系统环境,完成Android正常启动.安装交叉工具链在ldd6410-read-only目录下修改vim.cross_compile内容为:/usr/local/arm/arm-none-Linux-gnueabi/bin/arm-none-linux-gu

Android APK反编译就这么简单 详解(附图)

在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用的APK进行反编译查看.下面是我参考了一些文章后简单的教程详解. (注:反编译不是让各位开发者去对一个应用破解搞重装什么的,主要目的是为了促进开发者学习,借鉴好的代码,提升自我开发水平.) 测试环境: win 7 使用工具: CSDN上下载地址: apktool (资源文件获取)  下载