(四) MAC 上Jenkins打Andorid包配置

一般来说公司都会把Jenkins自动打包配到一台MAC电脑上,当做专业打包机,
所以下面来介绍下MAC电脑上如何进行打包。
工程路径配置:
在这里插入图片描述
其他的参数配置就不说了,根据自己的喜好进行添加,
参数写入配置:
在这里插入图片描述

echo "Place:${Place}:Version:${Version}:Name:${Name}:Rendering:${Rendering}:ILCPP:${ILCPP}:Release:${Release}:CloseLog:${CloseLog}:UpdateABZIP:${UpdateABZIP}"> ${WorkPath}/jenkinsParam.txt

这个命令是把Jenkins平台上设置的参数写入到工程路径下的JenkinsParam.txt文件内,方便unity打包是读取参数。${xxxx}是取平台设置的参数。
打包命令
在这里插入图片描述

/Applications/Unity/Unity.app/Contents/MacOS/Unity -projectPath ${WorkPath} -executeMethod BuildApp.BuildAndroid -quit
cd ${WorkPath}

命令很简单,第一段是Unity的安装路径,在访达-应用程序中找到Unity-右键打开包,顺着路径就能找到Unity的启动程序。
第二段则是工程的路径。
executeMethod BuildApp.BuildAndroid 表示调用工程中Editor下的BuildApp.BuildAndroid方法,执行完成之后 退出
到此 命令配置结束。
其实也就这三步,设置工程路径,命令写入参数,命令调用打包方法。
下面附上C#打包脚本:

/*---------------------------------------------
 *
 * Title: Jenkins自动化打包工具
 *
 * Description: 只需登录Jenkins进行构建 稍等片刻后便能得到一个APK包
 *  
 * Author: 壹叶成名
 *
 * Date: 2020.4.9
 *
 * Modify: 
 * 
 * 注意:改脚本代码及参数为Jenkins平台打包使用,切勿随意更改,如需更改请于Jenkins同步更改。
------------------------------------------------*/
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System;
using System.IO;
using Legend.Game;
using Legend.Framework;
/// <summary>
/// 发布APP
/// </summary>
public class BuildApp
{
    
    private static string m_AppName = PlayerSettings.productName;
    public static string m_AndroidPath = Application.dataPath + "/../BuildTarget/Android/";
    public static string m_IOSPath = Application.dataPath + "/../BuildTarget/IOS/";
    public static string m_WindowsPath = Application.dataPath + "/../BuildTarget/Windows/";
    public static string m_JenkinsParamPath = Application.dataPath + "/../jenkinsParam.txt";

    static string AbRootPath { get { return Application.dataPath + "/../../AssetBundle/"; } }
    static string UpLodaTemp = Application.dataPath + "/../UpLoadTemp";
    public static void CopyAssestBundle(string surocePath, string surocePath2)
    {
        //清理原始文件
        if (Directory.Exists(UpLodaTemp))
            FileUtil.DeleteFileOrDirectory(UpLodaTemp);
        //拷贝到目标文件夹
        JenkinsTools.Copy(surocePath, UpLodaTemp);
        JenkinsTools.Copy(surocePath2, UpLodaTemp);
    }
    

    #region 打包Android
    [MenuItem("Build/安卓包")]
    //安卓打包方法
    public static void BuildAndroid()
    {
        //设置安卓密钥
        PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, "com.touchmind.fishing3D");
        PlayerSettings.Android.bundleVersionCode = 16777241;
        PlayerSettings.Android.keystoreName = Application.dataPath.Replace("/Assets", "") + "/fishing.keystore";
        PlayerSettings.Android.keyaliasName = "fishing3d";
        PlayerSettings.Android.keyaliasPass = "touchmind147258";
        PlayerSettings.Android.keystorePass = "touchmind147258";
#if UNITY_WINDOW 
        BuildSeting buildSeting = GetAndroidBuildSetring();
#else
        BuildSeting buildSeting = MacGetAndroidSeting();
#endif
        string suffx = AndroidSeting(buildSeting);

