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
顾名思义,android所有的应用进程都是fork zygote而来的
- 那么,当我们启动一个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/ 查看系统源码
Android 64 bit的一些兼容性分析相关推荐
- Android 系统(78)---《android framework常用api源码分析》之 app应用安装流程
<android framework常用api源码分析>之 app应用安装流程 <android framework常用api源码分析>android生态在中国已经发展非常庞大 ...
- Android+上百实例源码分析以及开源分析+集合打包
1.360新版特性界面源代码 实现了360新版特性界面的效果,主要涉及到Qt的一些事件处理与自定义控件.但源码好像是c++. 2.aidl跨进程调用 服务端onBind暴露,然后客户端bindServ ...
- Android 短信数据库详细总结分析
Android 短信数据库详细总结分析 短信 sms 文件 /data/data/com.android.providers.telephony/databases/mmssms.db 这个数据库 ...
- Android上百实例源码分析以及开源分析集合打包
感谢网友banketree的收集,压缩包的内容如下: 1.360新版特性界面源代码 实现了360新版特性界面的效果,主要涉及到Qt的一些事件处理与自定义控件.但源码好像是c++. 2.aidl跨进程调 ...
- [免费专栏] Android安全之APK应用程序分析「附带Smali基础语法解析」
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...
- android8.1上musicfx,Android自带音频均衡器MusicFx分析
Android自带音频均衡器MusicFx分析 种种原因,我要简单分析一个Android中built-in的音频均衡器MusicFx.重点是它的默认值的来历.网上很少有文章讲了这个的除了这篇<c ...
- Android Studio - HPROF文件查看和分析工具
Android Studio - HPROF文件查看和分析工具 Android Studio 翻译的官方文章 原文链接 当你在Android Studio中使用Android Monitor里的Mem ...
- Android中启动Activity(startActivity)流程图分析
在上篇博文< Android中ActivityManagerService与应用程序(客户端)通信模型分析>中,我们从宏观架构上掌握 ActivityManagerService与应用程序 ...
- Android Camera 系统架构源码分析
Android Camera 系统架构源码分析(1)---->Camera的初始化 Android Camera 系统架构源码分析(2)---->Camera的startPreview和s ...
最新文章
- PostgreSQL数据库数组相似度计算
- C语言中可变参数列表
- 设计模式:中介者模式(Mediator)
- 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第三十集
- centos6,7的启动流程
- linux complete函数,Linux驱动中completion接口浅析(wait_for_complete例子,很好)
- 前端学习(531):什么是等高布局
- iOS开发之Accounts框架详解
- 归并排序——java
- windows c语言 http 状态检测_从软件架构说C语言
- Python零基础入门(二)——Python中常见的数据结构[学习笔记]
- Microsoft Azure -- 初步了解 (三)
- 离散数学第二版屈婉玲教材pdf_离散数学 第二版 [屈婉玲,耿素云,张立昂 编著] 2015年版...
- 电气工程学计算机有用吗,我是学计算机的,因为一直喜欢电气,所以想考个注..._电气工程师_帮考网...
- 关于百度ueditor图片上传到OSS问题解决
- 菜 根 谭 [明] 洪应明
- 石川圖 / 鱼骨图 / 關鍵要因圖 / 因果圖
- VS+Opencv出现:xxx处有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置xxx处。
- HTTP--header
- 【线性分类器】(四)万字长文解释拉格朗日乘子与支持向量机
热门文章
- 什么是 Git、Github?
- 《黑暗之光》RPG游戏案例学习(1)——事前准备
- 如何1分钟批量导出一个微信公众号所有文章到word和pdf + 快捷搜索微信所有文章
- android文件备份工具,5种方式轻松备份Android应用程序和应用程序数据
- 用map和ajax省市联动,jquery,ajax实现二级省市联动
- it巨头的组织架构图
- 计算机未响应硬盘,我的电脑是固态硬盘加机械硬盘的混合硬盘,运行win8.1的时候经常遇到卡死,未响应的情况。...
- (彪悍一只猫)猫叔个人十倍成长破局深度拆解
- 番外.1.Python高级用法
- C#索引器-索引器概述