Android L 64位兼容32 应用程序的认识
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
Android L 64位兼容32 应用程序的认识的更多相关文章
- Lubuntu 16.04 64位兼容32位程序
第一步:确认自己系统的架构 dpkg --print-architecture输出:amd64 结果为 amd64 表示系统是64位的 第二步:确认打开了多架构支持功能 dpkg --print-f ...
- win7 64位平台编译的程序在XP 32位平台无法运行的解决方法
win7 64位平台编译的程序在XP 32位平台无法运行的解决方法 vs2010的开发环境,制作了一个DLL库.但DLL在XP 32位平台一直无法使用.解决方法如下: 右键项目,属性->配置属性 ...
- 如何在WIN2008或WIN2012 64位系统安装32位SQL2000
如何在WIN2008或WIN2012 64位系统安装32位SQL2000 在日常服务器,云服务器或VPS中,因尔特网络工程师遇到部分使用了WIN2008 或WN2012 64位系统的用户需要安装SQL ...
- wine qq 2013 for linux deb包 Ubuntu 64位兼容
2013-08-08 Wine 1.6,如果您想体验下该版本的wine,目前可以通过ppa进行安装: sudo add-apt-repository ppa:ubuntu-wine/ppa ...
- Ubuntu 64位安装32位运行库
sudo apt-get install ia32-libs 32-64sudo apt-get install libc6:i386sudo apt-get install librt:i386su ...
- 什么是64位和32位internet explorer
什么是64位和32位internet explorer 如果您使用 64 位版本的 Internet Explorer 时,您会遇到问题,请尝试使用 32 位版本的 Internet Explorer ...
- TestComplete 64位和32位之间的区别
在64位系统上,有两种版本的TestComplete:32位和64位.本主题描述了TestComplete x64及其32位版本之间的区别.关于TestComplete x64启动TestComple ...
- 【linux基础】如何查看Linux系统是64位还是32位
如何查看Linux系统是64位还是32位 $getconf LONG_BIT or $file /bin/ls or #查看linux版本 $lsb_release -a or $uname -a 参 ...
- C语言数据类型64位和32机器的区别
C语言编程需要注意的64位和32机器的区别 .数据类型特别是int相关的类型在不同位数机器的平台下长度不同.C99标准并不规定具体数据类型的长度大小,只规定级别.作下比较: 32位平台 char:1字 ...
随机推荐
- nefu 118 n!后面有多少个0 算数基本定理,素数分解
n!后面有多少个0 Time Limit 1000ms Memory Limit 65536K description 从输入中读取一个数n,求出n! 中末尾0的个数. input 输入有若干行.第一 ...
- Who's in the Middle - poj 2388 (快速排序寻找中位数)
题意; 寻找中位数 利用快速排序来寻找中位数. #include <iostream> using namespace std; int N; ]; int Median(int left ...
- OC 字符串出来
//1.获取字符串的长度 NSString * str = @"abcd"; NSUInteger length = [str length]; //str.length; NSL ...
- HTML5学习笔记简明版(10):废弃的元素和属性
废弃的元素(Element) 这个小节里列出的元素在HTML5里将不再使用.现有文档升级到 HTML5的话能够使用一些替代方案. 比如parser section 能够处理isindex 元素的功能. ...
- 认识oracle的update更新
这两天给新同事安排了一个工作,即做一个update 的级联更新,在实际操作中发现了一个问题.就是对于Oracle的更新的语法,大部分人尤其是学过SqlServer的人在使用oracle的时候对于ora ...
- Python Numpy ValueError: data type must provide an itemsize
天朝网络锁国,百度找了半个小时找不出来原因,只能谷歌 谷歌第一条就是,顿时感觉幸福感来的太突然 原因是输入的矩阵均是字符串(从文件里读的) 那么就需要批量转数组,一行一行的转. 下面是我的代码: ro ...
- Laravel 5.1 Blade模板引擎
为什么要使用blade 它是干什么用的? blade模板引擎使我们写HTML页面的地方,使用它是因为它能给我们提供很多的遍历,减少代码的重复率 提高开发效率.我们写blade的路径是 resource ...
- C# 关于在原图中寻找子图片坐标的类
在网上找了好久,没有一个现成的例子,自己也发帖子可惜没有找到好办法. 只好自己动手写了, 以下为个人想法所写,算法可能不会太好,如果各位有好的例子发来大家一起分享一下. 这个类主要实现了图片坐标查找功 ...
- 2、ACE-实用生活口语-介绍 Introductions
(1) (2) (3)认识你很荣幸,如何称呼您呢?It's a pleasure to meet you.I'm glad to meet you.May I have your name?How s ...
- 获取html元素所在页面的坐标
function findPosition(oElement) { var x2 = 0; var y2 = 0; var width = oElement.offsetWidth; var heig ...