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