android - 如何减小 android 本机共享库(.so 文件)的大小?
问题描述
我正在尝试使用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时它是有效的)。
我在这里想念什么?
解决方案
有几种方法可以减小二进制大小:
使用
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,则不一定需要显式删除调试符号。
推荐阅读
- python - 是否可以找到或匹配两个具有不同特殊字符的名称 django
- header - 如何让 testcafe 复制和使用与实际网站相同的标题?
- c# - 单元测试以检查未使用的属性
- api - 使用 Katalon Studio 进行 API 自动化测试 - 自动化 OAuth 2.0 授权令牌生成过程
- laravel - 如何使用vue js数据表(父子)使数据升序/降序
- python - 修改函数参数是错误的做法吗?
- fullcalendar - FullCalendar 事件可编辑回调
- docker - 如果使用除默认端口 80 之外的任何其他端口,则无法在 Docker 上运行应用程序
- node.js - 在节点中使用 puppeteer 的 HTML-PDF
- python - 如何根据另外两列的值在数据框中创建一列?