Android .so 文件压缩
精简动态符号表删除一个符号表项后 so 减小的体积为符号名字符串长度 1 Elfxx_Sym Elfxx_Half Elfxx_Word如果一个 so 的某些符号被其他 so 通过 dlsym 方式使用那么这些符号也应该保留在该 so 的导出符号中否则会导致运行时异常。使用 visibility 和 attribute 控制符号可见性可以通过给编译器传递 -fvisibilityVALUE 控制全局的符号可见性。visibility 是全局符号可见性开关attribute 方式是针对单个符号的可见性开关。只能控制变量或函数是否存在于动态符号表中即是否删除其动态符号表项而不会删除其实现体。default除非对变量或函数特别指定符号可见性所有符号都在动态符号表中这也是不使用 -fvisibility 时的默认值。hidden除非对变量或函数特别指定符号可见性所有符号在动态符号表中都不可见。CMake 项目的配置set(CMAKE_C_FLAGS “${CMAKE_C_FLAGS} -fvisibilityhidden”)set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -fvisibilityhidden”)ndk-build 项目的配置 LOCAL_CFLAGS -fvisibilityhidden针对单个变量或函数attribute((visibility(“hidden”)))int hiddenInt3;使用 static 关键字控制符号可见性当使用 static 表示“该函数或变量仅在本文件可见”时那么这个函数或变量就不会出现在动态符号表中但只会删除其动态符号表项而不会删除其实现体。使用 exclude libs 移除静态库中的符号它是传递给链接器的参数可以使依赖的静态库的符号在动态符号表中不存在。同样也是只能删除符号表项实现体仍然会存在于产生的 so 文件中。CMake 项目的配置set(CMAKE_SHARED_LINKER_FLAGS “${CMAKE_SHARED_LINKER_FLAGS} -Wl,–exclude-libs,ALL”)#使所有静态库中的符号都不被导出set(CMAKE_SHARED_LINKER_FLAGS “${CMAKE_SHARED_LINKER_FLAGS} -Wl,–exclude-libs,libabc.a”)#使 libabc.a 的符号都不被导出ndk-build 项目的配置LOCAL_LDFLAGS -Wl,–exclude-libs,ALL #使所有静态库中的符号都不被导出LOCAL_LDFLAGS -Wl,–exclude-libs,libabc.a #使 libabc.a 的符号都不被导出使用 version script 控制符号可见性version script 是传递给链接器的参数用来指定动态库导出哪些符号以及符号的版本。version script 支持通配符* 代表0个或者多个字符? 代表单个字符。比如 my*; 就代表所有以 my 开头的符号。有了通配符的支持配置 version script 会更加方便。version script 方式可以删除 __bss_start 这样的一些符号这是链接器默认加上的符号version script 方式优于 visibility 结合 attribute 的方式。同时使用了 version script 方式就不需要使用 exclude libs 方式控制依赖的静态库中的符号是否导出了。开启 version script 需要先编写一个文本文件用来指定动态库导出哪些符号。然后将文件的路径传递给链接器即可查看未优化 so 的导出符号表找到目标函数被修饰后的符号然后填写到 version_script.txt 中在 version_script.txt 中使用 extern 语法CMake 项目的配置 set(CMAKE_SHARED_LINKER_FLAGS “CMAKESHAREDLINKERFLAGS−Wl,−−version−script{CMAKE_SHARED_LINKER_FLAGS} -Wl,--version-scriptCMAKES​HAREDL​INKERF​LAGS−Wl,−−version−script{CMAKE_CURRENT_SOURCE_DIR}/version_script.txt”) #version_script.txt 与当前 CMakeLists.txt 同目录ndk-build 项目的配置 LOCAL_LDFLAGS -Wl,–version-script${LOCAL_PATH}/version_script.txt #version_script.txt 与当前 Android.mk 同目录移除无用代码开启 LTOLink Time Optimization 链接期优化LTO 能够在链接目标文件时检测出 DeadCode 并删除它们GCC 和 Clang 均支持 LTO。LTO 方式编译的目标文件中存储的不再是具体机器的指令而是机器无关的中间表示GCC 采用的是 GIMPLE 字节码Clang 采用的是 LLVM IR 比特码。如果使用 Clang编译参数和链接参数中都要开启 LTO否则会出现无法识别文件格式的问题NDK22 之前存在此问题。使用 GCC 的话只需要编译参数中开启 LTO 即可。如果项目工程依赖了静态库可以使用 LTO 方式重新编译该静态库那么编译动态库时就能移除静态库中的 DeadCode从而减小最终 so 的体积。经过测试如果使用 Clang链接器需要开启非 0 级别的优化LTO 才能真正生效。经过实际测试NDK 为 r16bO1 优化效果较差O2、O3 优化效果比较接近。CMake 项目的配置set(CMAKE_C_FLAGS “${CMAKE_C_FLAGS} -flto”)set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -flto”)set(CMAKE_SHARED_LINKER_FLAGS “${CMAKE_SHARED_LINKER_FLAGS} -O3 -flto”)ndk-build 项目的配置LOCAL_CFLAGS -fltoLOCAL_LDFLAGS -O3 -flto开启 GC sections这是传递给链接器的参数对无用的 section 进行回收。注意这里的 section 不是指最终 so 中的 section而是作为链接器的输入的目标文件中的 section。GC sections 参数通知链接器仅保留动态符号及 .init_array 等直接或者间接引用到的 section移除其他无用 section。链接器会把所有输入的目标文件的同类型的 section 进行合并组装出最终的 so 文件。编译器默认会把所有函数放到同一个 section 中把所有相同特点的数据放到同一个 section 中CMake 项目的配置set(CMAKE_C_FLAGS “${CMAKE_C_FLAGS} -fdata-sections -ffunction-sections”)set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -fdata-sections -ffunction-sections”)set(CMAKE_SHARED_LINKER_FLAGS “${CMAKE_SHARED_LINKER_FLAGS} -Wl,–gc-sections”)ndk-build 项目的配置LOCAL_CFLAGS -fdata-sections -ffunction-sectionsLOCAL_LDFLAGS -Wl,–gc-sections优化指令长度使用 Oz/Os 优化级别O0 表示不开启优化这种情况主要是为了便于调试以及更快的编译速度从 O1 到 O3优化程度越来越强。Clang 和 GCC 均提供了 Os 的优化级别其与 O2 比较接近但是优化了生成产物的体积。而 Clang 还提供了 Oz 优化级别在 Os 的基础上能进一步优化产物体积。CMake 项目的配置set(CMAKE_C_FLAGS “${CMAKE_C_FLAGS} -Oz”)set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -Oz”)ndk-build 项目的配置 LOCAL_CFLAGS -Oz如果项目中没有使用 C 的异常机制例如 try…catch 等可以通过禁用 C 的异常机制来减小 so 的体积。CMake 项目的配置 set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -fno-exceptions”)ndk-build 默认会禁用 C 的异常机制因此无需特意禁用。如果现有项目开启了 C 的异常机制说明确有需要需仔细确认后才能禁用。如果项目中没有使用 C 的 RTTI 机制例如 typeid 和 dynamic_cast 等可以通过禁用 C 的 RTTI 来减小 so 的体积。CMake 项目的配置 set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -fno-rtti”)ndk-build 默认会禁用 C 的 RTTI 机制因此无需特意禁用。如果现有项目开启了 C 的 RTTI 机制说明确有需要需仔细确认后才能禁用。so 仅被另外一个 so 动态依赖时可以将这些 so 合并为一个 so。可以在不修改项目源码的情况下在编译层面实现 so 的合并。可以删除部分导入导出动态符号表项可以删除部分 PLT 表项和 GOT 表项减少了依赖关系可以减轻优化的工作量由于链接器对导出符号拥有了更全的上下文信息LTO 优化也能取得更好的效果。当多个 so 以静态方式依赖了某个相同的库时可以考虑将此库提取成一个单独的 so原来的几个 so 改为动态依赖该 so。提取多 so 共同依赖库可以对不同 so 内的相同代码进行合并从而减小总的 so 体积。收益删除了大量的非必要导出符号从而提升了 so 的安全性。因为 .data .bss .text 等运行时占用内存的 section 减小了所以也能减小应用运行时的内存占用。如果优化过程中减少了 so 对外依赖的符号还可以加快 so 的加载速度。

