【问题标题】:Difference between the qtquickcompiler and the new JIT .qmlc cache?qtquickcompiler 和新的 JIT .qmlc 缓存之间的区别?
【发布时间】:2017-05-08 10:39:11
【问题描述】:

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

基本上,我想保护我的 .qml 和 .js 文件在我的发布版本中不被读取。我没有编辑任何代码就开始了一个新的示例 QtQuick 项目。我跟着这些instructions在.pro文件中添加了CONFIG += qtquickcompiler,但是没有效果。

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

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

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

【问题讨论】:

    标签: qt qml qtquick2


    【解决方案1】:

    更新的答案: 从Qt 5.11开始,qt快速编译器也在开源版本中提供:

    CONFIG += qtquickcompiler
    

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

    【讨论】:

    • 是的,但是如何使用呢?我的意思是,一旦在 .pro 文件中添加了这个参数,编译器会自动检测 qml 文件并编译?在这种情况下存储编译版本?如果您知道,您能否指出一些解释如何在实际案例中使用此“新”功能的文档?谢谢 P.S.:我也对这个功能感兴趣,也可以使用 Visual Studio 作为 IDE 而不是 Qt Creator...
    • 这里简单解释一下,Qt 5.11 中是否添加了相同的编译器? doc.qt.io/QtQuickCompiler 但是,是否可以使用 Visual Studio 也可以使用此类功能仍然是个问题...
    【解决方案2】:

    不,它会是,但后来他们暂时放弃了这些计划,并用缓存的东西取而代之。

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

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

    如果您的文件位于文件系统上,则无法保护它们不被读取、reverse engineeredtampered with

    使用编译器,QML 代码被翻译成 C++ 代码,然后编译成原生二进制文件。另外,上次我检查,如果你去编译器,这是一个“非此即彼”的情况,如果你使用编译的 qml,你只能使用编译的 qml,所以不能与常规的 qml 文件混合。它也是超前的,并且需要商业许可证。

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

    正如this answer 中所述,通过一些额外的工作可能可以实现相当数量的保护,例如加密的 QML 文件或二进制资源,但我还没有深入研究它。

    最后,如果你为 qrc 文件设置了低阈值的压缩,它会在一定程度上混淆可执行二进制文件中的 QML 代码,但即便如此,它也是常规的 zip 压缩,所以如果你的代码真的值得窃取,它不会真正阻止这种情况,只是让它变得不那么微不足道。

    【讨论】:

    • 请注意,将 GammaRay 指向任何 Qt 应用程序就足以转储资源系统的全部内容,无论是否压缩。
    【解决方案3】:

    有没有办法使用开源版本的 qt 保护我的 .qml 和 .js 文件?

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

    qtquickcompiler和新的JIT .qmlc有什么区别?

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

    【讨论】:

      【解决方案4】:

      提出我的问题:有没有办法保护我的 .qml 和 .js 文件 用开源版本的qt?

      是的,当然, 看看我的回答: https://stackoverflow.com/a/40861056 您可以使用加密的资源文件,在执行时解密它...... 我在所有项目中都这样做...... 这不是一项微不足道的工作,但工作正常。

      【讨论】:

      • 只会让文件更难阅读。该解密密钥仍在内存中某处;)
      • 是的,解密密钥是可执行的,但是你可以做很多事情来保护你的密钥(antiidebbugers 等)不是 100% 安全,但足够了
      猜你喜欢
      • 1970-01-01
      • 2013-02-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 2022-11-17
      • 1970-01-01
      • 2022-11-30
      相关资源
      最近更新 更多