这篇Unity配置也非常重要,很大方面是留下个记录。
首先我们确保Jdk配置正确的时候,就开是通过命令行获取我们的android的密钥和库,Win+R或 Cmd打开命令行
输入以下口令:
keytool -genkey -alias android.keystore -keyalg RSA -validity 36500 -keystore MyGame.keystore
realfram.keystore中的realfram代码名字,可以根据自己的工程进行修改。
打开之后系统会让你输入或者设置密钥库口令,这个密码是不显示的 所以不要感觉没有输入上去,其次我们最好把密码设置成一样的,方便使用。
创建完成后他会生成到窗口命令程序的安装目录下,找到他 然后把他放到工程中。如下 这样这一步就完成了
接下来就是我们BuildAndroid打包代码:
private static string m_AppName = PlayerSettings.productName;//RealConfig.GetRealFram().m_AppName;
public static string m_AndroidPath = Application.dataPath + "/../BuildTarget/Android/";
public static void BuildAndroid()
{
//设置安卓密钥
PlayerSettings.Android.keystoreName = Application.dataPath.Replace("/Assets","") + "/realfram.keystore";
PlayerSettings.Android.keyaliasName = "MyGame.keystore";
PlayerSettings.Android.keyaliasPass = "yiyechengming";
PlayerSettings.Android.keystorePass = "yiyechengming";
BuildSeting buildSeting = GetAndroidBuildSetring();
string suffx = AndroidSeting(buildSeting);
//删除以前的东西
DeleteDir(m_WindowsPath);
//绝对储存路径
string savePath = m_AndroidPath + m_AppName + "_Android" + suffx + string.Format("_{0:yyyy_MM_dd_HH_mm}.apk", DateTime.Now);
BuildPipeline.BuildPlayer(FindEnableEditorrScenes(), savePath, EditorUserBuildSettings.activeBuildTarget, BuildOptions.None);
}
public static void DeleteDir(string scrPath)
{
try
{
DirectoryInfo dir = new DirectoryInfo(scrPath);
FileSystemInfo[] fileInfo = dir.GetFileSystemInfos();
foreach (FileSystemInfo info in fileInfo)
{
if (info is DirectoryInfo)
{
DirectoryInfo subdir = new DirectoryInfo(info.FullName);
subdir.Delete(true);
}
else
{
File.Delete(info.FullName);
}
}
}
catch (Exception e)
{
Debug.LogError(e);
}
}
/// <summary>
/// 根据读取的数据 在Unity中设置对应的参数
/// </summary>
static string AndroidSeting(BuildSeting seting)
{
string suffx = "_";
if (seting.place!=Place.None)
{
//代表了渠道包
//获取宏
string symbol = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android);
//设置宏
PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android,symbol+";"+seting.place.ToString());
suffx += seting.place.ToString();
}
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.Debug)
{
EditorUserBuildSettings.development = true;
EditorUserBuildSettings.connectProfiler = true;
suffx += "_Debug";
}
else
{
EditorUserBuildSettings.development = false;
}
return suffx;
}
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("Debug"))
{
var tempParm = str.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
if (tempParm.Length == 2)
{
bool.TryParse(tempParm[1], out buildSeting.Debug);
}
}
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);
}
}
}
return buildSeting;
}
public class BuildSeting
{
//版本
public string Version = "";
//打包次数
public string Build = "";
//包名
public string Name = "";
//是否测试 版本
public bool Debug = true;
//渠道
public Place place = Place.None;
//多线程渲染
public bool MulRedering = true;
//是否把代码编译成C++
public bool IL2CPP = false;
}
public enum Place
{
None,
XiaoMi,
HuaWei,
MeiZu,
BaiDu,
}
上面代码就是存放在BuildApp脚本里用来让jenkins调用的,设置安卓密钥就是我们第一步通过jdk创建出的密钥库,有了他Jenkins才能打出Android包。其次就是一些参数的配置。
配置完成后我们就可以去Jenkins上打包了,主要Unity一定不要保存在打开状态,这样的话电脑会占用Unity,从而Jenkins就无法进行访问了,Jenkins会在后台进行打包
点击构建:
左边构建目录会显示进程,红色代表失败,蓝色代表成功
打包完成我们可以我们可以去自己设定
好的储存路径下查
看我们的包。
包以出,大功告成。
总结:Jenkins配置起来确实麻烦,但也就麻烦在第一次配置,不过他的优点还是很多的,最长用的就
是定时打包,打包完成之后以邮件的形式发送给指定的用户。还是挺不错的。