在 Android 上使用 GLSL 实现图像处理算法很简单。但是算法的细节很容易在反编译的Java文件中作为字符串或资源文件中找到。我想知道是否存在隐藏 GLSL 细节的方法,例如使用编译的 GLSL 源或其他一些技术。
顺便说一句,我更喜欢使用 GLSurfaceView。
谢谢。
加密确实是您最好的选择。因为这是你唯一的赌注;任何愿意反编译您的 Java 应用程序的人都可能知道如何反编译您的二进制着色器。
再说一次,由于 OpenGL 需要二进制着色器或文本,这意味着在某些时候,解密的着色器将存在于内存中。这意味着用户将能够抢夺它。真的没有办法解决这个问题,而且你的应用程序越有名,它的目标就越大。
只需在着色器文件上使用合适的加密算法即可。如果您想让它们更努力地工作,请加密二进制着色器。
不过,加密有助于着色器的平台特定性质。为了确保您的应用程序实际上可以在所有可能的 Android 设备上运行,您不能真正依赖交付二进制着色器。您可以为特定的硬件提供一些二进制着色器,但是有很多Android 设备。你只能提供这么多的二进制格式。
对于主要的,您的二进制文件将加载。这就是加密有帮助的地方。您仍然需要发送您的文本着色器,但如果您对它们进行加密,那么用户将无法解密它们,而无需阅读您的加密算法或将它们从内存中提取出来。如果你的二进制着色器适合硬件,他们就不能做后者,因为那时你根本不需要加载和解密你的文本着色器。
所以你可以让某人付出相当多的努力。但你无法阻止他们。
我建议你看看glShaderBinary (...)
。编译着色器后,您可以从 OpenGL ES 查询其二进制表示并重新使用该二进制文件(有一些主要限制)。
你必须扔掉你认为你知道的关于字节码可执行文件的东西;Java 有一个单一的 JVM 指令集,因此二进制文件是通用可执行的 - HLSL 着色器也可以以二进制格式分发,因为 Direct3D 字节码是一种中间格式,驱动程序将转换为底层 GPU 的本机指令集。
在 OpenGL 中,没有标准的字节码格式。您从 GL 获得的二进制着色器很可能是特定于硬件和/或驱动程序版本的。因此,您不太可能分发使用二进制着色器的软件,GL 中二进制着色器的主要用途是缓存已编译的着色器,而不是使无源分发成为可能。