相关新闻

ZenlessZoneZero-OneDragon:解放双手的绝区零全自动游戏助手终极指南

ZenlessZoneZero-OneDragon:解放双手的绝区零全自动游戏助手终极指南

ZenlessZoneZero-OneDragon:解放双手的绝区零全自动游戏助手终极指南 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon…

2026/8/2 12:07:31阅读更多 →
使用 Kiro AI IDE 小时实现全栈应用Admin系统

使用 Kiro AI IDE 小时实现全栈应用Admin系统

使用 Kiro AI IDE 小时实现全栈应用Admin系统 前言:为什么选择 Kiro AI IDE?作为一个写过几年 CRUD 的老程序员,我深知从零搭建一个 Admin 系统有多繁琐:前端要配路由、状态管理、UI 组件库,后端要写接口、连数据库、做…

2026/8/2 12:07:31阅读更多 →
Gemini 1.5 Flash长上下文模型实战:从成本解析到代码库、文档分析应用

Gemini 1.5 Flash长上下文模型实战:从成本解析到代码库、文档分析应用

1. 从“1块8读完三体”说起:我们到底在期待什么? 最近,谷歌AI扔下了一颗“性价比”炸弹,标题党们纷纷打出了“1块8读完3本《三体》”的噱头。这个数字乍一看确实抓人眼球,但作为一个在AI应用和成本优化上折腾了多年的老…

