首页 文章

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

提问于
浏览
9

关于qtquickcompiler,JIT qml缓存以及qt 5.8(分别为5.9)的开源版本中可用的(以及不可用的),我有点困惑 .

基本上,我想保护我的.qml和.js文件在我的发布版本中不可读 . 我开始了一个新的QtQuick项目示例而没有编辑任何代码 . 我按照这些instructions并在.pro文件中添加了CONFIG = qtquickcompiler,但它没有任何效果 .

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

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

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

4 回答

  • 1

    不,它会是,但随后他们暂时放弃了这些计划,并将其替换为缓存 .

    我认为你不能在另一台计算机上重用 .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压缩,所以如果你的代码真的值得偷窃,它就不会真的防止这种情况,只是让它变得不那么琐碎 .

  • 1

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

    还没 . 最多(包括)5.8你需要购买许可证才能使用QML编译器 .

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

    编译器会将QML转换为C,然后将其编译到您的应用程序中 . .qmlc 文件是引擎生成的缓存,以避免再次解析/优化/等相同的文件 . 然而,如果他们不知道如何简化和集成编译器与缓存的一些讨论,他们需要原始来源,但到目前为止还没有任何东西存在 .

  • 1

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

    是的,当然,看看我的答案:https://stackoverflow.com/a/40861056你可以使用一个encripted资源文件,在执行时解密它...我在我的所有项目中都这样做...这不是一项琐碎的工作,但工作正常 .

  • 1

    更新的答案:从Qt 5.11开始,qt quick编译器也可以在开源版本中使用:

    CONFIG += qtquickcompiler
    

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

相关问题