赞
踩
记录最近在电脑上使用shell命令调用Unity将项目发布成Android Apk,最后让整套建造工作能在Jenkins上自动化打包。
安装jenkins的文章网上有很多,就不介绍了。在这里记录苹果电脑上安装的一个问题,就是必须要先安装JDK8,否则会出现safari 不能连接到localhost 。
使用Jenkins打包需要安装一个unity的插件。
在系统管理–插件管理–搜索Unity3d plugin安装并重启
然后再全局工具配置中配置JDK的位置
安装好Android SDK和JDK后,设置Unity环境,菜单>编辑>首选项>外部工具,设定以上二个SDKs位置。
当环境设定好了后,先在编辑器模式下进行打包,能正常出包再考虑下一步。
首先在window上使用shell文件,要安装Git,并配置Git环境变量
C:\Program Files\Git\usr\bin
使用shell命令并传递参数的格式如下:
#在Unity中构建apk#
$UNITY_PATH -quit -projectPath $PROJECT_PATH -logFile $LOG_PATH -executeMethod GameTools.AutoBuildUtils.BuildAndroidApp $jsonStr
GameTools.AutoBuildUtils.BuildAndroidApp和jsonStr是你传递进unity的两个参数,第一个是方法名,第二个就可以自己定义打包要什么参数了,例如版本号等等。
最后一步利用Jenkins进行打包Unity。其实无非就是利用Jenkins调用我们的shell命令打包。首先可以利用
sh 'svn co --username lhc --password lhc921 svn://192.168.0.63/ddzu3d/sdk'
命令把工程代码拉下来,并且每次都更新到最新代码。
接着可以通过参数化构建过程,把一些参数提取出来,打包的时候填写,
然后利用我们第一步下载的unity插件,在构建中—Invoke Unity3dEditor中,输入我们上一步的shell命令,打包unity。
最后利用打包归档,把生成的APK归档,就可以在Jenkins上直接下载我们打包好的APK了。
在电脑上使用shell文件打包Unity会自动调起Unity界面,而在Jenkins上则不会,不知道为什么。
而且在这里遇到一个坑,使用Jenkins打包Unity错误说找不到SDK路径:
DisplayProgressbar: Android SDK Detection
Cancelling DisplayDialog: Build failure! Unable to locate Android SDK.
This should not be called in batch mode.
UnityException: Build failure!
Unable to locate Android SDK.
从网上的文章得知,就算在Unity编辑器中设置好SDK位置,使用Batch mode并不会去抓取Unity的SDK位置,因此要在运行时候自己设置Unity的SDK位置。
public class EditorSetup { public static string AndroidSdkRoot { get { return EditorPrefs.GetString("AndroidSdkRoot"); } set { EditorPrefs.SetString("AndroidSdkRoot", value); } } public static string JdkRoot { get { return EditorPrefs.GetString("JdkPath"); } set { EditorPrefs.SetString("JdkPath", value); } } // This requires Unity 5.3 or later public static string AndroidNdkRoot { get { return EditorPrefs.GetString("AndroidNdkRoot"); } set { EditorPrefs.SetString("AndroidNdkRoot", value); } } }
public static void BuildAndroid()
{
EditorSetup.AndroidSdkRoot = @"C:\android\sdk";
EditorSetup.AndroidNdkRoot = @"C:\android-ndk-r10e";
EditorSetup.JdkRoot = @"C:\Program Files\Java\jdk1.8.0_121";
... // 以下省略,請參考前述程式碼
}
经过这些步骤,就可以编写代码打包了。主要说下流程,就是Jenkins调用Shell命令,然后Shell命令又调用Unity编辑器打包。如果熟悉Python的话,打包前后都可以调用Python方便处理。这里说下项目中关键的几个地方:
1.直接使用$+参数名,能读取到Jenkins网页的参数值。
BuildOnce $tp $Lang $Version false $Debug $WithLog $use_lebian $use_bugly $use_overseas $upload_symbols_to_bugly $use_uwa
2.将这些参数传递给python处理。
function BuildOnce(){ _pkg=$1 _lang=$2 _version=$3 _onlyAB=$4 _debug=$5 _withLog=$6 _useLB=$7 _useBugly=$8 _useOverseas=$9 _useSymbolsToBugly=$10 _useUWA=$11 echo "==========>正在构建: "$_pkg"==Version: "$_version #执行打包脚本 cd /Volumes/DataDisk/LT_Android/client_gam/Tools/JeckinsTool/BuildAndroid /usr/local/bin/python3.9 BuildAndroid.py -t $_pkg -l $_lang -v $_version -o $_onlyAB -d $_debug -g $_withLog -e $_useLB -b $_useBugly -u $_useOverseas -s $_useSymbolsToBugly -a $_useUWA }
1.读取传递参数
#读取配置参数 parser = argparse.ArgumentParser("读取Jeckins传参") parser.add_argument('-v', '--Version', default="0.0.0.0") parser.add_argument('-t', '--pkg_type', default=JPARAM_PKG_TYPE_INNER) parser.add_argument('-l', '--Lang', default="ZHCN") parser.add_argument('-o', '--OnlyAB', default="false") parser.add_argument('-d', '--Debug', default="true") parser.add_argument('-g', '--WithLog', default="false") parser.add_argument('-e', '--use_lebian', default="true") parser.add_argument('-b', '--use_bugly', default="true") parser.add_argument('-u', '--use_overseas', default="false") parser.add_argument('-s', '--upload_symbols_to_bugly', default="false") parser.add_argument('-a', '--use_uwa', default="false") args = parser.parse_args() #Common Used version = args.Version pkg_type = args.pkg_type lang = args.Lang onlyAB = args.OnlyAB #Only整包会用到 isDebug = args.Debug withLog = args.WithLog uselebian = args.use_lebian usebugly = args.use_bugly ##############
这些参数仅仅方便在python中使用。
PS:并非只有这种方式可以接收参数,还可以直接从环境变量中读取设置的参数:
useIL2CPP = os.environ.get('use_il2cpp', 'false')
2.调用c#处理。
#$UNITY_PATH -quit -projectPath $PROJECT_PATH -logFile $LOG_PATH -executeMethod ProjectBuild.BuildForAndroid $1
${UNITY_PATH} -quit -batchmode -nographics -projectPath ${PROJECT_PATH} -logFile ${LOG_PATH} -executeMethod GameTools.AutoBuildUtils.BuildAndroidApp $jsonStr
这里无一例外的都是调用Unity的API,从外部调用c#的方法。
1.这里可以接收从外部传进来的参数,也可以直接从环境变量中读取设置的参数。但是感觉还是第二种方式简单。因此这里选择第二种方式来读取自己想要的参数。
public static string Get( string name, string defaultValue )
{
try
{
var env = System.Environment.GetEnvironmentVariable(name);
if ( string.IsNullOrEmpty(env) == false )
{
return env;
}
}
catch
{}
return defaultValue;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。