1. 程式人生 > >android ndk 減小jni動態庫的大小

android ndk 減小jni動態庫的大小

http://blog.csdn.net/hhh901119/article/details/71175609

用readelf -SW libxxx.so可以看到動態庫裡的資訊; 發現有需要.debug資訊段。

用命令arm-linux-androideabi-strip --strip-debug libxxx.so; 對動態庫中的含.debug_xxx的section進行裁剪

用命令arm-linux-androideabi-strip --strip-all libxxx.so; 對動態庫中的名為.symtab和.strtab的section進行裁剪


http://blog.csdn.net/Zaratustra/article/details/77837531

  • gc-sections引數
LOCAL_CPPFLAGS += -ffunction-sections -fdata-sections
LOCAL_CFLAGS += -ffunction-sections -fdata-sections
LOCAL_LDFLAGS += -Wl,--gc-sections

這個引數可以說是意外之喜了,居然能縮減大約200k(20%)左右的提示,因此簡單研究了一下這個引數設定的原理。

GCC連結操作是以section作為最小的處理單元的,只要一個section中有某個符號被引用,該section就會被加入。如果沒有加入-ffunctipn-sections

-fdata-sections所有的function和data都會放到同一個section中生成.o檔案。使用了兩個引數後,編譯生成的.o檔案將會拆分成許多個section,每個section只包含一個function,並且該section的名字為function的名字。因為插入了很多個section宣告,所以自然加入兩個引數後,生成的.o檔案都會比較大,但是在後面的連結階段,這樣的拆分就會很有很大的作用。

在連結階段,由於上述的拆分操作,連結過程中可以很方便的標記出哪些function被使用到,哪些function沒有被使用到,這樣就可以將沒有使用到的function剔除出最後生成的so庫中,由於生成的so不會將section的拆分保留,所以上面因為section產生的體積增加就會消失,並且無用的function會被刪除,這樣整個so的體積就會大大減小了。其實整個過程有點類似於java proguard的optimize過程,但是Java會有反射,動態載入等過程,所以optimize用得會比較少。C++貌似沒有類似機制(由於不是很精通C/C++所以不太肯定),否則也會有坑。


使用CMake設定strip

set(CMAKE_STRIP "/usr/local/arm/linux_arm_2416eabi/bin/arm-s3c2416-linux-gnueabi-strip")

ADD_CUSTOM_COMMAND(TARGET ${LIB_NAME}
POST_BUILD
COMMAND   ${CMAKE_STRIP} *.so )