http://blog.csdn.net/louyong0571/article/details/44223481
關於Android L 64位系統兼容32位應用的實現的簡單分析。
Android L 的zygote進程的實現不同於之前的版本,除了有zygote進程之外還有zygote64進程。
在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
...
------------------------------------------------------------------------------------------------------------------------
其中app_process32 和app_process64 就是zygote進程的可執行程序,啟動后會改名成zygote。
顧名思義,zygote32即app_process32是一個運行在32位的進程,它所連接的庫也都是32位的。而zygote64就是運行在64位的進程,它所連接的庫都是64位的。
在不考慮有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出來。
那么之前說的abi參數就是決定應用是32還是64位的關鍵所在,跟蹤這個參數,發現這個參數在ApplicationInfo的primaryCpuAbi中決定,
這個值由PackageManagerService在做scanPackageLI的時候決定,具體這個值的得出有一個公式化的過程,主要就是判斷這個apk有沒有使用native的庫,如果使用了,那就看使用了的是32位的還是64位的,另外還要看系統支持的是32位還是64位的。
根據這些因素就可以決定這個apk是應該是32位的還是64位的。
以上就是Android L 64位系統兼容32位應用的基本實現過程。
另外記錄一點,在源碼環境下如果要PREBUILT第三方的so,如果是32位的需要專門標注
LOCAL_MULTILIB := 32
以此告訴編譯系統so位32位,防止編譯到64位下去。
來源 http://stackoverflow.com/questions/27712921/how-to-use-32bit-native-libraries-on-64-bit-android-l-platform