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/ 查看系统源码

相关文章
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
256 4
|
2月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
4月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
59 2
|
1月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
36 8
|
3月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
104 15
Android 系统缓存扫描与清理方法分析
|
2月前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
61 1
|
3月前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
|
4月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
178 3
|
3月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。
|
4月前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。

热门文章

最新文章