关于qtquickcompiler,JIT qml缓存以及qt 5.8(分别为5.9)的开源版本中可用的(以及不可用的),我有点困惑.
基本上,我想保护我的.qml和.js文件在我的发布版本中不可读.我开始了一个新的QtQuick项目示例而没有编辑任何代码.我按照这些说明在.pro文件中添加了CONFIG + = qtquickcompiler,但它没有任何效果.
我的.qml文件内置在.exe(在Windows上),但如果查看可执行文件,例如使用notepad ++,我仍然可以看到.qml文件的源代码.
另一方面,如果我不将QRC用于我的.qml文件,则会在运行时为每个.qml创建.qmlc文件.这些文件不是(容易?)可读.但我没有找到一种方法只使用.qmlc文件,而不在我的版本中运送.qml文件(我不认为它是这样的).
回答我的问题:有没有办法用qt的开源版本保护我的.qml和.js文件?qtquickcompiler和新的JIT .qmlc有什么区别?
不,本来是这样,但后来他们暂时放弃了这些计划,取而代之的是缓存。
我认为您无法.qmlc在另一台计算机上重复使用文件,因为 IIRC 它们不是架构可移植的。
将来,应该可以提前预编译.qml并将.qmlc它们捆绑到应用程序二进制文件中。
如果您的文件位于文件系统上,则无法保护它们免遭读取、逆向工程或篡改。
通过编译器,QML 代码被转换为 C++ 代码,然后编译为本机二进制文件。另外,上次我检查过,如果你选择编译器,这是一个“非此即彼”的情况,如果你使用编译的qml,你只能使用编译的qml,所以不能与常规的qml文件混合。它也是超前的,并且需要商业许可。
相比之下,qml 缓存是即时的(可能会提前),不需要商业许可证,并且不存在阻止您使用常规 qml 文件的限制。我不知道实现细节,但它肯定不是将 qml 代码转换为 C++ 然后编译,因为它发生在客户端,不需要安装 Qt 甚至 C++ 编译器。它听起来也不像字节码,因为 IIRC 它在平台之间不是二进制兼容的,它更像是缓存 qml 文件处理结果以避免每次都这样做。
正如此答案中所述,通过一些额外的工作,可能可以实现相当多的保护,例如加密的 QML 文件或二进制资源,但我仍然没有深入研究它。
最后,如果你为qrc文件设置压缩阈值较低,它会在一定程度上混淆可执行二进制文件中的QML代码,但即便如此,它也是常规的zip压缩,所以如果你的代码确实值得窃取,它实际上不会为了防止这种情况发生,只需让它变得不那么琐碎即可。