【问题标题】:How to update a .so file with only the newer .o files?如何仅使用较新的 .o 文件更新 .so 文件?
【发布时间】:2013-11-08 20:51:28
【问题描述】:

我正在开发一个在 apk 中嵌入了原生“.so”文件的 Android 项目。每当我们需要发布错误修复时,我们现在都会发布一个带有“.so”的新 apk 文件,其中包含修复。但这是一个巨大的文件,效率不高。

所以我的问题是,是否可以仅使用已更改的相关“.o”文件来更新“.apk”中的“.so”?意味着保持“.so”文件的其余部分相同,我们可以只更新那些改变的“.o”文件吗?类似于一些系统如何推动他们的错误修复。

【问题讨论】:

  • 您可能会为.so 分发二进制差异升级。仅在 .so 中交换 .o 是不可能的,因为涉及的不仅仅是将它们打包到单个文件中。但你可能不应该因为arstechnica.com/information-technology/2013/04/…
  • 您无法修改已安装的 .apk,除非通过安装/升级机制完全替换它,但您可以通过其他方式分发补充 .so 文件。详细而熟练地使用动态链接器可以让您让一些本地方法覆盖现有方法,但这会非常棘手。

标签: android linux linker shared-libraries native


【解决方案1】:

无法更新动态库 (.so) 的部分内容。它不像静态库 (.a),本质上只是一个带有目标文件的普通存档。动态库更像是一个普通的可执行文件,可以被认为只是一个没有main 的程序。事实上,共享库通常编译为PIC,总体而言,如果库的一部分发生更改,则所有其他部分都应该更新。

比如说,某个函数a的代码中多了一条指令,后面跟着函数bc。然后bc 的地址应该增加被添加到a 的指令的大小。那么这个动态库中bc的所有调用站点都应该更新为新的地址。

也就是说,理论上是可以做到的,但实施成本远高于从中获利。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2014-09-05
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    相关资源
    最近更新 更多