        if (buildSeting.UpdateABZIP)
        {
            BundleEditorX bundleEditor = BundleEditorX.GetBundleEditor();
            //打捕鱼AB包
            bundleEditor.StartBuildBundle("Fish3D");
            bundleEditor.StartBuildBundle("GameHall");
            UpLodaTemp += "/" + buildSeting.Version;
            string abPath1 = AbRootPath + ConstValue.Platform + "/" + buildSeting.Version + "/Fish3D";
            string abPath2 = AbRootPath + ConstValue.Platform + "/" + buildSeting.Version + "/GameHall";
            CopyAssestBundle(abPath1, abPath2);
            //创建捕鱼压缩文件
            CreatFishZip();
        }
        //绝对储存路径
        string savePath = m_AndroidPath + buildSeting.Name + "_Android" + suffx + string.Format("_{0:yyyy_MM_dd_HH_mm}.apk", DateTime.Now);
        if (File.Exists(savePath))
        {
            JenkinsTools.DeleteDir(savePath);
        }
        BuildPipeline.BuildPlayer(FindEnableEditorrScenes(), savePath, EditorUserBuildSettings.activeBuildTarget, BuildOptions.None);
    }
    [MenuItem("Build/打开日志")]
    public static void LoadReprot()
    {
        GameObject reportObj = Editor.Instantiate(AssetDatabase.LoadAssetAtPath<GameObject>("Assets/ThirdParts/Reporter/report.prefab"));
    }

 
    //[MenuItem("Build/Load Param")]
    public static BuildSeting MacGetAndroidSeting()
    {
        BuildSeting seting = new BuildSeting();
        string jenkinsParam = File.ReadAllText(m_JenkinsParamPath);
        Debug.Log(jenkinsParam);
        string[] Params=Legend.Game.Tools.SpliteStringByChar(jenkinsParam,':');
        for (int i = 0; i < Params.Length; i++)
        {
            Debug.Log(Params[i]);
            string key = Params[i];
            string value = "";
            if (i<Params.Length-1)// key vlaue Out index
            {
                value= Params[i+1];// Get Value
            }
            if (string.Equals(key, "Place"))
            {
                seting.place = (Place)Enum.Parse(typeof(Place), value);
            }
            else if (string.Equals(key, "Version"))
            {
                seting.Version = value;
            }
            else if (string.Equals(key, "Name"))
            {
                seting.Name = value;
            }
            else if (string.Equals(key, "Rendering"))
            {
                bool.TryParse(value,out seting.MulRedering);
            }
            else if (string.Equals(key, "ILCPP"))
            {
                bool.TryParse(value, out seting.IL2CPP);
            }
            else if (string.Equals(key, "Release"))
            {
                bool.TryParse(value, out seting.Release);
            }
            else if (string.Equals(key, "CloseLog"))
            {
                bool.TryParse(value, out seting.CloseLog);
            }
            else if (string.Equals(key, "UpdateABZIP"))
            {
                bool.TryParse(value, out seting.UpdateABZIP);
            }

        }
        Debug.Log("seting place: " + seting.place);
        Debug.Log("seting Version:" + seting.Version);
        Debug.Log("seting Name:" + seting.Name);
        Debug.Log("seting MulRedering:" + seting.MulRedering);
        Debug.Log("seting IL2CPP:" + seting.IL2CPP);
        Debug.Log("seting Debug:" + seting.Release);
        Debug.Log("seting OpenLog:" + seting.CloseLog);
        Debug.Log("seting UpdateFishAB:" + seting.UpdateABZIP);

        return seting;
    }
    /// 根据读取的数据 在Unity中设置对应的参数 
    static string AndroidSeting(BuildSeting seting)
    {
        string suffx = "_";
        if (seting.place == Place.Debug) //测试包 处理测试配置
        {
            suffx += seting.place.ToString();
        }
        else if (seting.place == Place.Release)  //线上包 处理配置
        {
            //获取宏
            suffx += seting.place.ToString()
        }
        else
        {
            // 其他渠道包待定
        }
        if (!string.IsNullOrEmpty(seting.Version))
        {
            PlayerSettings.bundleVersion = seting.Version;
            suffx += "_" + seting.Version;
        }
        if (!string.IsNullOrEmpty(seting.Build))
        {
            PlayerSettings.Android.bundleVersionCode = int.Parse(seting.Build);
            suffx += "_" + seting.Build;
        }
        if (!string.IsNullOrEmpty(seting.Name))
        {
            //包名
            PlayerSettings.productName = seting.Name;
            //唯一签名
            //PlayerSettings.applicationIdentifier = "com.TTT." + seting.Name;
        }
        if (seting.MulRedering)
        {
            PlayerSettings.MTRendering = true;
            suffx += "_MTR";
        }
        else
        {
            PlayerSettings.MTRendering = false;
        }
        if (seting.IL2CPP)
        {
            PlayerSettings.SetScriptingBackend(BuildTargetGroup.Android, ScriptingImplementation.IL2CPP);
            suffx += "_IL2CPP";
        }
        else
        {
            PlayerSettings.SetScriptingBackend(BuildTargetGroup.Android, ScriptingImplementation.Mono2x);
        }
        if (seting.Release)
        {
            EditorUserBuildSettings.development = false;
            suffx += "_Release";
        }
        else
        {
            EditorUserBuildSettings.development = true;
            EditorUserBuildSettings.connectProfiler = true;
        }

        if (seting.CloseLog)
            GameParams.Instance.UnityLogEnbeld = false;
        else
            GameParams.Instance.UnityLogEnbeld = true;
        return suffx;
    }
    //获取Jenkins写入的unity参数配置 Window上使用
    static BuildSeting GetAndroidBuildSetring()
    {
        string[] parameters = Environment.GetCommandLineArgs();
        BuildSeting buildSeting = new BuildSeting();
        foreach (string str in parameters)
        {
            //解析Jenkins设置的渠道
            if (str.StartsWith("Place"))
            {
                var tempParm = str.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
                if (tempParm.Length == 2)
                {
                    buildSeting.place = (Place)Enum.Parse(typeof(Place), tempParm[1], true);
                }
            }
            //解析版本号
            if (str.StartsWith("Version"))
            {
                var tempParm = str.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
                if (tempParm.Length == 2)
                {
                    buildSeting.Version = tempParm[1].Trim();
                }
            }
            //解析包名
            else if (str.StartsWith("Name"))
            {
                var tempParm = str.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
                if (tempParm.Length == 2)
                {
                    buildSeting.Name = tempParm[1].Trim();
                }
            }
            else if (str.StartsWith("Release"))
            {
                var tempParm = str.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
                if (tempParm.Length == 2)
                {
                    bool.TryParse(tempParm[1], out buildSeting.Release);
                }
            }
            else if (str.StartsWith("Rendering"))
            {
                var tempParm = str.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
                if (tempParm.Length == 2)
                {
                    bool.TryParse(tempParm[1], out buildSeting.MulRedering);
                }
            }
            else if (str.StartsWith("IL2CPP"))
            {
                var tempParm = str.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
                if (tempParm.Length == 2)
                {
                    bool.TryParse(tempParm[1], out buildSeting.IL2CPP);
                }
            }
            else if (str.StartsWith("CloseLog"))
            {
                var tempParm = str.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
                if (tempParm.Length == 2)
                {
                    bool.TryParse(tempParm[1], out buildSeting.CloseLog);
                }
            }
            else if (str.StartsWith("UpdateABZIP"))
            {
                var tempParm = str.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
                if (tempParm.Length == 2)
                {
                    bool.TryParse(tempParm[1], out buildSeting.UpdateABZIP);
                }
            }
        }

        return buildSeting;


    }

