发布网友
共1个回答
热心网友
在Android L发布之后,系统开始支持位系统,如今位手机日益普及,新机型基本均为位。然而,对于开发者而言,真正理解位Android系统,并清楚其如何无缝兼容32位应用,显得尤为重要。
在Android系统的初始化过程中,init.zygote32_.rc文件中包含了两个开机启动的服务:zygote和zygote_secondary。这两个进程,即zygote和zygote_secondary,分别对应于app_process32和app_process,是所有应用进程的孵化器。
所有应用进程都是通过fork zygote来启动的。系统从启动一个应用开始,通过ActivityManagerService的startProcessLocked方法,主要通过Process中的startViaZygote方法完成。这个方法会最终向相应的zygote进程发送fork请求。具体而言,openZygoteSocketIfNeeded(abi)会根据abi的类型,选择不同的zygote的socket监听端口。zygote32位监听的端口为zygote,而zygote监听的端口为zygote_secondary。abi的类型决定了应用是fork zygote还是fork zygote,这进而决定了应用运行于何种环境。
最终,决定abi类型的是apk的native库。如果apk中包含arm-v8a库,则应用将以位模式执行,fork zygote。如果不存在arm-v8a库,但存在armeabi-v7a或armeabi库,则应用将以32位模式执行,fork zygote。若apk中这三个库均不存在,则默认以位模式执行。
对于Android开发者而言,了解位系统的关键在于兼容性。为了优化位机器上的应用性能,编译so时应包含arm-v8a库,但若侧重于兼容性,特别是涉及到第三方SDK时,避免引入arm-v8a库以避免在位机器上出现java.lang.UnsatisfiedLinkError等问题。此外,位和32位运行环境存在差异,例如动态链接库查找路径不同:32位环境为LD_LIBRARY_PATH=/vendor/lib:/system/lib;位环境为LD_LIBRARY_PATH=/vendor/lib:/system/lib。编写native层代码时,若硬编码了lib内的so路径,如/system/lib/libc.so,这在位运行环境下可能引发错误。
综上所述,对于开发者而言,重要的是理解位与32位的兼容性,以及在编译时如何选择合适的abi类型,以确保应用在不同架构的设备上均能良好运行。