如何减少android native共享库(.so文件)的大小? [英] How to decrease the size of android native shared libaries (.so files)?

查看:532
本文介绍了如何减少android native共享库(.so文件)的大小?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 ndk-18-beta1 c ++ _ static 为Android构建opencv(版本3.4.2),因为该ndk不支持 gnustl_static .

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.

我仅使用 armeabi-v7a 体系结构创建了ndk-config.py文件:

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")),
]

使用 c ++ _ static clang 工具链.

并使用以下代码进行构建:

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

与从opencv发行版下载的输出库相比,输出库的大小巨大.

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

armeabi-v7a文件夹大小为178M.

The armeabi-v7a folder size is 178M.

每个库的大小为:

 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

下载的opencv Android版本的armeabi-v7a文件夹只有28M, 每个库的大小为:

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

我还尝试使用-Oz标志进行编译,并且大小没有太大变化(也许在创建最终的.so时有效).

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).

我在这里想念什么?

推荐答案

有几种减小二进制大小的方法:

There are a few ways to decrease the binary size:

  • 使用strip命令剥离调试符号,例如

  • 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

  • 使用编译器选项-Os

    请在此处查看opencv官方文档: https://github .com/opencv/opencv/wiki/Compact-build-advice#results

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

    编辑#1

    内置gradle任务yourapp:transformNativeLibsWithStripDebugSymbolForRelease将帮助您缩小最终apk的大小.因此,如果您的目标是自Android Studio 2.x以来的最终apk,则不必显式剥离调试符号.

    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.

    这篇关于如何减少android native共享库(.so文件)的大小?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