【问题标题】:How to decrease the size of android native shared libaries (.so files)?如何减小 android 本机共享库(.so 文件)的大小?
【发布时间】:2019-01-17 23:21:46
【问题描述】:

我正在尝试使用 ndk-18-beta1c++_static 为 Android 构建 opencv(版本 3.4.2),因为此 ndk 不支持 gnustl_static 了。

我只用 armeabi-v7a 架构创建了我的 ndk-config.py 文件:

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

使用 c++_staticclang 工具链。

然后构建它:

../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 版本下载的库相比,输出库的大小非常庞大。

armeabi-v7a 文件夹大小为 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, 每个库的大小是:

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 时它是有效的)。

我在这里错过了什么?

【问题讨论】:

    标签: android opencv android-ndk ndk-build


    【解决方案1】:

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

    • 使用strip 命令去除调试符号,例如

      <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


    编辑#1

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

    【讨论】:

    • 在使用 build_sdk.py 脚本构建时有什么方法可以执行 strip 命令?我在那里没有找到这样的选项。
    • 如果您关心的是最小化最终 apk 的大小,那么实际上所有这些 .so 都会被自动剥离。
    • 我的意思是,当你构建你的 apk 时,这是构建系统精简所有 .so 的一步
    • 我担心静态库的大小(libopencv_**.a 文件),因为我不明白为什么会有大小差异。我使用静态库只有一个最终的.so。当然,我不想增加最终的 .so/.apk 大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    相关资源
    最近更新 更多