Android NDK之Strip裁减so库
1.Strip基本介紹
strip:
在類Unix和Unix的操作系統中,strip程序可對可執行二進制程序和對象文件中,刪除不必要的信息,從而帶來更好的性能和減少磁盤空間的使用。“不必要的信息”指的是正常執行功能過程中,不需要的二進制信息,比方調試和符號信息。但該命令裁剪的程度,取決于開發者對這部分代碼的具體實現。
此外,使用strip可提高二進制文件在逆向工程中的安全性。如果沒有二進制文件的信息和對象的名稱,分析它將更加困難
常用的strip 命令:
- strip - s xxx.so : 移除所有符號信息(會覆蓋原有帶符號表的so)
- strip - S xxx.so: 移除調試符號信息
- strip - s xxx.so -o yyy.so: 移除所有符號信息,裁減好后,輸出指定名字的so
不同架構的strip
在Android 手機中 cpu 架構是各不相同的,因此不同架構下要使用各自的strip 裁減對應的so庫。
這里介紹下,主流適配是armv7和armv8 的ndk位置:
- armv8的strip位于:xxx\sdk\ndk\22.1.7171670\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-strip.exe
- armv7的strip 位于:xxx\sdk\ndk\22.1.7171670\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-strip.exe
簡單介紹完strip命令后,還得先了解下符號表。
2.符號表(Symbol table):
在計算機科學中,符號表(Symbol table)是語言翻譯程序(如編譯器或解釋器)所使用的數據結構,其中程序源代碼中的每個標識符(即符號)都與源代碼中的聲明或外觀相關的信息相關聯。換句話說,符號表的條目存儲與條目對應符號相關的信息。
在這里插入符號表的實際使用:
- 在android開發中,集成了bugly 異常上報的小伙伴,可能比較熟悉。為了定位每個版本中出現的native crash的位置,應該上傳對應版本的符號表(即帶有符號表的so庫)。
- 使用ndk-stack 處理native crash ,也是需要使用到帶符號表的so庫。
3.使用Strip裁減so庫
拿到對應架構的so庫,比如這里是arm64-v8a的so庫進行 移除全部符號表 ,指定輸出新的so庫。
先知道arm64-v8a對應的strip 所在目錄,執行以下命令:
效果如下圖:
這里插入點小知識:在android studio中通過c++代碼編譯出strip 的so庫,可以在cmake-list中添加:
#set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s") #set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")參考教程:
- http://blog.itpub.net/69912579/viewspace-2759124/
總結
以上是生活随笔為你收集整理的Android NDK之Strip裁减so库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cadence OrCAD/PSpice
- 下一篇: 小米米兔机器人的发展史_面向教育!小米推