2026/8/2 12:05:29阅读更多 →
基于Seeed Studio XIAO RP2350的MicroPython嵌入式开发实战指南

基于Seeed Studio XIAO RP2350的MicroPython嵌入式开发实战指南

1. 项目概述:当RP2350遇上MicroPython如果你手头有一块Seeed Studio XIAO RP2350开发板,正琢磨着怎么让它快速动起来,而不是一头扎进复杂的C/C编译环境里,那么MicroPython绝对是你应该优先考虑的选择。我最近花了不少时间把玩这块…

2026/8/2 13:36:29阅读更多 →
华硕笔记本终极轻量化控制工具:3步告别臃肿,重获系统性能

华硕笔记本终极轻量化控制工具:3步告别臃肿,重获系统性能

华硕笔记本终极轻量化控制工具:3步告别臃肿,重获系统性能 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivoboo…

2026/8/2 13:36:29阅读更多 →
FastAPI异步写入Elasticsearch实战:从阻塞到高性能数据入库

FastAPI异步写入Elasticsearch实战:从阻塞到高性能数据入库

1. 从同步阻塞到异步写入:为什么FastAPIElasticsearch是绝配如果你正在用Python的FastAPI框架开发后端服务,并且数据需要写入Elasticsearch,那么你很可能已经遇到了一个经典问题:当数据量稍大,或者写入请求并发稍高时&…

2026/8/2 13:36:29阅读更多 →
专科计算机逆袭指南:十年实战经验,从基础到一线开发者的成长路线

专科计算机逆袭指南:十年实战经验,从基础到一线开发者的成长路线

1. 从“专科计算机”到“一线开发者”:我的十年真实轨迹“专科生学计算机,到底有没有出路?”这个问题,我用了整整十年去回答。十年前,当我拿着专科录取通知书,看着“计算机应用技术”这个专业时&#xff0c…

2026/8/2 13:36:29阅读更多 →
DeepTutor终极指南:如何让AI成为你的24小时私人学习导师

DeepTutor终极指南:如何让AI成为你的24小时私人学习导师

DeepTutor终极指南:如何让AI成为你的24小时私人学习导师 【免费下载链接】DeepTutor DeepTutor: Lifelong Personalized Tutoring. https://deeptutor.info/. 项目地址: https://gitcode.com/GitHub_Trending/dee/DeepTutor DeepTutor是一个革命性的开源AI学…

2026/8/2 13:36:28阅读更多 →
从调音量到声音管理:四层音量模型与系统级实践指南

从调音量到声音管理:四层音量模型与系统级实践指南

1. 从“调音量”到“声音管理”:一个被低估的日常技能我们每天都在和音量打交道。无论是用手机刷短视频、在电脑上开视频会议,还是连接蓝牙音箱听音乐,手指滑动那个小小的滑块,或者按下实体按键,几乎是下意识的动作。大…

2026/8/2 13:34:28阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:10阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/2 0:00:12阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/2 0:00:13阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:10阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/2 0:00:12阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/2 0:00:13阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/2 1:29:34阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/2 2:32:55阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/2 2:09:20阅读更多 →