当前位置:   article > 正文

使用Batchmode、Jenkins打包UnityAPK_editorsetup.androidsdkroot

editorsetup.androidsdkroot

记录最近在电脑上使用shell命令调用Unity将项目发布成Android Apk,最后让整套建造工作能在Jenkins上自动化打包。

安装Jenkins

安装jenkins的文章网上有很多,就不介绍了。在这里记录苹果电脑上安装的一个问题,就是必须要先安装JDK8,否则会出现safari 不能连接到localhost 。
使用Jenkins打包需要安装一个unity的插件。
在系统管理–插件管理–搜索Unity3d plugin安装并重启
然后再全局工具配置中配置JDK的位置
在这里插入图片描述

配置Android SDK和JDK

安装好Android SDK和JDK后,设置Unity环境,菜单>编辑>首选项>外部工具,设定以上二个SDKs位置。
在这里插入图片描述
当环境设定好了后,先在编辑器模式下进行打包,能正常出包再考虑下一步。

调用Shell命令打包

首先在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
  • 1
  • 2

GameTools.AutoBuildUtils.BuildAndroidApp和jsonStr是你传递进unity的两个参数,第一个是方法名,第二个就可以自己定义打包要什么参数了,例如版本号等等。

利用Jenkins打包Unity

最后一步利用Jenkins进行打包Unity。其实无非就是利用Jenkins调用我们的shell命令打包。首先可以利用

 sh 'svn co --username lhc --password lhc921 svn://192.168.0.63/ddzu3d/sdk'
  • 1

命令把工程代码拉下来,并且每次都更新到最新代码。
接着可以通过参数化构建过程,把一些参数提取出来,打包的时候填写,
然后利用我们第一步下载的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.
  • 1
  • 2
  • 3
  • 4
  • 5

从网上的文章得知,就算在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); }
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
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";
   ... // 以下省略,請參考前述程式碼
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

经过这些步骤,就可以编写代码打包了。主要说下流程,就是Jenkins调用Shell命令,然后Shell命令又调用Unity编辑器打包。如果熟悉Python的话,打包前后都可以调用Python方便处理。这里说下项目中关键的几个地方:

项目中的Shell

1.直接使用$+参数名,能读取到Jenkins网页的参数值。

 BuildOnce $tp $Lang $Version false $Debug $WithLog $use_lebian $use_bugly $use_overseas $upload_symbols_to_bugly $use_uwa
       
  • 1
  • 2

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

项目中的Python

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
##############
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

这些参数仅仅方便在python中使用。
PS:并非只有这种方式可以接收参数,还可以直接从环境变量中读取设置的参数:

useIL2CPP = os.environ.get('use_il2cpp', 'false')
  • 1

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
  • 1
  • 2

这里无一例外的都是调用Unity的API,从外部调用c#的方法。

项目中的csharp

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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/104932
推荐阅读
  

闽ICP备14008679号