Android NDK生成大量的.so文件,只有一个功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android NDK生成大量的.so文件,只有一个功能相关的知识,希望对你有一定的参考价值。

我用android NDK构建这个.so文件时得到800KB cpp文件:

TEST.CPP

int *test() 
    return new int;

的CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)
set(SOURCE_FILES test.cpp)
add_library(native_util SHARED $SOURCE_FILES)

这对我来说是不可接受的。如果对此有任何不妥之处,请纠正我。


我刚刚意识到当我在new int中删除test.cpp时,然后.so文件大小减少到80KB ......嗯,怎么可能???

test.cpp,它产生80KB的.so文件

int test() 
    return 0;


我的NDK版本:

Android/sdk/ndk-bundle 
➜ cat source.properties 
Pkg.Desc = Android NDK
Pkg.Revision = 19.2.5345600
答案

简单来说,共享库中包含了多少所需的外部符号。

我刚刚意识到当我在test.cpp中删除新的int时,然后.so文件大小减少到80KB ......嗯,怎么可能???

这个有可能。因为,代码如下

// test.cpp
int *test() 
    return new int;

当你构建new时,test.cpp运算符依赖于其他C ++库,共享库,例如test_with_new_operator.so文件将添加那些外部符号信息以供将来在链接阶段使用,例如需要std::xxx符号。当你改变它

// test.cpp which produce 80KB .so file
int test() 
    return 0;

它不依赖于C ++ std库,这些符号信息不会添加到你的test_without_new_operator.so中,你会看到更小的尺寸。

例如,当您发出命令时

nm --demangle ./libs/armeabi-v7a/libnative-lib.so

test_with_new_operator.so包括下面的符号信息(更多外部符号信息!!!)

0001ba44 r GCC_except_table0
0001b668 r GCC_except_table0
0001b698 r GCC_except_table1
0001ba98 r GCC_except_table1
0001b568 r GCC_except_table1
0001b9b8 r GCC_except_table1
...
0000622c T std::bad_array_length::bad_array_length()
0000623c T std::bad_array_length::~bad_array_length()
000061c8 T std::bad_array_length::~bad_array_length()
000061c8 T std::bad_array_length::~bad_array_length()
...
00017222 t std::__ndk1::__vector_base<std::__ndk1::vector<__cxxabiv1::(anonymous namespace)::string_pair<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, __cxxabiv1::(anonymous namespace)::malloc_alloc<char> > >, __cxxabiv1::(anonymous namespace)::short_alloc<__cxxabiv1::(anonymous namespace)::string_pair<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, __cxxabiv1::(anonymous namespace)::malloc_alloc<char> > >, 4096u> >, __cxxabiv1::(anonymous namespace)::short_alloc<std::__ndk1::vector<__cxxabiv1::(anonymous namespace)::string_pair<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, __cxxabiv1::(anonymous namespace)::malloc_alloc<char> > >, __cxxabiv1::(anonymous namespace)::short_alloc<__cxxabiv1::(anonymous namespace)::string_pair<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, __cxxabiv1::(anonymous namespace)::malloc_alloc<char> > >, 4096u> >, 4096u> >::~__vector_base()
0001867a t std::__ndk1::__vector_base<std::__ndk1::vector<std::__ndk1::vector<__cxxabiv1::(anonymous namespace)::string_pair<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, __cxxabiv1::(anonymous namespace)::malloc_alloc<char> > >, __cxxabiv1::(anonymous namespace)::short_alloc<__cxxabiv1::(anonymous namespace)::string_pair<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, __cxxabiv1::(anonymous namespace)::malloc_alloc<char> > >, 4096u> >, __cxxabiv1::(anonymous namespace)::short_alloc<std::__ndk1::vector<__cxxabiv1::(anonymous namespace)::string_pair<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, __cxxabiv1::(anonymous namespace)::malloc_alloc<char> > >, __cxxabiv1::(anonymous namespace)::short_alloc<__cxxabiv1::(anonymous namespace)::string_pair<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, __cxxabiv1::(anonymous namespace)::malloc_alloc<char> > >, 4096u> >, 4096u> >, __cxxabiv1::(anonymous namespace)::short_alloc<std::__ndk1::vector<std::__ndk1::vector<__cxxabiv1::(anonymous namespace)::string_pair<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, __cxxabiv1::(anonymous namespace)::malloc_alloc<char> > >, __cxxabiv1::(anonymous namespace)::short_alloc<__cxxabiv1::(anonymous namespace)::string_pair<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, __cxxabiv1::(anonymous namespace)::malloc_alloc<char> > >, 4096u> >, __cxxabiv1::(anonymous namespace)::short_alloc<std::__ndk1::vector<__cxxabiv1::(anonymous namespace)::string_pair<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, __cxxabiv1::(anonymous namespace)::malloc_alloc<char> > >, __cxxabiv1::(anonymous namespace)::short_alloc<__cxxabiv1::(anonymous namespace)::string_pair<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, __cxxabiv1::(anonymous namespace)::malloc_alloc<char> > >, 4096u> >, 4096u> >, 4096u> >::~__vector_base()
0000e304 t std::__ndk1::__split_buffer<__cxxabiv1::(anonymous namespace)::string_pair<std::__ndk1::basic_string<char, 
...

但是,test_without_new_operator.so不会有这些符号,库大小也会更小。


编辑#1

这对我来说是不可接受的。如果对此有任何不妥之处,请纠正我。

你不需要太担心这个,因为当你将这些共享库打包到最终的apk时,不必要的符号和调试信息将被剥离(gradle task app:transformNativeLibsWithStripDebugSymbolForRelease将完成这项工作),你的最终apk大小实际上是多少小于你不能接受的东西。

另外,如果您有兴趣,请在下面进行交叉检查:

以上是关于Android NDK生成大量的.so文件,只有一个功能的主要内容,如果未能解决你的问题,请参考以下文章

Android NDK系列-AS生成jar包导入so库并使用方法

Android NDK系列-AS生成jar包导入so库并使用方法

Android NDK系列- 文件拆分与合并

Android NDK系列- 文件拆分与合并

Android NDK系列-AS使用CmakeLists生成so文件

Android NDK系列- AS导入so三方库,使用C/C+方法