Android NDK之Strip裁减so库
1.Strip基本介紹
strip:
在類(lèi)Unix和Unix的操作系統(tǒng)中,strip程序可對(duì)可執(zhí)行二進(jìn)制程序和對(duì)象文件中,刪除不必要的信息,從而帶來(lái)更好的性能和減少磁盤(pán)空間的使用。“不必要的信息”指的是正常執(zhí)行功能過(guò)程中,不需要的二進(jìn)制信息,比方調(diào)試和符號(hào)信息。但該命令裁剪的程度,取決于開(kāi)發(fā)者對(duì)這部分代碼的具體實(shí)現(xiàn)。
此外,使用strip可提高二進(jìn)制文件在逆向工程中的安全性。如果沒(méi)有二進(jìn)制文件的信息和對(duì)象的名稱(chēng),分析它將更加困難
常用的strip 命令:
- strip - s xxx.so : 移除所有符號(hào)信息(會(huì)覆蓋原有帶符號(hào)表的so)
- strip - S xxx.so: 移除調(diào)試符號(hào)信息
- strip - s xxx.so -o yyy.so: 移除所有符號(hào)信息,裁減好后,輸出指定名字的so
不同架構(gòu)的strip
在Android 手機(jī)中 cpu 架構(gòu)是各不相同的,因此不同架構(gòu)下要使用各自的strip 裁減對(duì)應(yīng)的so庫(kù)。
這里介紹下,主流適配是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
簡(jiǎn)單介紹完strip命令后,還得先了解下符號(hào)表。
2.符號(hào)表(Symbol table):
在計(jì)算機(jī)科學(xué)中,符號(hào)表(Symbol table)是語(yǔ)言翻譯程序(如編譯器或解釋器)所使用的數(shù)據(jù)結(jié)構(gòu),其中程序源代碼中的每個(gè)標(biāo)識(shí)符(即符號(hào))都與源代碼中的聲明或外觀相關(guān)的信息相關(guān)聯(lián)。換句話(huà)說(shuō),符號(hào)表的條目存儲(chǔ)與條目對(duì)應(yīng)符號(hào)相關(guān)的信息。
在這里插入符號(hào)表的實(shí)際使用:
- 在android開(kāi)發(fā)中,集成了bugly 異常上報(bào)的小伙伴,可能比較熟悉。為了定位每個(gè)版本中出現(xiàn)的native crash的位置,應(yīng)該上傳對(duì)應(yīng)版本的符號(hào)表(即帶有符號(hào)表的so庫(kù))。
- 使用ndk-stack 處理native crash ,也是需要使用到帶符號(hào)表的so庫(kù)。
3.使用Strip裁減so庫(kù)
拿到對(duì)應(yīng)架構(gòu)的so庫(kù),比如這里是arm64-v8a的so庫(kù)進(jìn)行 移除全部符號(hào)表 ,指定輸出新的so庫(kù)。
先知道arm64-v8a對(duì)應(yīng)的strip 所在目錄,執(zhí)行以下命令:
效果如下圖:
這里插入點(diǎn)小知識(shí):在android studio中通過(guò)c++代碼編譯出strip 的so庫(kù),可以在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/
總結(jié)
以上是生活随笔為你收集整理的Android NDK之Strip裁减so库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Cadence OrCAD/PSpice
- 下一篇: 南邮Android实验报告二:安卓网络编