Unity升级2018与Google Android64位支持

一、闲谈两句

好久没更新博客了,这一年之前管了一阵子游戏的海外版本繁琐的事情比较多,还有一个原因是自己鸽了。现在开始把最近一年做的比较有意义的事情总结发上来。

二、为什么做这件事儿

搜到这个文章的同学可以跳过。
2019年8月1日起:除发布到谷歌商店的32位应用外,所有包含本机代码的新应用新版本都需要提供64位版。
扩展支持:谷歌商店将继续接受使用Unity5.6或更早版本开发的32位游戏,这方面的截止日期至2021年8月。
2021年8月1日起: 对于支持64位的安卓设备将不再提供32位应用程序,用户访问商店也搜不到32位版应用。
扩展备注: 上述政策也适用于使用Unity5.6或更早版本开发的32位游戏,如果不提供64位版用户将无法下载。
豁免(例外)条件包括以下内容:
1.上述64位过渡计划不适用于 Android Wear OS 以及 Android TV,因为目前这些系统还不支持64位架构。
2.如果开发者发布的应用程序或游戏本身就不支持Android 9.0 及以后的版本,那么也不需要发布64位版本。
3.谷歌表示当前32 位将继续保持现有状态, 受影响的开发者只需发布32位应用并提交64位二进制文件即可。

三、升级2018踩过的坑

1.Unity从5.X升级到了2018.4.0f(LTS)版本。此过程几乎没有什么坑,本以为unity在这2-3年会有很大的变动。没想到改完废弃的代码,5.X打出来的bundle都可以在2018上运行,就是效果很多不对,在重新打bundle以后已经勉强可以看。
2.Unity5.X升级2018.4.0f以后prefab的操作改了很多,editor的不少代码都需要重构,后续慢慢发现慢慢修改。新的prefab系统可以看这篇介绍(后续开贴单独讲)

四、ulua/tolua升级

有相当一部分项目组在手游上使用ulua/tolua,在安卓支持64位上必须兼容的就是要支持tolua的arm64位。

1.编译tolua库

原作者很早就在github提交了编译64的脚本,可以下下来照着把lua库编译一个arm64-v8a

2.编译luajit库

安卓32位和64位读的字节码是不同的,如果项目在安卓上用的字节码需要再编译一份64的luajit
下载对应luajit版本

//Mac下编译
# cd 到 LuaJIT 源码目录
cd /LuaJIT-2.1.0-beta3

# 编译 32 位 LuaJIT 解释器
make clean && make && cp src/luajit ../luajit-32 && make clean

# 编译 64 位 LuaJIT 解释器
make clean && make CFLAGS=-DLUAJIT_ENABLE_GC64 && cp src/luajit ../luajit-64 && make clean

编译过程如果出现 ld: library not found for -lgcc_s.10.4
原因是在Mac环境下,默认使用的是10.4,如果本机找不到这个,是系统可能不支持了,所以我们要在编译之前重新设置Mac的编译版本,可以在Mac菜单 苹果>关于电脑 查看当前系统版本。比如 Mac当前是 10.14 。执行命令

export MACOSX_DEPLOYMENT_TARGET=10.14
//Max下编译
# 编译32位字节码 ,
./luajit-32 -b ./source/main.lua ./output/main.yan

# 编译64位字节码,
./luajit-64 -b ./source/main.lua ./output/main.yan64

windows编译
找到vs的命令行工具
Unity升级2018与Google Android64位支持_第1张图片
在命令窗口输入“cd /d \src”切到源代码目录下( 是你下载的LuaJIT源代码所在的路径);再输入命令“msvcbuild”开始编译。一个32位一个64位

# windows字节码
.\luajit-64.exe  -b /main.lua /main.yan64

字节码生成完毕,手机内需要同时包含两份luajit字节码,因为大多数模拟器还是32位架构,而新出的绝大部分手机都是32/64兼容

五、tolua在Android64位上的坑

arm64要手动关闭luajit!
arm64要手动关闭luajit!
arm64要手动关闭luajit!

--在lua代码第一行执行这行代码,这是lua代码
   	    if jit then
	        jit.off();jit.flush() 
	    end

六、判断Android运行在 arm7还是amr64

    //检查是否是安卓64位
    public static bool IsAndroid64bit()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        if (IntPtr.Size == 8)
        {
            return true;
        }
        return false;
#else
        return false;
#endif

    }

你可能感兴趣的:(Unity,Android)