Android L 64位相容32 應用程式的認識

2021-07-30 09:00:17 字數 1165 閱讀 3835

關於android l 64位系統相容32位應用的實現的簡單分析。

android l 的zygote程序的實現不同於之前的版本,除了有zygote程序之外還有zygote64程序。

在init.zygote32_64.rc中有明確指出:

在不考慮有32/64相容庫的情況下,乙個程序如果要正確執行,就必須從可執行程式入口開始到所有使用的庫都保持32/64位的一致性。

因為zygote程序是所有第三方應用程式的父程序,所以可以認為,如果應用程式是32位的,那沒他的父程序也肯定是32位,換句話說,如果需要啟動某個32位的應用,那麼肯定是通過32位的zygote程序fork出來的。

這個一點可以在activitymanagerservice上得到驗證。

activitymanagerservice中startprocesslocked 方法實現啟動應用,主要通過process中的startviazygote方法,這個方法最終是向相應的zygote程序發出fork的請求

zygotesendargsandgetresult(openzygotesocketifneeded(abi), argsforzygote);

其中openzygotesocketifneeded(abi)會根據abi的型別,選擇不同的zygote的socket監聽的埠,在之前的init檔案中可以看到

zygote32位監聽的埠就是--socket-name=zygote

另外乙個就是--socket-name=zygote_secondary

因此可以證實,之前的猜測,即32應用進由32位zygote程序fork出來,64位應用程序由64zygote程序fork出來。

這個值由packagemanagerservice在做scanpackageli的時候決定,具體這個值的得出有乙個公式化的過程,主要就是判斷這個apk有沒有使用native的庫,如果使用了,那就看使用了的是32位的還是64位的,另外還要看系統支援的是32位還是64位的。

根據這些因素就可以決定這個apk是應該是32位的還是64位的。

以上就是android l 64位系統相容32位應用的基本實現過程。

另外記錄一點,在原始碼環境下如果要prebuilt第三方的so,如果是32位的需要專門標註

local_multilib := 32

以此告訴編譯系統so位32位,防止編譯到64位下去。

****:

Android L 64位相容32 應用程式的認識

關於android l 64位系統相容32位應用的實現的簡單分析。android l 的zygote程序的實現不同於之前的版本,除了有zygote程序之外還有zygote64程序。在init.zygote32 64.rc中有明確指出 在不考慮有32 64相容庫的情況下,乙個程序如果要正確執行,就必須...

64位ubuntu 相容32位

首先要開啟64位系統對32位的支援 第一步 確認64為架構的核心 dpkg print architecture 輸出 adm64 說明已擁有64位架構核心。第二步 確認開啟了多架構支援功能 dpkg print foreign architectures 輸出 i386 說明已開啟,如果沒有需要手...

android64位機子相容32位 so庫檔案

猴子在呼叫高德地圖的時候,遇到乙個作業系統相容問題,異常堆疊說是找不到so庫檔案,猴子就不懂了,明明有他說的那個檔案。解決方案也很簡單,在build.gradle中加上,這句話的意思大概就是,告訴程式載入如下的so檔案 defaultconfig 這時會報錯,因為gradle的配置中,並不知道是否要...