java armeabi_Android中的armeabi、armeabi-v7a、arm64-v8a及x86的详解
預備知識
一. lib和libs
放在lib中的是被reference的,放在libs中的是被include的。
放在libs中的文件會自動被編輯器所include。所以不要把API放到libs里去。
lib的內容是不會被打包到APK中,libs中的內容是會被打包進APK中
二. .so庫
NDK編譯出來的動態鏈接庫。
一些重要的加密算法或者核心協議一般都用c寫然后給java調用。這樣可以避免反編譯后查看到應用的源碼。
三. .so庫該如何存放
放置 .so 文件的正確姿勢其實就兩句話:
? 為了減小 apk 體積,只保留 armeabi 和 armeabi-v7a 兩個文件夾,并保證這兩個文件夾中 .so 數量一致
? 對只提供 armeabi 版本的第三方 .so,原樣復制一份到 armeabi-v7a 文件夾
存放so的規則:
你應該盡可能的提供專為每個ABI優化過的.so文件,但要么全部支持,要么都不支持:你不應該混合著使用。你應該為每個ABI目錄提供對應的.so文件。
四. libs下armeabi等的作用是什么
存放.so庫,主要針對不同的設備兼容,也可以說是專門針對不同Android手機下CPU架構的兼容。
Android 設備的CPU類型(通常稱為”ABIs”)
架構介紹
早期的Android系統幾乎只支持ARMv5的CPU架構,后面發展到支持七種不同的CPU架構:ARMv5,ARMv7 (從2010年起),x86 (從2011年起),MIPS (從2012年起),ARMv8,MIPS64和x86_64 (從2014年起),每一種都關聯著一個相應的ABI。
應用程序二進制接口(Application Binary Interface)定義了二進制文件(尤其是.so文件)如何運行在相應的系統平臺上,從使用的指令集,內存對齊到可用的系統函數庫。在Android 系統上,每一個CPU架構對應一個ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64。
armeabi-v7a: 第7代及以上的 ARM 處理器。2011年以后生產的大部分Android設備都使用它.
arm64-v8a: 第8代、64位ARM處理器,很少設備,三星 Galaxy S6是其中之一。
armeabi: 第5代、第6代的ARM處理器,早期的手機用的比較多。
x86: 平板、模擬器用得比較多。
x86_64: 64位的平板。
總結
如果項目只包含了 armeabi,那么在所有Android設備都可以運行;
如果項目只包含了 armeabi-v7a,除armeabi架構的設備外都可以運行;
如果項目只包含了 x86,那么armeabi架構和armeabi-v7a的Android設備是無法運行的; 如果同時包含了 armeabi, armeabi-v7a和x86,所有設備都可以運行,程序在運行的時候去加載不同平臺對應的so,這是較為完美的一種解決方案,同時也會導致包變大。
最后,如果我們只想支持armeabi-v7a,那么需要在gradle中配置
defaultConfig {
ndk {
abiFilters "armeabi-v7a"
}
}
因為默認情況下,打包后會自動生成armeabi 到 x86的所有文件夾。這就有可能導致一些x86的設備因為在x86文件夾下找不到so文件而崩潰。
總結
以上是生活随笔為你收集整理的java armeabi_Android中的armeabi、armeabi-v7a、arm64-v8a及x86的详解的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: java代理的学习,通过类实现接口来实现
- 下一篇: iOS开发-自动隐藏键盘及状态栏
