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腳本,可以實現更加強大的功能。
有空的話我會寫點東西分享一下我們項目中使用這個的經驗。
有問題的話可以留言給我,希望大家用的愉快。
原創文章,轉載請說明出處,謝謝:)