相同源代码的.so文件要小得多

Much smaller .so file for identical source code

本文关键字:文件 so 源代码      更新时间:2023-10-16

我的Android应用程序(游戏)使用本机C++代码进行某些操作。也就是说,我使用的是安卓NDK。本机C++代码仅为armeabi编译(默认情况下为armeabi-v5)。

我上一次在nativestuff.so中构建c++代码是几个月前,在另一台计算机上(Windows 7+cygwin,因为建议使用Android NDK编译cygwin)。

我刚刚在我现在的电脑(Windows7)上安装了NDK,以及最新的cygwin,并为我的应用程序重建了c++代码。

令我惊讶的是,它生成了一个14KB的.so文件,而之前的.so文件是37KB。请注意,c++源文件完全相同(它们已经一年没有更改了),我的项目处于版本控制之下,所以我100%确定。

我在游戏中测试了c++功能,它和以前一样工作,没有任何错误。

我的C++文件仅使用cstring.hjni.h作为包含。我的Android.mk如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := nativestuff
LOCAL_SRC_FILES := nativestuff.cpp
include $(BUILD_SHARED_LIBRARY)

知道为什么.so文件大小发生了巨大变化吗?

(我在这个问题上也添加了linux标签,因为这可能是一件普通的事情,所以我想确保linux大师也检查它。)

在两个版本上运行objdump -x file.so。这将列出所有部分及其大小。这应该能让你知道问题出在哪里。(即,是否有23KB长的新.debug部分?可能启用了调试模式。)

如果您的代码部分完全不同,请比较objdump -d file.so的输出。也许你的编译器自动内联了更多的代码,这节省了很多空间。

如果另一个部分是新的/不同的,则将输出发布在另一个SO问题中。

也许前面的.so是用调试信息生成的
(使用gcc-g选项编译)

您可以尝试一件事:使用命令大小的可执行文件名。这将为您提供可执行代码的不同区域的大小。如果上一个版本可用,请执行同样的操作。您可能会知道更改的位置。