Android64bit的一些相容性分析
Android 64 bit系統的一些相容性分析
0x0:前言
Android L之後android開始了支援64bit的系統,現在64位的手機越來越多,基本上現在出的新機都是64位的了,所以64位將會是一個趨勢,但是對於對於開發者來說,64位android你真的瞭解麼?64位系統是如何無縫相容32位app的?
0x1:32位相容分析
首先在init.zygote32_64.rc裡面有這兩條開機啟動的服務
service zygote /system/bin/app_process32 -Xzygote /system/bin –zygote –start-system-server –socket-name=zygote
service zygote_secondary /system/bin/app_process64 -Xzygote /system/bin –zygote –socket-name=zygote_secondary
這兩個程式在系統中就是傳說中的zygote程式,所有程式的孵化器,zygote對應app_proccess32,zygote64對應app_proccess64
顧名思義,android所有的應用程式都是fork zygote而來的
- 那麼,當我們啟動一個app時,系統是如何選擇執行32位模式還是64位模式的,為什麼有些app的父程式是zygote,有些是zygote64呢?*
通過看系統原始碼,從系統啟動一個app開始,可以發現系統啟動一個應用是通過ActivityManagerService中startProcessLocked方法,主要通過Process中的startViaZygote方法,這個方法最終是向相應的zygote程式發出fork的請求 zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), argsForZygote);
其中,openZygoteSocketIfNeeded(abi)會根據abi的型別,選擇不同的zygote的socket監聽埠。
zygote32位監聽的埠就是–socket-name=zygote
zygote64就是–socket-name=zygote_secondary
這個abi就是決定該app是fork zygote 還是fork zygote64,這兩種模式就決定該app執行在何種環境。
於是,我們繼續跟蹤abi是從哪裡傳過來的,發現這個引數在ApplicationInfo的primaryCpuAbi中決定。
而這個值是PackageManagerService在scanPackageLI的時候傳進來的。
最終,可以發現這個值是由apk的native 庫決定的,可以得出一個判斷邏輯:
如果apk中的native庫中含有arm64-v8a,則以64位的模式執行,fork zygote64
如果沒有,則看有沒有armeabi-v7a,armeabi這兩個,如果有,則以32位模式執行,fork zygote
如果apk中這三個庫都沒有,則預設以64位模式執行。
0x2:結論:
**對於android開發者,我們應該要知道些什麼呢?
**
1、64位系統本來是為了更快地執行指令,因此,如果我們想提升app在64位機器執行的效率,編譯so的時候最好把arm64-v8a編譯出來,在Application.mk裡面加上APP_ABI = APP_ABI := armeabi armeabi-v7a arm64-v8a,當然,這個會對包size有一定的影響。
2、如果開發者考慮更多的是相容性的話,特別是引起第三方的sdk的時候,如果sdk沒有arm64-v8的庫引入來,那麼就最好不要把 arm64-v8a編譯進去,否則在64位機器會出現一些問題,比如:
java.lang.UnsatisfiedLinkError: dlopen failed: “/data/app/xxx.so” is 32-bit instead of 64-bit
3、64位和32位執行環境的差異:
動態連結庫查詢路徑:
32位的環境是LD_LIBRARY_PATH=/vendor/lib:/system/lib;
64位的環境是LD_LIBRARY_PATH=/vendor/lib64:/system/lib64;
因此,在編寫native層程式碼的時候,如果有一些程式碼硬編碼了lib裡面的so路徑的時候,比如硬編碼了/system/lib/libc.so 這個路徑,在64位執行環境執行就會出錯
參考文章:
https://coolpers.github.io/android/64bit/32bit/2015/10/14/android-64bit-32bit-compatibility.html
http://androidxref.com/ 檢視系統原始碼
相關文章
- react vue 在移動端的相容性問題和一些小細節ReactVue
- lodash原始碼分析之資料型別獲取的相容性原始碼資料型別
- eventlet 之 monkeypatch 帶來的若干相容性問題例項分析
- 一些JDK自帶的效能分析利器JDK
- 對於隨機數的一些分析隨機
- 傲嬌的IOS 相容性iOS
- cephmonitor功能的相容性管理
- shell 的一些實用 demo 和 技巧分析
- 關於Spark中RDD的設計的一些分析Spark
- 程式相容性
- 相容性(js)JS
- 一些常見的重置密碼漏洞分析整理密碼
- 在你編碼之前需要分析的一些問題
- 檢測包相容性的方法
- 如何解決WebSocket的相容性Web
- Octave和matlab的相容性Matlab
- RichFaces editor的相容性問題
- Goroutine 和 Channel 的的使用和一些坑以及案例分析Go
- 2012需要分析的一些技術(1)
- duwamish7的一些程式碼分析總結 (轉)
- js日期物件相容性的處理JS物件
- 關於資料庫事務和鎖的一些分析資料庫
- MYSQL sql執行過程的一些跟蹤分析(一)MySql
- 經驗篇:對商業分析的一些思考和感悟
- 前端監控 SDK 的一些技術要點原理分析前端
- 8.3現有計算機應用的一些分析2計算機
- 對尤拉計劃427題(n-序列) 的一些分析
- Oracle分析表工具DBMS_STATS命令的一些總結Oracle
- node 模組引入與其他語言思路相通的一些分析
- 關於查詢轉換的一些簡單分析(一)
- 關於查詢轉換的一些簡單分析(二)
- 關於查詢轉換的一些簡單分析(三)
- 瀏覽器相容性瀏覽器
- PostgreSQLOracle相容性之NUMTODSINTERVALSQLOracle
- PostgreSQLOracle相容性-synonym匿名SQLOracle
- CSS相容性詳解CSS
- JAVASCRIPT相容性問題JavaScript
- ajax除錯相容性除錯