Android 64 bit的一些兼容性分析

简介: Android 64 bit系统的一些兼容性分析 0x0:前言 Android L之后android开始了支持64bit的系统,现在64位的手机越来越多,基本上现在出的新机都是64位的了,所以64位将会是一个趋势,但是对于对于开发者来说,64位android你真的了解么?64位系统是如何无缝兼容32位app的? 0x1:32位兼容分析 *首先在init.

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
image1
顾名思义,android所有的应用进程都是fork zygote而来的
image2
image3

  • 那么,当我们启动一个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/ 查看系统源码

相关文章
|
1月前
|
安全 Shell Android开发
Android系统 init.rc sys/class系统节点写不进解决方案和原理分析
Android系统 init.rc sys/class系统节点写不进解决方案和原理分析
61 0
|
1月前
|
安全 Android开发
Android13 Root实现和原理分析
Android13 Root实现和原理分析
179 0
|
1月前
|
Java Android开发
Android系统 获取用户最后操作时间回调实现和原理分析
Android系统 获取用户最后操作时间回调实现和原理分析
45 0
|
9天前
|
Java Android开发 iOS开发
深入探讨移动操作系统的性能优化:安卓与iOS的对比分析
在现代移动设备中,操作系统的性能优化至关重要。本文从系统架构、内存管理、电池续航和应用程序运行效率等多个维度,深入探讨了安卓(Android)和iOS两大主流移动操作系统的优化策略及其实际效果,旨在为开发者和用户提供更清晰的了解和选择依据。
19 0
|
1月前
|
存储 Java Android开发
Android系统 设置第三方应用为默认Launcher实现和原理分析
Android系统 设置第三方应用为默认Launcher实现和原理分析
146 0
|
6天前
|
安全 Android开发 iOS开发
探索Android与iOS开发的差异:平台特性与用户体验的对比分析
在移动应用开发的广阔天地中,Android和iOS两大阵营各据一方。本文将深入探讨这两个操作系统在开发环境、编程语言、用户界面设计及市场分布等方面的主要区别。通过比较分析,我们将揭示各自平台的特有优势,并讨论如何根据目标受众和业务需求选择适合的开发平台。
|
9天前
|
搜索推荐 安全 Android开发
安卓与iOS操作系统的对比分析
在移动设备市场上,安卓和iOS操作系统一直是主要竞争对手。本文将从用户界面、应用生态系统、定制化程度和安全性等方面对安卓和iOS进行对比分析,并探讨两者在不同场景下的适用性。
|
1月前
|
Java Linux 调度
Android 打包分析
Android 打包分析
26 2
|
15天前
|
安全 Android开发 iOS开发
安卓与iOS操作系统的比较分析
【6月更文挑战第5天】本文将深入探讨安卓和iOS两大主流操作系统的特点、优势和劣势。通过对比分析,我们将揭示这两个系统在性能、安全性、用户体验等方面的差异,帮助用户更好地了解这两个系统,从而做出更明智的选择。
|
1月前
|
Ubuntu Android开发
Android Froyo基于32 bit ubuntu 10.10编译问题
Android Froyo基于32 bit ubuntu 10.10编译问题
13 1