qtquickcompiler 和新的 JIT .qmlc 缓存之间的区别?

Difference between the qtquickcompiler and the new JIT .qmlc cache?

我对 qtquickcompiler、JIT qml 缓存以及 qt 5.8(分别为 5.9)的开源版本中可用的(和不可用的)有点困惑。

基本上,我想保护我的 .qml 和 .js 文件在我的发布版本中不被读取。我在没有编辑任何代码的情况下启动了一个新的示例 QtQuick 项目。我按照这些 instructions 并在.pro文件中添加了CONFIG += qtquickcompiler,但没有效果。

我的 .qml 文件内置在 .exe 中(在 Windows 上),但如果查看可执行文件,例如使用记事本++,我仍然可以看到.qml文件的源代码。

另一方面,如果我不为我的 .qml 文件使用 QRC,则会在运行时为我的每个 .qml 创建 .qmlc 文件。这些文件不是(容易?)可读的。但是我找不到只使用 .qmlc 文件而不在我的构建中传送 .qml 文件的方法(我不认为它应该是那样的)。

回到我的问题:有没有办法用开源版本的 qt 保护我的 .qml 和 .js 文件? qtquickcompiler 和新的 JIT .qmlc 有什么区别?

Is there a way to protect my .qml and .js files with the open source version of qt?

还没有。在(包括)5.8 之前,您需要购买许可证才能使用 QML 编译器。

And what is the difference between the qtquickcompiler and the new JIT .qmlc?

编译器会将 QML 转换为 C++,然后将其编译到您的应用程序中。 .qmlc 文件是由引擎生成的缓存,以避免再次解析/优化/等相同的文件。然而,它们是一个缓存——您需要找到原始来源以防它们不被使用。在 Qt Contributors' Summit 2016 上有一些关于如何简化和集成编译器与缓存的讨论,但到目前为止还没有任何内容。

不,本来是会的,但后来他们暂时放弃了那些计划,取而代之的是缓存。

我认为您无法在另一台计算机上重复使用 .qmlc 文件,因为 IIRC 它们不是架构可移植的。

将来应该可以提前预编译 .qml.qmlc 并将它们打包到应用程序二进制文件中。

如果您的文件在文件系统上,则无法保护它们不被读取,reverse engineered, or tampered with

使用编译器,QML 代码被翻译成 C++ 代码,然后被编译成本机二进制文件。另外,上次我检查过,如果你选择编译器,这是一个 "either / or" 的情况,如果你使用编译的 qml 你只能使用编译的 qml,所以不要与常规的 qml 文件混合。也是超前的,需要商业授权。

相比之下,qml 缓存是即时的(将来可能会提前),不需要商业许可,也没有阻止您使用常规 qml 文件的限制。我不知道实现细节,但肯定不是将 qml 代码翻译成 C++ 然后编译,因为它发生在客户端并且不需要安装 Qt 甚至 C++ 编译器。它听起来也不像字节码,因为 IIRC 它在平台之间不是二进制兼容的,它更像是缓存 qml 文件处理结果以避免每次都这样做。

this answer 中所述,通过一些额外的工作,可能会实施相当程度的保护,例如加密的 QML 文件或二进制资源,但我仍然没有深入研究。

最后,如果你把qrc文件的压缩阈值设置的比较低,会在一定程度上混淆可执行二进制文件中的QML代码,但即便如此,也是普通的zip压缩,所以如果你的代码真的值得窃取, 它不会真正阻止它,只是让它变得不那么琐碎。

Coming to my question: Is there a way to protect my .qml and .js files with the open source version of qt?

是的,当然, 看看我的回答: 您可以使用加密的资源文件,在执行时对其进行解密... 我在我所有的项目中都这样做...... 这不是一项琐碎的工作,但效果很好。

更新后的答案: 从Qt 5.11开始,qt quick编译器也开源了:

CONFIG += qtquickcompiler

https://wiki.qt.io/New_Features_in_Qt_5.11