我正在尝试使用 ndk-18-beta1 和 c ++ _ 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 ++ _ static 和 clang 工具链。
并使用以下代码进行构建:
../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时有效)。
我在这里想念什么?
答案 0 :(得分: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,则不必显式剥离调试符号。
答案 1 :(得分:0)
我在blog中包含了大多数选项,最快的方法是使用OpenCV makefile在博客的底部。
cmake
-D WITH_CUDA=OFF \
-D WITH_MATLAB=OFF \
-D BUILD_ANDROID_EXAMPLES=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_SHARED_LIBS=ON \
-D BUILD_opencv_objdetect=OFF \
-D BUILD_opencv_video=OFF \
-D BUILD_opencv_videoio=OFF \
-D BUILD_opencv_features2d=OFF \
-D BUILD_opencv_flann=OFF \
-D BUILD_opencv_ml=OFF \
-D BUILD_opencv_photo=OFF \
-D BUILD_opencv_python=OFF \
-D BUILD_opencv_shape=OFF \
-D BUILD_opencv_stitching=OFF \
-D BUILD_opencv_superres=OFF \
-D BUILD_opencv_ts=OFF \
-D BUILD_opencv_videostab=OFF \
-D BUILD_opencv_highgui=ON \
-D BUILD_opencv_imgproc=ON \
..