【问题标题】:compile Java to native Android instead of writing in C将 Java 编译为原生 Android,而不是用 C 编写
【发布时间】:2013-06-03 11:43:12
【问题描述】:

我们正在寻找一种方法来保护我们的代码,而混淆是不够的。 是否可以将 Android java 代码编译为原生 Android 库?

另一种选择是用 c 编写代码并通过 JNI 自己连接它。但是我们的代码非常精细且经过良好测试,重写为 c 将重新开始测试。

PS:在我们在 x86 硬件上运行并使用 Excelsior Jet 作为保护手段之前。由于我们希望转向更具成本效益(更便宜)的 Arm/android 硬件,我们正在寻找与 Jet 类似的解决方案,可惜只能编译到 x86。

【问题讨论】:

  • 我们用 C++ 重写了它。没那么复杂,只要写单元测试就好了。
  • 哎,你把我们带到了那里:)。我们有一些单元测试,但还不够。在过去的 6 年中,该代码在试点项目和生产过程中得到了优化。在回顾中添加单元测试可能非常困难,因为它涉及人们以不可预测的时间间隔触发传感器。不过,这将是编写更多测试的好理由。
  • 真的值得花时间考虑吗?如果您需要保护,请寻找保护。这是另一个层次的混淆。取决于你做什么以及它有多独特。但我认为,如果你花同样的时间改进你的代码和你的商业模式,那将是更好的投资。或者只在本地制作关键部分,在 Java 中休息。你知道,原生更难调试和分析。甚至本机代码也可以反编译,只是更难。如果值得,它就会完成。如果不是,你为什么要这样做?如果需要,请考虑在线模型,您的代码不会离开您的手。
  • @Pihhan 我分享你的想法,我们在这里进行了同样的讨论:native 真的比 proguard 混淆更好吗?正如您所建议的,我们的目标是让我们的一部分代码在本地,其余的将是 Java。至于是否值得:它是一个不能在云中运行的算法,并且已经开发了多年。其次:这不是我的决定,在我们现在拥有的原生编译有好的替代方案之前,公司所有者不会允许迁移到 Arm。

标签: android android-ndk java-native-interface


【解决方案1】:

理论上你应该能够使用 LLVM。它有:

原则上,这可以满足您的需求。但是我想你需要分发(以编译的形式)大量的 Java 类库。总而言之,听起来真的很难。而真正想看代码的人,ARM反汇编不会有太大问题……

【讨论】:

  • 这听起来像是一个有趣的选择,如果可以只为部分代码做到这一点。取决于这两个步骤的成熟程度。知道如何从未转换的 java 中调用生成的代码吗?
  • 如果 Java 代码严格来说是一种没有显着外部依赖性的算法,我只会尝试一些疯狂的事情。在这种情况下,只需一个带有一点简单 JNI 的额外 C 文件就可以让您调用它……也许!
猜你喜欢
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 2011-09-04
  • 2014-01-10
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多