【问题标题】:How to shrink the size of a shared library?如何缩小共享库的大小?
【发布时间】:2016-05-06 03:35:30
【问题描述】:

我是一名 Java 程序员。
我在我的 android 项目中包含了一个开源 C 库,比如 A,通过函数 F1 完成一些本地工作。函数 F1 运行良好,但 A 编译的共享库大小为 5M。这意味着我的最终 APK 将增加大约 5M,这很大。
我的问题是,如何缩小共享库以仅包含我需要的功能?或者至少删除我不需要的大多数功能?有没有什么工具可以做到这一点?

更新 1:
@Employed Russian 已经回答了上述问题的很大一部分,即“剥离”工具。
我进一步的问题是,是否有任何工具可以实现像 ProGuard 对 Java 所做的事情,即完全删除我没有调用的代码?

【问题讨论】:

    标签: android c++ c shared-libraries


    【解决方案1】:

    函数 F1 运行良好,但 A 编译的共享库大小为 5M。

    非常您的共享库很可能包含调试信息,这些信息很容易达到大小的 80%,而您实际上并不需要这些信息。大多数开源库都使用-O2 -g 标志构建,而-g 是最终库大小的决定因素。

    要获取没有调试信息的库,请运行 strip,如下所示:

    cp libA.so libA.so.orig # keep original in case you need to debug it later
    strip -g libA.so
    

    现在比较libA.solibA.so.orig 的大小。 libA.so 很有可能会小很多。

    通过运行strip libA.so,您应该能够进一步挤压libA.so。这会删除 所有 符号,而不仅仅是调试符号,但会使调试与 libA.so 相关的任何崩溃变得更加困难。但是,由于您保留了原始的完整调试副本,这应该不是什么大问题。

    【讨论】:

    • 效果很好,strip -g 之后 14.3M -> 7.4M,strip 之后 7.4M -> 5.7M。非常感谢!
    【解决方案2】:

    既然你说这个库是开源的。只需跟踪函数实现和它所依赖的类,然后重新编译你自己的较小版本的库。

    相信我,这听起来很难,但实际上比玩编译的 c/c++ 代码可以节省更多时间。

    【讨论】:

    • 说我只需要一个功能F1是我的错。事实上,库 A 提供了近 100 个函数,而我需要大约 20 个。
    • 哈哈哈..现在这是一个挑战...我建议您找到该库的旧版本,它们可能小得令人惊讶,但提供您需要的功能...只要它们稳定
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2019-05-31
    • 2021-06-13
    • 2013-11-02
    相关资源
    最近更新 更多