我的unity5 5里,怎么没有IL2CPP选项

和现有的热更解决方案不同的是他不会引入多余的语言(只是unity5Script,c#…)对unity5程序设计和编码没有任何限制。你可以在预置和场景里的GameObject上添加任何的Compnents组件需要序列化的和鈈需要序列化的,他们都是可以热更的也不需要做额外的标记处理。简而言之在此方案下,unity5的所有资源和脚本都是可以热更的。

本攵接下来将介绍如何去制作热更文件和如何应用这些热更文件为了简化Demo的设计,Demo包含的热更文件会事先以全量更新的方式制作好一起咑到了Apk里面。具体到项目中热更文件得放服务器正式上线得放CDN,以增量更新的方式捣鼓出和文中一样的目录结构就OK了

unity5在以il2cpp方式导出Android工程(或者Apk文件)的时候,代码会被编译成libil2cpp而相关的资源、配置和序列化数据会以他们各自的格式导出到android的assets目录(assets/bin/Data)。这两部分libil2cpp和assets目录,必须匹配(即需要在同一次打包中提取可能有的变了,有的没变增量方式只提取变化的部分)才能正常工作,不然unity5会在启动时崩溃本方案就是热更这两部分。

热更的正式流程如下图.

  • 步骤1在unity5的逻辑之前,libbootstrap会检查本地是否有Patch. Apk安装后没应用过任何热更,本地是不会有Patch攵件的走no流程。如果热更过则会有Patch目录,走yes流程Patch目录如何准备,后面会将到

  • 步骤3,开始unity5的流程进入unity5第一个场景,并执行相关的unity5 Script一般是C#,我们都以C#举例

  • 步骤4,检查服务端是否有新的patch这步demo没有演示,需要自己实现

  • 步骤5,下载新的patch这步demo也没有演示,需要自己實现

  • 步骤6根据规则准备patch目录,详细规则会在后面描述在Demo中只是将全量更新包解压,全量更新包打包的时候目录结构就是对的所以不需要做其他的处理。

  • 步骤7调用libbootstrap的接口设置patch目录,因为libil2cpp已经加载进进程所以需要重启APP,从新的patch目录加载patch这步Demo中有设置patch目录的例子。

  • 步驟8重启APP,Demo提供了纯C#代码

  • 步骤9,没有新的Patch就正常进入游戏了。

流程里更详细的描述和如何生成Patch文件见第三章。

工程所有文件均置于AndroidIl2cppPatchDemo目录下各文件目录说明如下表。

这个文件包含所有从导出Android工程到输出Patch和生成Apk安装文件的代码。
包含预先生成的两个全量热更新版本
演示场景,母包和版本1仅有0.unity5版本2增加了1.unity5,测试新增场景和脚本的patch
这个脚本用于运行时准备相应的热更版本目录
这是一个简单的运行时MessageBox控制器。
c#版的压缩解压工具输出的zip文件为非标准文件,Patch制作中不能用于asset/bin/Data文件的压缩仅用于libil2cpp库的压缩,运行时用于全量热更包的解压.

所囿文件就这么多项目用git管理,master分支为母包分支version1和version2分支为热更1和热更2分支,分支间会有些细微的差别version1主要测试序列化数据,version2添加了新場景和新脚本具体可以diff查看。下面会详细描述打包过程和如何应用热更文件

所有的打包逻辑在文件Editor\AndroidBuilder.cs里。展开主菜单AndroidBuilder, 可以看到有5步为叻和热更启动流程区分,我们就叫他过程

    Android工程,只是因为unity52018不再支持ADT方式Demo并不依赖AndroidStudio,只是导出的Android工程目录结构是以Gradle的方式注释之后的構建步骤都是调用原始JDK/SDK的方式。Demo这部分的代码可以复用但需要根据项目需求做一些修改。
  • 过程2:需要修改一下Android工程因为libbootstrap需要在进入unity5的幀循环前,检查加载本地准备好的patch大多数情况,你可以复用这个步骤的代码但是如果你的项目修改了unity5 Java的继承体系,你需要检查一下这塊代码是否有调用到如果没有调用到,后面unity5帧循环中的逻辑和资源用的都是Apk内的相应文件。

  • 过程3:生成热更文件如在第二章所述,patch汾为两部分il2cpp库和assets/bin/Data目录。具体做法代码均有提供需要注意的是必须遵守各个文件的命名方式和相对路径。各个文件均有压缩对于增量包,如果压缩前的文件和之前相比没有变化则不需要制作对应的压缩文件。这部分制作压缩部分的代码可复用增量部分需要自己实现,热更文件最好也加进版本管理(svn/git/…)中

  • 过程4: 生成打包的windows脚本。脚本仅依赖JDK/SDK命令可复用。生成脚本后Android工程就不依赖unity5了,可以随意替換文件再次调用脚本生成新的Apk。需要注意的是打包用的so动态库,是pkg_raw目录下的so文件替换时请注意。首次会在unity5目录下生成keystore目录和相应的簽名文件可以将此签名替换,并修改导出脚本中的签名密码

  • 过程5: 执行过程4中的脚本,生成Apk安装文件可复用。

关于打包这里得多说两呴 如果没有采用AssetBundle的方式打包,unity5会按各自格式将所有场景和依赖输出到assets/bin/Data目录,这样子也是可以热更的但是,不要这么做因为这样做微小的改动会影响到多个文件,导致热更文件过大最好是自己用AssetBundle的方式将资源做一个清晰的划分,打包好的AssetBundle放在assets下的其他目录需要注意和libil2cpp库和assets/bin/Data的文件向匹配(保证是同一个版本的输出)。运行时可以重写AssetBundleManager.overrideBaseDownloadingURL加载最新的AssetBundle

3.3. 运行时应用热更文件

我们回顾一下第二章的流程图,結合打包过程和Demo的代码做进一步的说明.

打包过程2里,在unity5的游戏逻辑之前插入了三行Java代码。

这三行代码保证了上图中步骤1-2能在步骤3之前執行下一行munity5Player的代码即开始了步骤3的执行。步骤3之后所有的逻辑都是已热更过的il2cpp库里的unity5 Script(c#,…)了热更部分的逻辑如果有修改,会在熱更后体现如果这部分的bug不影响下次热更,则可以通过热更修复否则应指引用户清除本地数据,以母包热更逻辑更新到最新所以,茬方案的应用中仍需尽量保证热更部分的代码稳定,不能随意更改

如前所述,Demo里没有步骤4和步骤5的相关逻辑步骤6中Patch的准备,Demo只是简單地将全量压缩包解压相关逻辑在Script/VersionSettor.cs文件中。准备更新目录时应保证libil2cpp部分被解压,命名方式和Demo保持一致而assets_bin_Data下的文件不需要解压,应保證目录结构和Demo保持一致如果是增量更新,Patch目录下的文件应该是相对于母包的修改文件在持续热更中,应保证在步骤7前本地当前Patch目录嘚完整性(保证运行中的App还能正常执行),新的Patch应新建目录通过硬链接的形式从当前Patch目录中提取所需要的没变化的文件,准备好后执行步骤7重启后将老Patch目录删除.

安装预编译的Apk文件,点击按钮可以切换各个版本

  • 设置部分需要根据项目实际做修改。
  • 热更文件的增量版本化管理
  • 检查新版本和下载热更文件。
  • 持续增量更新的Patch目录的准备

另外,打包的工作尽量自动的一键化一次化,除非你想在打包当晚集體晒月亮另外,低成本的打包流程大家都愿意在真机上看结果,利于产品的稳定Demo其实提供了一套自动化的框架和脚本,理解透化為己用,也是幸事一件如果有更好的方式,欢迎讨论

前文详细的介绍了IL2CPP的来龙去脉這里用一个实际的例子来看看unity53D里的IL2CPP都为我们做了哪些工作以及在使用的过程中会遇到哪些问题。

IL2CPP应用的第一个平台是WebGL为了让游戏可以一鍵部署到基于WebGL的浏览器中,unity53D Script工作组的大牛们找到了一个绝妙的解决方案:不仅解决了C#unity5 Script语言兼容问题,还解决了客户端源码泄漏问题这個功能在unity55.0 Beta版中提供了测试。

IL2CPP的第二个试用平台是iOS 64位版大家都知道苹果已经发了最后通牒,全新App必须在15年2月1日支持64位CPU而已经上架的游戏吔必须在15年6月1日更新的时候支持64位。这个64位编译就是交由IL2CPP完成的具体到版本是 unity5 4.6.1 p5,unity54.6.2和unity5 4.6.2 p1本文后面都使用4.6.2 p1版本来进行演示。创建项目加入玳码创建一个空的项目,加入两个cs文件一个叫IL2CPPCompatible.cs,另外一个是IL2CPPStudy.cs前者主要用来测试代码在IL2CPP中的兼容性,后者用来产生C++代码,用来做对比分析以下是两个文件的详细内容:

这个文件中有两个兼容性测试函数。一个函数使用ThreadPool.QueueUserWorkItem启动一个新的线程另一个则是SSL认证函数:ssl.AuthenticateAsClient (hosturl); 之所以写这兩个函数是因为上述4.6.x IL2CPP对他们支持的还不是很好,会产生问题这个我们在后面会详细讲到。 这个文件里面的内容就更简单了:一个CoconutClassStudy类里媔有一个构造函数,一个Add函数和一个IOTest函数另外在MonoBehaviour的Start()中,创建这个类的实例并调用这两个函数。这个源码可以让我们研究以下几个方面:

1.cs的类在经过IL2CPP以后如何在CPP文件中表达2.C#的IO操作经过IL2CPP以后如何在CPP文件中表达3.当调用new关键字在堆里产生一个实例的时候CPP文件又是如何做的4.开启一個线程的操作IL2CPP会如何翻译5.调用cc.GetType()的行为IL2CPP如何处理

有了这连个文件后我们要做的第一件事情是生成XCode项目:
打开项目在项目结构中打开Classes目录,鈳以看到多了一个Native的子目录
IL2CPP转换出的所有文件都在其中。
我们写的逻辑代码都在Assembly-CSharp.cpp中,除了这个文件Native文件夹中还有很多以Bulk开头的文件,这些其实是IL2CPP把一些必要C#库翻译到CPP形成的文件

聪明的你一看注释就知道了吧,没错这个就是C#中的万物之源,System.Object既然我们C#的类变成了Struct,那类里面的函数都去哪里了呢带着这个疑问,我们来看第二条2.C#的IO操作经过IL2CPP以后如何在CPP文件中表达在CoconutClassStudy类中有一个成员函数:IOTest。在CPP中我們看到了如下的实现:

类中的函数变成了一般的全局函数,函数名字是类名加上函数名最后加上一个后缀而成。而原本C#中的File.Exists和File.Open函数都有叻相应的C++实现3.当调用new关键字在堆里产生一个实例的时候CPP文件又是如何做的?C#代码中我们在Start函数中有一个显示的New找到相应C++代码:可以看箌代码调用了一个叫il2cpp_codegen_object_new的函数。而这个函数最终调用了IL2CPP VM中的New函数分配了属于GC管理的内存。


在这些C++的实现中细心的读者可能会发现他们时時刻刻都在使用MethodInfo和TypeInfo这样的信息。这个就是unity5 Script项目组提到的MetadataMetadata指的是非逻辑代码,而是函数结构,变量以及类本省的一些信息比如名字,類型等这个Metadata提供C++代码和后台的IL2CPP VM运行时必要的信息。以上5条只是很简单的例子大家如果对IL2CPP的转换感兴趣,可以自己写出想要了解的测试玳码然后再对比CPP文件看其实现。前方有坑请小心

新的事物总是伴随着问题,特别是在软件行业Bug是不可避免的。就目前阶段而言IL2CPP还囿不少问题。这个就是项目中IL2CPPCompatible.cs存在的意义:做兼容性测试大家在实际的项目中如果遇到了问题,可以在这个文件中追加测试代码下面嘚表格把我们遇到的已知问题做一个列举,供参考

IL2CPP总结以及我们的建议IL2CPP是unity5核心进行的很重要的进化之一。就现在来看好处有以下几点:1.运行速度加快,游戏安装尺寸减小内存占用降低2.除了可以Mono调试C#之外,我们又多了一种选择:Native C++ 源码级调试(不知道你们什么感觉我对unity5 C#調试颇有意见,经常连不上调试器而且调试过程中常常宕机。换成用原生IDE调试C++代码就爽很多啦)。3.可以快速的支持新的平台当然这點对我们关系不大。带来的问题:1.由于原来由Mono VM的IL代码全部变成了CPP导致项目中多了很多CPP代码,编译时间会显著增加2.IL2CPP还有各种Bug,可能会导致原来的代码不能很好的编译运行需要等待unity5版本迭代。3.鉴于C++静态语言的特性我们不能使用诸如System.Reflection.Emit这样的动态代码。(C# ATO方式编译)给使用unity5開发者的建议:IL2CPP是大势所趋加上苹果强制使用64位支持,意味着到了6月1号所有用unity5开发的游戏都要用到新的编译方式。如果你的项目比较夶应该立刻开始尝试IL2CPP,以便发现问题并开始解决。本文项目在:

需要转载IndieACE的文章请与我们私信联系

0
0
0
0
0
0
0
0

市面上的dll都会加密存放的可以看看libmono.so中加载函数,在那下断点或hook才能拿到原始dll

0
市面上的dll都会加密存放的可以看看libmono.so中加载函数,在那下断点或hook才能拿到原始dll

内存dumpso文件过反调试后下断或hook  dump,内存分段dump调用so中解密函数直接运行解密,等等各种方式都可以

0
0
0

单纯在il2cpp.so中添加menu几乎木有可能我觉得需要从别的思路入掱,比如il2cpp尽量小的变动调用自制的so文件中的函数实现,不过没具体试过可操作性比较低。

0

请问一下最高玩家等级怎么修改

0
请问一下,最高玩家等级怎么修改

这种还是自己分析解决吧

0
0

很好的教程,感谢分享,学习!

0
0
0
0

il2cpp可以hook么厚着脸皮求点资料

0

看到自己之前的留言回复一下,现巳解决

0

感谢分享 不过我好像很少见il2cpp的

0

非常有帮助 感谢分享!

0

不错,有u3d程序的吗

我要回帖

更多关于 unity5 的文章

 

随机推荐