How to decrease the size of android native shared libaries (.so files)?

白昼怎懂夜的黑 提交于 2019-12-30 11:03:47

问题


I am trying to build opencv (version 3.4.2) for Android using ndk-18-beta1 and c++_static since this ndk does not support gnustl_static anymore.

I created my ndk-config.py file with just armeabi-v7a architecture:

ABIs = [
    ABI("2", "armeabi-v7a", "arm-linux-androideabi-clang3.5", cmake_vars=dict(ANDROID_ABI='armeabi-v7a with NEON', ANDROID_STL="c++_static")),
]

to use c++_static and clang toolchain.

And build it just with:

../opencv-3.4.2/platforms/android/build_sdk.py --ndk_path [path_to_ndk-r18-beta1] --sdk_path [path_to_sdk_25] --config my-ndk-config.py  ./build ../opencv-3.4.2

The output libraries sizes are huge when comparing with the ones downloaded from opencv releases.

The armeabi-v7a folder size is 178M.

Each library size is:

 13M    libopencv_calib3d.a
 29M    libopencv_core.a
 48M    libopencv_dnn.a
 10M    libopencv_features2d.a
4.4M    libopencv_flann.a
528K    libopencv_highgui.a
5.6M    libopencv_imgcodecs.a
 25M    libopencv_imgproc.a
7.7M    libopencv_ml.a
4.9M    libopencv_objdetect.a
6.5M    libopencv_photo.a
2.5M    libopencv_shape.a
8.6M    libopencv_stitching.a
1.7M    libopencv_superres.a
2.9M    libopencv_video.a
2.8M    libopencv_videoio.a
4.1M    libopencv_videostab.a

The armeabi-v7a folder for downloaded opencv Android release is only 28M, and each library size is:

1.9M    libopencv_calib3d.a
4.5M    libopencv_core.a
7.6M    libopencv_dnn.a
1.2M    libopencv_features2d.a
1.1M    libopencv_flann.a
 92K    libopencv_highgui.a
796K    libopencv_imgcodecs.a
5.0M    libopencv_imgproc.a
1.4M    libopencv_ml.a
644K    libopencv_objdetect.a
1.2M    libopencv_photo.a
420K    libopencv_shape.a
1.0M    libopencv_stitching.a
260K    libopencv_superres.a
476K    libopencv_video.a
312K    libopencv_videoio.a
580K    libopencv_videostab.a

I also trying to compile with -Oz flag and the size didn't change that much (maybe it will be valid when creating the final .so).

What am I missing here?


回答1:


There are a few ways to decrease the binary size:

  • using strip command to strip the debug symbols, e.g.

    <ndk-path>/arm64-v8a/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/aarch64-linux-android/bin/strip -g -S -d --strip-debug libopencv_dnn.a
    
  • using compiler option -Os

Please see the opencv official documents here: https://github.com/opencv/opencv/wiki/Compact-build-advice#results


Edit #1

The built-in gradle task yourapp:transformNativeLibsWithStripDebugSymbolForRelease will help you size down your final apk. So, you don't necessarily need to strip the debug symbols explicitly if your objective is the final apk since Android Studio 2.x.



来源:https://stackoverflow.com/questions/51784882/how-to-decrease-the-size-of-android-native-shared-libaries-so-files

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!