这个系列我们主要学习Cocos2d-x Lua,总结Lua开发过程中所涉及的知识点,以及在开发过程中如何使用Cocos Code IDE。这一篇讲解如何对源代码加密。

        Cocos2d-x Lua(Quick-Cocos2d-x) 集成有 Player 模拟器,可以快速测试 Lua 游戏代码。 当游戏开发完成,需要打包发布的时候,我们不希望 Lua 源代码以明文的方式暴露在 apk 或 ipa 包中,否则你的辛苦劳动成果将被轻易剽窃。幸运的是,Quick框架已为我们提供了这方面的支持。

本文记录ipa打包加密Lua全过程。

环境:

  • 引擎版本:Cocos2d-x Lua 3.3 final

  • 目标环境:iOS

  • 开发平台:Mac with Xcode


1、打开Terminal,切换到项目目录下。

$cd /Users/u0u0/Documents/project/quick_project/test

注:/Users/u0u0/Documents/project/quick_project/test 为我用 player 建立的项目根路径。


2、运行Quick提供的 compile_scripts.sh 加密工具。

$/Users/u0u0/Documents/quick-3.3/quick/bin/compile_scripts.sh -i src -o res/game.zip -e xxtea_zip -ek aaa -es Xt

compile_scripts.sh 可以在 Cocos2d-x Lua 安装路径下找到,需要输入全路径。参数详情如下:

  • -h 帮助

  • -i 源码目录

  • -o 输出文件或目录

  • -p 包前缀

  • -m 编译模式:zip(zip压缩格式)、files(离散文件)

  • -e 加密模式:xxtea_zip(对zip包进行 xxtea 加密)、xxtea_chunk(对.luac 进行加密)

  • -ek 加密密钥

  • -es 加密签名

  • -ex 编译后的文件的后缀名

  • -c 从一个文件加载参数列表

  • -q 生成过程不输出信息

上例中,加密 Lua 源文件所在的 src 目录,输出到res/game.zip,加密模式为zip包xxtea,加密密钥:aaa,加密签名:Xt。


3、打开 iOS 工程文件
路径在 /Users/u0u0/Documents/project/quick_project/test/frameworks/runtime-src/proj.ios_mac/test.xcodeproj。

去掉src文件夹的引用,如下图所示:

1.jpg

注:不是删除src,仅去引用,这样源代码就不会被打包进ipa了。


4、修改启动项。

打开 /Users/u0u0/Documents/project/quick_project/test/frameworks/runtime-src/Classes/CodeIDESupport.h,关闭 Cocos Code IDE支持,如下:

#ifndef CC_CODE_IDE_DEBUG_SUPPORT#define CC_CODE_IDE_DEBUG_SUPPORT 0#endif

打开 /Users/u0u0/Documents/project/quick_project/test/frameworks/runtime-src/Classes/AppDelegate.cpp,修改 Lua 启动入口。

LuaStack* stack = engine->getLuaStack();

之后加入:

stack->setXXTEAKeyAndSign("aaa", 3, "Xt", 2);//与game.zip的生成参数对应// load frameworkstack->loadChunksFromZIP("res/game.zip");stack->executeString("require 'main'");

并屏蔽掉原程序入口:

#else
    //engine->executeScriptFile(ConfigParser::getInstance()->getEntryFile().c_str());#endif


5、运行Xcode测试,程序正常启动。
如果看到如下log信息,说明已使用加密的game.zip包

lua_loadChunksFromZIP() - load zip file: /private/var/mobile/Containers/Bundle/Application/A2985A39-3588-48AD-8219-2476A12B956E/test iOS.app/res/game.zip*lua_loadChunksFromZIP() - loaded chunks count: 125