squish是一个开源的用于打包lua脚本的小工具,它的主要功能是将多个lua文件整合成一个文件,并在此基础上做压缩和混淆等处理,混淆和压缩后的代码可以直接被执行而不需要先做解压还原等操作。
它的github地址:https://github.com/LuaDist/squish
这个工具安装和使用都很方便,下载源代码后在目录内直接make就行,特别需要说明的是,这个东西目前对lua5.2的支持还不好,所以机器上需要装lua5.1版本才可以正常运行它。你可以运行make install将它安装到你的usr/local/bin目录。
安装完成后,我们就可以开始使用它了。
squish在运行时需要一个叫做squishy的配置文件来完成所有操作,在这个配置文件你最主要的需要告诉squish3件事情:
1.最终生成的打包文件的文件名和位置,使用“Output 文件位置”的格式指明;
2.所有你需要squish处理的lua文件的位置和对应的模块名,使用“Module 模块名 文件位置”格式指明;
3.你lua文件中的入口文件,即main文件,使用“Main 文件位置”的格式来说明,特别需要说明的是,有些时候这个入口文件是可以省略的,这取决于你的lua文件的结构。
在这里我们以cocos2d-x-2.2.1 samples里的HelloLua为例。这个工程中一共有两个lua文件,一个叫hello.lua,一个是hello2.lua。我们知道这个hello.lua就是该程序的入口文件,在这里我们把我们打包后的文件其名为out.lua,于是,对于这两个文件,我们的squishy要这样写:
Output "./out.lua" Module "hello2" "./hello2.lua"
Main "./hello.lua"
还有一点要说明,这个squishy文件实际上相当于一个标准的lua文件,所以在其中可以使用lua的“--”来做注释。
接下来我们就可以用squish来处理这些lua文件了。下面我讲一下squish的几个重要的参数。
1.squish后的第一个参数是给定squishy文件所在的目录,这个参数是可以省略的,如果省略,则squish会在它所在的目录寻找squishy文件。
2.squish提供一个种叫“Minify”的方式对lua文件进行压缩,具体是对lua源文件中的空格,折行,注释以及变量名做处理,达到缩减lua体积的效果,squish对minify提供了两种参数,--no-minify指定不做minify处理,--minify-level=level在对源文件做minify处理的基础上,指明minify的程度,这个程度分为:none,basic,default,full,squish是默认开启minify的。
3.squish用Uglify参数指定对lua源文件的混淆处理,squish默认是不开启混淆的,所以如果需要混淆则要加上--uglify这个参数,并使用--uglify-level=level来指定混淆的级别,关于squish混淆的具体原理有兴趣的可以看一下squish的官方说明,或者直接研究它的源代码,这里就不多说了:)
除了上面所说的参数,还可以添加--gzip,--compile等参数对打包好的lua文件做额外的zip,编译等操作,在这里也不具体讲了,有兴趣的朋友可以试试。
ok,说了这么多,现在让我实际运行命令吧。还是针对上面讲的例子,假设我们要发布最终的程序了,我们决定使用minify,并且level为full,并且对代码做full的uglify,我们只需要运行下面的命令:
./squish --minify-level=full --uglify --uglify-level=full
于是,最终整合缩减混淆过lua文件诞生了:
虽然有些代码还是可以认出来,但是已经达到了阻止人类轻易修改与辨识的混淆程度。
我们再把uglify去掉看看结果,运行:
./squish --minify-level=full
区别还是很大吧:)
以上就是squish这个工具的大概用法和例子了,如果结合一些简单的bash脚本,可以实现更加强大的功能。
有空的话我会写点东西分享一下我们项目中使用这个的经验。
有问题的话可以留言给我,希望大家用的愉快。
原创文章,转载请说明出处,谢谢:)