#endregion


    }
    /// <summary>
    /// 根据读取的数据 在Unity中设置对应的参数
    /// </summary>
    static string Seting(BuildSeting seting)
    {
        string suffx = "_";
        if (!string.IsNullOrEmpty(seting.Version))
        {
            PlayerSettings.bundleVersion = seting.Version;
            suffx += "_" + seting.Version;
        }

        if (!string.IsNullOrEmpty(seting.Name))
        {
            PlayerSettings.productName = seting.Name;
        }

        if (seting.Release)
        {
            EditorUserBuildSettings.development = false;
            suffx += "_Debug";
        }
        else
        {
            EditorUserBuildSettings.development = true;
            EditorUserBuildSettings.connectProfiler = true;
        }
        return suffx;
    }
#endregion

    public static void WriteBuildName(string name)
    {
        FileInfo fileInfo = new FileInfo(Application.dataPath + "/../bulidname.txt");
        StreamWriter sw = fileInfo.CreateText();
        sw.WriteLine(name);
        sw.Close();
        sw.Dispose();
    }
    
public class BuildSeting
{
    //版本
    public string Version = "";
    //打包次数
    public string Build = "";
    //包名
    public string Name = "";
    //是否发布版本
    public bool Release = false;
    //渠道
    public Place place = Place.Debug;
    //资源类型
    public BundleType bundle = BundleType.GameHall;
    //多线程渲染
    public bool MulRedering = false;
    //是否把代码编译成C++
    public bool IL2CPP = false;
    //打开日志
    public bool CloseLog = true;
    //更新捕鱼资源
    public bool UpdateABZIP = false;
}
//打包的用处
public enum Place
{
    Debug,
    Release,
    HuaWei,
    JiuYou,
    Oppo,
}
//资源类型

其实C#代码根据自己的项目而定。不同的项目不同的需求,打包的方法也有很大的不同,当然如果追求快,可以只写个打包函数,进行Jenkins平台打包,然后在慢慢的一点点添加想要的参数。脚踏实地,一步一个脚印。

大概就介绍到这里,其实还是挺简单的。

努力积才能,壹叶便成名!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铸梦xy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值