2015-11-24 60 views
3

我有一個iOS應用程序,它使用了很多不同的靜態庫和框架(也有一些第三方)。我希望能夠將靜態庫,框架&應用程序代碼的貢獻歸因於最終的應用程序二進制大小。 我遇到了一個先前問過類似的問題在這裏: Find size contributed by each external library on iOSiOS應用程序的二進制大小

'fullofsquirells'的答案是相關的,是很好的解釋。但是,使用鏈接映射文件的方法,如果我加起來所有部分或所有符號的大小,我沒有得到最終的二進制大小。

更多詳細信息: 我的iOS應用程序的最終ipa約爲50 MB。未壓縮的應用程序有效載荷大約爲90 MB, 50 MB的代碼和40 MB的資源。 50 MB二進制代碼包含兩個對應於armv7和arm64的二進制片。我可以使用「lipo」獲得單獨的切片,每個切片的大小大致相似,分別爲23 MB(armv7)和27 MB(arm64)。

使用linkmap方法,我可以從各個部分以及每個切片的符號中獲取大小(請注意,每個切片都有一個單獨的鏈接文件)。問題是如果我總結所有部分的大小或所有不符合該片的應用程序二進制大小的符號。

假如我有符號&章節arm64在symbols_arm64.txt & sections_arm64.txt,則:

貓symbols_arm64.txt | grep的-e 「0X」 | awk'{print $ 2}'| xargs printf「%d \ n」| paste -sd + - | bc

cat sections_arm64.txt | grep -e「0x」| awk'{print $ 2}'| xargs printf「%d \ n」| paste -sd + - | bc

這兩個返回值都接近〜15 MB。我期待這兩個將會更接近27 MB。

什麼是造成失蹤12 MB?

+0

我面臨同樣的問題。你有沒有發現哪些對失蹤MB有貢獻? –

+0

好的。對我來說,這也是LINKEDIT部分。 –

回答

1

除鏈接地圖文件第二部分列出的數據和文本部分外,還有一部分稱爲「linkEdit」部分。 本節由DYLD使用。有關LinkEdit的詳細信息,請訪問:http://newosxbook.com/articles/DYLD.html 可以通過將DEPLOYMENT_POSTPROCESSING設置爲「YES」來解決此問題。這將剝離掉所有的符號,除此之外還會從最終的二進制文件中刪除LinkEdit部分。事實上,當應用程序大小是一個問題時,建議在發佈二進制文件中這樣做。有關這方面的更多信息存在於Apple技術說明中:https://developer.apple.com/library/mac/technotes/tn2004/tn2123.html