Android NDK производит массивный .so файл, который имеет только одну функцию - PullRequest
0 голосов
/ 16 апреля 2019

Я получаю 800 КБ .so файл при сборке этого cpp файла с android NDK:

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 размер файла уменьшается до 80 КБ ... хм, как это возможно ???

test.cpp , который производит 80 КБ .so файл

int test() {
    return 0;
}

Моя версия NDK:

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

1 Ответ

3 голосов
/ 16 апреля 2019

Проще говоря, это зависит от того, сколько необходимых внешних символов включено в вашу общую библиотеку.

Я только что понял, когда я удаляю новый int в test.cpp, тогда размер файла .so уменьшается до 80 КБ ... хм, насколько это возможно?

Этовозможно.Поскольку нижеприведенный код

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

оператор new зависит от других библиотек C ++, при создании test.cpp общая библиотека, например файл 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 на самом деле намного меньше, чем то, что неприемлемо для вас.

Также, если у вас есть интересы, перепроверьте ссылки ниже:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...