2017-05-08 123 views
5

我对qtquickcompiler,JIT qml缓存以及qt 5.8(分别为5.9)的开源版本中有哪些(以及哪些不可用)有点困惑。qtquickcompiler和新的JIT .qmlc缓存之间的区别?

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

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

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

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

回答

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压缩,所以如果你的代码真的值得窃取,它不会真的阻止,只是让它稍微微不足道。

+0

请注意,将GammaRay指向任何Qt应用程序即可转储资源系统的所有内容(压缩或不压缩)就足够了。 – peppe

+0

更多好消息... – dtech

1

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

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

qtquickcompiler和新的JIT .qmlc有什么不同?

编译器会将QML转换为C++,然后将其编译到您的应用程序中。 .qmlc文件是由引擎生成的缓存,用于避免再次解析/优化/重新分类相同的文件。然而,他们是一个缓存 - 你需要原始来源以防他们不习惯。在2016年Qt撰稿人峰会上,有关于如何简化和集成编译器与缓存的讨论,但至今没有任何内容存在。

1

回答我的问题:有没有办法保护我的.qml和.js文件 与开源版本的qt?

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