最近一段时间在负责我们游戏项目的客户端的版本发布,这一环节目前很多都需要手动操着。每当发布一个新的安装包一个下午的时间就没了。我们目前只有一个平台下的android和ios版本, 相对来说平台还比较少但是随着项目的推进后面肯定不止这一个平台,按照这个效率到时肯定会让人崩溃。于是自己开始思考如何优化这个流程。我们的项目使用的开发引擎是unity ,它可以再不启动的前提下进行指令运行,基于这样一个特点,可以通过脚本整合整个打包过程。在unity中制作一个静态的c#函数辅助打包,这个静态函数主要你用到Unity 提供的API是PlayerSettings 和 BuildPipeline。
PlayerSettings
这个类提供了关于平台的一些配置具体可参考官网的:https://docs.unity3d.com/ScriptReference/PlayerSettings.html 下面是一些比较常用的配置
android 和 ios 通用部分
PlayerSettings.bundleVersion 用于显示的版本设置
PlayerSettings.productNam 用于显示的软件名称
PlayerSettings.bundleIdentifier 安装包的ID
android 特有部分
PlayerSettings.Android.bundleVersionCode android迭代版本号,每更新一个包这数值都增加
PlayerSettings.Android.keystoreName keystore的路径
PlayerSettings.Android.keyaliasName keystore 别名
PlayerSettings.keyaliasPass keystore 密码
PlayerSettings.keystorePass keystore 密码
ios 特有部分
PlayerSettings.iOS.buildNumber ios迭代版本号,每更新一个包这数值都增加
PlayerSettings.iOS.applicationDisplayName 应用的显示名称
PlayerSettings.iOS.appleDeveloperTeamID 团队id 这里是用到打包时签名需要用到可以在https://developer.apple.com/account/#/membership看到 如下图:
图一在指令运行unity的时候可以传入一些参数,调用的静态方法里何获取这个些传入的参数方式如下:
string[]args=System.Environment.GetCommandLineArgs();
通过如下方式可以查看所有的传入参数
for(inti=0;i
Debug.Log("Args-"+i+""+args[i]);
}
BuildPipeline.BuildPlayer
具体使用可以参考:https://docs.unity3d.com/ScriptReference/BuildPipeline.html android 可以直接导出apk,ios 需要先导出xcode在用xcodebuild命令进行打包,xcodebuild具体使用方式后面介绍 最后整个unity部分的运行指令方式如下:
/Applications/Unity/Unity.app/Contents/MacOS/Unity -batchmode -projectPath {UnityProjectPath} -executeMethod {staticMethod} -logFile {logFilePath} -quit otherParameter
其中上面指令的一些参数是:
UnityProjectPath unity的工程路径。
staticMethod 需要调用的静态方法 如: AutomationHelp.BuildApk 就是类AutomationHelp 里面的静态方法 BuildApk 。
logFilePath 是日志文件保存路径这里的日志是运行过程中的日志输出包含脚本里面的Debug.Log 输出。
在导出ipa安装包过程中,通过Unity指令导出Xcode工程后 需要通过xcodebuild 指令进行ipa导出他需要两个步骤:
1.生成 archive
指令是:xcodebuild archive -project {projectName}.xcodeproj -scheme {projectName} -configuration Release -archivePath {archivePath} PROVISIONING_PROFILE={exportProvisioningProfile}
2.导出ipa
指令是:xcodebuild -exportArchive -exportFormat IPA -archivePath {archivePath} -exportPath {ipaPath} -exportProvisioningProfile {exportProvisioningProfile}
上面两条指令的具体参数是:
projectName 工程名具体可以看 xcode 里面的 .xcodeproj 类型文件名称
archivePath archive 的存储路径
exportProvisioningProfile exportProvisioningProfile 文件路径具体值可以看https://developer.apple.com/account/ios/profile/production如图2
ipaPath 导出ipa的路径
图二图2中的 name:字段即为exportProvisioningProfile的值
了解上面的主要技术点之后我接下来就是考虑如何构建这个脚本系统。我对PHP和shell 脚本进行了一些对比之后做了一个结论:是php 对于文本数据和逻辑处理比较方便,shell 对执行指令系统比较简单,而便逻辑相和数据处理很弱。再对php 与 shell,shell 与 unity的脚本系统交互方式了解后,对整个脚本系统有了一个大概的规划,我决定将php作为总的调度脚本 ,shell 作为具体的功能模块的指令集合。最后根据我们项目的特点规划出了如下一些功能模块:
1.svn 库自动化,svn版本管理中提交新添加的多个文件的指令可以使用:svn add `svn status . | grep "^?" | awk '{print $2}'`
2.ftp自动化 这一块lftp代替了ftp因为在使用ftp过程中非常麻烦。lftp具体可以参考:http://man.linuxde.net/lftp
3.包裹unity指令
4.本地文件同步系统 主要用到的是rsync指令系统用这个系统的主要目的是他可以过滤掉我不需要同步的文件夹,通过如下指令:sync -avp --exclude-from={excludePath} {formPath} {toPath}。
excludePath 是过滤配置文件,里面是过滤的文件名称或者是文件夹用换行隔开
formPath 需要同步的文件路径
toPath 同步到的目标路径
有关sync命令具体可参考:http://man.linuxde.net/rsync
5.远程登录模块 主要借助expect 工具实现自动登录
php 调度shell模块过程中如果有出现某个模块没有正常执行 php调度脚本需要终止执行,这里面涉及到 shell 错误捕获以及php错误处理机制
shell 错误捕获可以通过语句执行后执行如下语句:
if test $? != 0 ; then
echo $FAIL
exit 1
fi
上的语句主要的作用是来判断与他相邻的上一条语句是否成功执行,其中 $FAIL 为一个自定义的标识字段 ,如果在php调用shell模块后的返回值有这个值,这代表shell 执行不成功这时候php将终止执行或者回滚。以上就是自动化打包系统中的主要技术点。
所有的技术都不是一成不变,记录下来以便于回顾。
网友评论