如何缩小共享库的大小?

fre*_*6om 6 c c++ android shared-libraries

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

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

Emp*_*ian 5

函数 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
Run Code Online (Sandbox Code Playgroud)

现在比较libA.so和的大小libA.so.orig。可能性libA.so会小得多。

通过跑步,您应该能够挤压libA.so得更多strip libA.so。这会删除所有符号,而不仅仅是调试符号,还会使调试与libA.so. 但是,由于您保留了原始的完整调试副本,因此这不应该是一个大问题。


kon*_*nzo 2

既然您说该库是开源的..只需跟踪函数实现及其依赖的类,然后重新编译您自己的较小版本的库即可。

相信我,这听起来很难,但实际上会比使用编译的 C/C++ 代码节省更多时间。