我目前使用 LVL 和 Proguard 的组合作为抵御盗版的第一道防线。
但是,资源字符串呢?例如,如果存在诸如“许可证检查失败”之类的资源字符串,那么盗版者是否只需将该资源 id 追溯到它在代码中的使用位置?事实上,如果字符串是诸如“请联系开发人员”之类的通用字符串,也是如此。
最好的方法是什么?
我目前使用 LVL 和 Proguard 的组合作为抵御盗版的第一道防线。
但是,资源字符串呢?例如,如果存在诸如“许可证检查失败”之类的资源字符串,那么盗版者是否只需将该资源 id 追溯到它在代码中的使用位置?事实上,如果字符串是诸如“请联系开发人员”之类的通用字符串,也是如此。
最好的方法是什么?
如果您定义一个资源字符串,您可能会在以下位置定义或使用它:
编译后,资源字符串、它的名称和它的整数代码结束于:
ProGuard 将完全删除R$string.class,但 Android 反编译器可以从resources.arsc重建所有信息。它仍然需要一些工作,但字符串可能确实暗示了代码的目的(以及某些 API 调用)。
正如 Google 的演示文稿Evading Pirates 和 Stopping Vampires中所建议的那样,您可以通过加密/混淆代码中的字符串以及使用反射来访问某些 API 来改进这一点。
ProGuard 的 Android DexGuard的闭源兄弟可以为您加密字符串(以及 API 调用和整个类),可能比您手动实现的更有效,而且不会增加源代码的负担。
(我是 ProGuard 和 DexGuard 的开发者)
当我想在 android 中隐藏重要的字符串时,我将它们放在 ac/c++ 库中。然后我使用 JNI 调用来检索它们。在 c 库中,我走得更远,我将字符串转换为十六进制,当我检索相同的字符串时,我再次将它从十六进制转换为整数。当黑客试图查看 c/c++ 库时,将很难找到您的秘密字符串(特别是如果将其转换为十六进制)。
这是一篇不错的文章以及如何开始这样做。