【问题标题】:Hide code in static library (iOS Obj-C)隐藏静态库中的代码(iOS Obj-C)
【发布时间】:2015-11-23 17:15:06
【问题描述】:

我正在创建一个我希望出售的 iOS 静态库。我已经完成了初始构建的步骤并生成了 .a/.h 输出。

当我将这些文件包含在单独的项目中时,我看不到任何浏览 .a 文件内容的方法。

但是,当我的库中的一行代码使应用程序崩溃时(就像我说的,它仍在开发中),调试器会向我显示整个类 (.m) 文件。这是怎么回事?

我不太了解静态库中的所有内容,我不确定我是否为模拟器和设备编译了该版本。这可能与它有关吗?如果是这样,有人可以解释原因吗?

谢谢!!!

【问题讨论】:

  • 删除与您的库关联的 dSYM 目录,使您的应用程序崩溃,没有源代码。 IE。 dSYM——符号表——提供了库和源之间的映射。
  • 调试器正在向您显示 Xcode 项目中的文件。源代码不存储在 .a 文件中。 (这样做会导致大量的“代码膨胀”,因此即使不考虑安全问题也显然是不可取的。)

标签: objective-c ios xcode static


【解决方案1】:

别担心,您的源代码不包含在存档 (.a) 文件中。

Xcode 足够聪明,可以根据文件中嵌入的调试信息在您的计算机上找到源代码文件。如果您使用“发布”配置构建库(或以其他方式修改构建设置以去除调试符号)并且在机器上的任何地方都没有源代码,则开发人员将不得不求助于他们的 x86 或 ARM 知识汇编来弄清楚你的代码是如何工作的。

顺便说一句:

  • 由于很多 Objective-C 是在运行时处理的,所以很多类名和选择器名将在您的库中可见。这就是它的工作原理。你可以尝试混淆它,但我认为你最好花时间编写更有用的代码来销售。

  • 如果你想给人们一个用于 iOS 开发的静态库,你需要为 iOS 模拟器 (x86) 和 iOS 设备 (arm) 构建版本,然后使用lipo 将它们组合成单个胖静态库。搜索“lipo xcode fat static library”以了解不同的方法。有些解决方案比其他解决方案更复杂。

【讨论】:

  • objective c 使这很容易,因为它将调用者信息直接加载到寄存器中:)
  • 好的,所以你是说 XCode 实际上是在我的电脑上搜索源代码只是为了吓唬我??!?!@!?我环顾四周,看到了“构建一个胖库”,但我还处于这个过程的早期阶段,主要还是在测试我的库。基本上,1. 以发布模式构建(用于模拟器和设备),2. 将库导入单独的项目,3. 确保源不在机器上,以及 4. 如果发生故障?凉爽的!谢谢!
  • 如果它出错了你得到一个错误但不是在一个特定的地方,很可能它会给你错误的地址,也可能是导致错误的数据(无效地址或其他东西)跨度>
【解决方案2】:

我遇到了同样的问题。 @benzado 对他提到的内容是正确的。但是我不得不去掉调试符号来解决这个问题。为此,我必须在构建之前更改项目库的构建设置,如下所述。

选择您的目标并转到构建设置。设置

  1. '复制期间去除调试符号'改为YES
  2. '调试信息格式'到'DWARF with dSYM File'
  3. '生成调试符号'到'NO'
  4. '符号默认隐藏'改为'YES'

要查看这些是什么,请参考Apple Build Setting Reference

并使用“发布”配置构建库。这对我有用。

【讨论】:

  • 工作就像一个魅力!
  • 如果是静态库,还要设置 DEPLOYMENT_POSTPROCESSING=YES,因为只有在启用后处理的情况下才会对静态库执行剥离。
【解决方案3】:

如果您的计算机上有一个包含所有 .m 文件的静态库项目,那么在 xCode 中调试时,该库的每个副本(.a 文件)都将使用其 .m 文件进行符号化。

xCode 不会在您的所有磁盘中搜索适当的 .m 文件。它知道原始项目的位置。因此,如果您只分发库,它会完全隐藏您的初始代码。

为了确保您可以在某个新项目中复制您的库,然后清除库项目中的 .m 文件。 从这一刻起,任何调试库方法的尝试都会在屏幕上显示空文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2019-08-21
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多