美文网首页unity优化Unity技术分享Unity游戏开发入门
Unity:iOS可执行程序超过80MB问题及各版本IL2CPP

Unity:iOS可执行程序超过80MB问题及各版本IL2CPP

作者: 陈凯利 | 来源:发表于2016-05-18 15:15 被阅读4224次

    测试版本: Unity 4.x
    最小iOS SDK版本:7.0

    都是IL2CPP惹的祸

    Unity的IL2CPP技术,会把所有的DLL中的IL代码转换成C++。这造成了最终编译的可执行文件大小激增。一些大的项目,在上传App Store时会出现大小超载的提示:

    invalid executable size, the size of your app's executable file app_Name is 94208000 bytes,which
    exceeds the maximum allowed size of 80MB.

    如何查看IPA的可执行程序文件大小?

    在mac下使用命令行

    unzip /XXX/AppName.ipa Payload/AppName.app/AppName
    size Payload/AppName.app/AppName
    
    size命令可以查看到armv7和arm64分别占据的执行文件大小

    图中的示例中,执行文件大小则是41533440 + 46514176,约87MB。超出规定。

    不同Unity版本IL2CPP对比

    我们的项目就遇到了可执行文件太大的问题,抱住试一试的心态,试了各个不同的Unity版本,发现不同版本的IL2CPP表现差异巨大!

    不同Unity版本IL2CPP的差异

    从Unity 4.6.2开始,之后的所有版本主要精力几乎都集中在IL2CPP的修复和改进。
    尝试了不同Unity版本的IL2CPP,发现生成的C++代码有非常大的差异,连生成的策略都很不一样。

    在4.6.6后,object引用类型的泛型,会进行泛型共享,但是值类型的泛型,依然会生成非常大量的代码。
    关于IL2CPP的泛型共享技术,可以参考Unity官方博客:
    http://blogs.unity3d.com/2015/06/16/il2cpp-internals-generic-sharing-implementation/

    苹果公司对执行文件的规定

    苹果公司规定,IOS应用执行文件大小有上限限制。
    只支持64位的应用,执行文件必须在60MB以下。 要求iPhone 5S或以上,iOS 8.0或以上版本。
    支持32位+64位的应用,执行文件必须在80MB以下,要求iOS 6.0以上。

    表格中是怎样评估泛型代码占用的?

    使用find命令,搜索带有“Generic"字符串的C++文件,用wc命令进行统计。

    IL2CPP的重灾区 —— 泛型 Generic 和 数组Array

    非常严重, 4.7.1的IL2CPP优化重点,就是对于对泛型进行共享优化。
    比如Dictionary<(KItem), (KWeapon)>,会变成Dictionary<(* void), (* void)>
    但是Dictionary<(KItem), (int)>,依然会生成C++代码。

    总结经验

    • 64位+32位要小于80MB才能允许上传到App Store!
    • 纯64位程序,要求小于60MB才能上传到AppStore
    • IL2CPP的BUG集中在反射!尽可能不使用反射;
    • 执行文件大小跟泛型的使用成正比
    • 代码风格越简洁越不会出现问题!
    • 最新的几个版本4.6.8-4.7.1,IL2CPP已经没有太多变化了
    • 禁止多重泛型、泛型类、泛型接口、泛型委托, 泛型方法用前斟酌
    • 尽可能避免使用反射
    • object引用类型的泛型,4.6.6后,会进行泛型共享,但是值类型的泛型,依然会生成非常大量的代码
    • struct改class! 数组struct[] 会生成大量代码,数组class[]则不会
    • 修复带有值类型的泛型: 如IList<(struct)> 改成IList<(class)>, Dict<(value), (value)> 改成Hashtable

    最终我们选择Unity 4.6.7,因为它生成的执行程序足够小,并开始进行优化。
    最新版本的IL2CPP会比4.6.7的可执行文件大,对我们这样快完成项目,实在没办法了,只能用着4.6.7了。

    ==========================

    2016年12月28日更新。

    多谢网友提醒,以上文字基于Xcode的最小版本设定iOS 8.0。
    后来出了另一篇相关的更详细的文章,建议参详:

    iOS坑:IPA可执行文件大小限制

    相关文章

      网友评论

      • 陈凯利:本文提及的执行文件大小限制,基于Xcode设置最低版本 <= iOS 8.0。
        更详细要看 《iOS坑:IPA可执行文件大小限制》http://www.jianshu.com/p/0e8160cdbf3f


        不知道怎么简书今天编辑不到这文章.....
      • 329d0d341b6a:简直是乱写,不要误导人好吗?谁说的“64位+32位要小于80MB”??? 这是和OSversion有关系的
        陈凯利:@胜和负 谢谢提醒,后来更新了另一篇 《iOS坑:IPA可执行文件大小限制

        》http://www.jianshu.com/p/0e8160cdbf3f 这里没及时更新是不对

      本文标题:Unity:iOS可执行程序超过80MB问题及各版本IL2CPP

      本文链接:https://www.haomeiwen.com/subject/aljwrttx.html