android - 微信的安裝包在只編譯了armeabi,沒有armeabi-v7a,arm64-v8a,x86是如何運(yùn)行在各種處理器的手機(jī)上的?
問題描述
我寫的程序里面編譯了armeabi,armeabi-v7a,arm64-v8a,x86四種so文件,我想通過刪除so文件的方式減小APK體積,但是刪掉后部分機(jī)型的部分功能會(huì)報(bào)錯(cuò),然后發(fā)現(xiàn)微信只編譯了armeabi一種so文件,沒有armeabi-v7a,arm64-v8a,x86是如何運(yùn)行在各種處理器的手機(jī)上的?
問題解答
回答1:因?yàn)閍rmeabi支持在 armeabi,armeabi-v7a,arm64-v8a下運(yùn)行,也支持部分x86。而市面上基本沒有mips架構(gòu)的手機(jī),所以理論上一個(gè)armeabi 就支持所有的手機(jī)了。armeabi運(yùn)行在v7 v8 下只是效率會(huì)有偏差。
可以看這個(gè)關(guān)于Android so文件你所需要了解的
回答2:所有的x86/x86_64/armeabi-v7a/arm64-v8a設(shè)備都支持armeabi架構(gòu)的.so文件,因此似乎移除其他ABIs的.so文件是一個(gè)減少APK大小的好技巧。但事實(shí)上并不是:這不只影響到函數(shù)庫的性能和兼容性。
x86設(shè)備能夠很好的運(yùn)行ARM類型函數(shù)庫,但并不保證100%不發(fā)生crash,特別是對(duì)舊設(shè)備。64位設(shè)備(arm64-v8a, x86_64, mips64)能夠運(yùn)行32位的函數(shù)庫,但是以32位模式運(yùn)行,在64位平臺(tái)上運(yùn)行32位版本的ART和Android組件,將丟失專為64位優(yōu)化過的性能(ART,webview,media等等)。
回答3:有可能是動(dòng)態(tài)加載的。
回答4:首先,armeabi能夠兼容其他架構(gòu)armeabi-v7a,arm64-v8a,x86。其次,你只是看到了微信armeabi目錄而已,這個(gè)目錄下還可以放置其他架構(gòu)的SO文件,再通過代碼實(shí)現(xiàn)選擇加載哪一個(gè)架構(gòu)的SO文件。
