木骰

xLua:关于Lua代码的打包,解包, 防止篡改, 加密

思绪有点混乱,让我梳理一下。

     打包
     Lua文件到底需不需要打成bundle包再更新到客户端呢?
     1、打成bundle包再更新。
               优点:打成bunddle的唯一好处,在于初次安装时可能需要从服务器下载的代码较多,打成bundle下载一个整包的速度应该要比下载多个小文件要快。
               缺点:这样会导致后续某一个代码有更新就得附带着更新整个bundle的问题。即使起初打bundle的时候分了模块目录来打的包,也会造成因为一个脚本的跟新而导致整个模块代码都跟着更新的问题。
     2、直接下载lua文件。
                优点:后续每次更新的时候只需要更新有变动的那几个lua文件,而不需要附带更新无变动的lua代码。
                缺点:1)零散的lua文件过多可能会导致下载速度过慢,尤其是初次安装的时候。
                          2)没有经过bundle压缩,需要下载的包体大小会比bundle大。
     分析:比较倾向于直接下载lua文件的做法。
               1)打成bundle的方式每次更新可能会附带着更新无变动的代码,这一点令我很抵触。
               2)对于直接下载lua文件的方式,初次安装时需要下载过多lua代码的问题,可以把初次安装所需的这些lua代码直接放在streamingAssets目录下,然后再解包到persistent目录。这样就不用从服务器下载了,完全走的本地操作。
               3)对于没有经过压缩,需要更新的代码体积变大的问题:就让它变大吧,更新的都是代码,并且都只更新有变动的部分,能大到哪去?
     总结:还是采取直接下载lua文件的方式比较好。所以也就不用打包了。直接丢lua脚本的目录到资源服务器上

     解包
     既然都不用打包了,自然也就不用解包了。lua代码都以lua文件的形式存放在persistent目录下。
     不过这里还是思考一下本地lua的存储应该以bundle形式还是直接文件形式呢?
     bundle形式:每次读取一个lua文件都需要先解一个bundle包,以www的方式,然后按照DoString的方式执行。显得比较麻烦
                         并且按照这个方式在Lua代码中就无法按照require的方式引入别的lua代码的写法了,因为对方还是个bundle呀,无法require。
     lua文件形式:从C#读取lua代码只需以读文件的形式读入字符串即可。
                         并且在Lua文件中可以以require的形式引入别的lua文件。
     总结:还是选择以lua文件的形式存放吧。

     防止篡改
     lua文件既然放到persistent目录下,就有可能被用户篡改或误删,我们又不可能限制用户的操作权限,所以这里想要防止lua文件被篡改的话只能在游戏启动的时候再来与服务器的版本比对一遍md5了。若md5有变,则这个文件可能是有更新或者被篡改了。直接当成更新从服务器重新下一遍。
     需要注意的是:这里用来比对本地文件的md5值,应该是在比对之前对文件重新计算得到,而不应该是直接取本地的资源列表得到。取资源列表里的md5的话可能就会发生本地文件已经被篡改了,而列表了的md5还是跟服务器一致,那就漏过了一个代码的更新。
     所以本地的那张资源列表文件根本什么都不需要存储。其存在只是用来标记StreamingAssets下的资源已经解包过到persistent目录了。

     加密
     因为lua代码在本地都是以明文的形式存储的(不管是bundle形式还是文件形式),所以为了防止被别人看到我们那些令人羞涩的代码,必须对其进行加密。
     xLua提供了一个重载loader的方法,在 xlua教程.doc里,那么直接采取字符串加密就可以了。并且重载了这个方法使lua的require函数能够正常引入lua代码,真是个不错的办法。
— 于 共写了1621个字
— 文内使用到的标签:

2条回应:“xLua:关于Lua代码的打包,解包, 防止篡改, 加密”

  1. 姚春林说道:

    字符串加密会导致打出来的AB包比不加密前超级大,,目前没找到好的解决方案。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*