内容简介:不知道大家在设置abi的时候,有没有考虑过这个问题。不同的abi之间有什么区别。32位so又是如何运行在64位机器上的。这个是如何兼容的呢?相信有了解过系统源码的同学都知道这是啥玩意。首先我们看下init进程在启动zygote进程是如何做的。以6.0源码为例。在init.rc文件中,会根据ro.zygote的值去启动响应支持相应位数的进程。那么,ro.zygote有几种取值呢?
不知道大家在设置abi的时候,有没有考虑过这个问题。不同的abi之间有什么区别。32位so又是如何运行在64位机器上的。这个是如何兼容的呢?
从Zygote说起
相信有了解过系统源码的同学都知道这是啥玩意。首先我们看下init进程在启动zygote进程是如何做的。以6.0源码为例。
import /init.environ.rc import /init.usb.rc import /init.${ro.hardware}.rc import /init.${ro.zygote}.rc import /init.trace.rc 复制代码
在init.rc文件中,会根据ro.zygote的值去启动响应支持相应位数的进程。那么,ro.zygote有几种取值呢?
如图所示
- zygote32 仅支持32位
- zygote64 仅支持64位
- zygote32_64 兼容32和64,32位优先
- zygote64_32 兼容模式,64位优先
以小米6为例。属性值如下。
现在看一下init_zygote64_32.rm文件
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote class main socket zygote stream 660 root system onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart media onrestart restart netd service zygote_secondary /system/bin/app_process32 -Xzygote /system/bin --zygote --socket-name=zygote_secondary class main socket zygote_secondary stream 660 root system onrestart restart zygote 复制代码
可以很清楚的看到,系统在启动的时候,会启动两个Zygote,一个64位一个32位。
Android系统是如何确定应该是fork 64位还是32位的呢
有了解过进程启动的同学应该看到过如下代码。
synchronized(mLock) { return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), argsForZygote); } 复制代码
private ZygoteState openZygoteSocketIfNeeded(String abi) throws ZygoteStartFailedEx { Preconditions.checkState(Thread.holdsLock(mLock), "ZygoteProcess lock not held"); if (primaryZygoteState == null || primaryZygoteState.isClosed()) { try { primaryZygoteState = ZygoteState.connect(mSocket); } catch (IOException ioe) { throw new ZygoteStartFailedEx("Error connecting to primary zygote", ioe); } maybeSetApiBlacklistExemptions(primaryZygoteState, false); maybeSetHiddenApiAccessLogSampleRate(primaryZygoteState); } if (primaryZygoteState.matches(abi)) { return primaryZygoteState; } // The primary zygote didn't match. Try the secondary. if (secondaryZygoteState == null || secondaryZygoteState.isClosed()) { try { secondaryZygoteState = ZygoteState.connect(mSecondarySocket); } catch (IOException ioe) { throw new ZygoteStartFailedEx("Error connecting to secondary zygote", ioe); } maybeSetApiBlacklistExemptions(secondaryZygoteState, false); maybeSetHiddenApiAccessLogSampleRate(secondaryZygoteState); } if (secondaryZygoteState.matches(abi)) { return secondaryZygoteState; } throw new ZygoteStartFailedEx("Unsupported zygote ABI: " + abi); } 复制代码
- 会根据abi的值,先去primaryZygoteState匹配然后,再去匹配备选secondaryZygoteState。
那个,ZygoteState中所存储的abi分类是怎么来的呢?具体细节不说。这里的值是通过读取ro.product.cpu.abilist64,ro.product.cpu.abilist32这两个属性得来的。
#if defined(__LP64__) static const char ABI_LIST_PROPERTY[] = "ro.product.cpu.abilist64"; static const char ZYGOTE_NICE_NAME[] = "zygote64"; #else static const char ABI_LIST_PROPERTY[] = "ro.product.cpu.abilist32"; static const char ZYGOTE_NICE_NAME[] = "zygote"; #endif if (property_get(ABI_LIST_PROPERTY, prop, NULL) == 0) { LOG_ALWAYS_FATAL("app_process: Unable to determine ABI list from property %s.", ABI_LIST_PROPERTY); return 11; } String8 abiFlag("--abi-list="); abiFlag.append(prop); 复制代码
将这些值写入参数中,然后跟着ZygoteInit#main方法传入到 java 层。具体通过socket查询这个值的过程这里就不说了。
现在,看下小米6手机这几个值是多少。
因此,启动的是64位还是32位,重点在于启动进程时的参数abi.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
轻量级Django
茱莉亚·埃尔曼 (Julia Elman)、马克·拉温 (Mark Lavin) / 侯荣涛、吴磊 / 中国电力出版社; 第1版 / 2016-11-1 / 35.6
自Django 创建以来,各种各样的开源社区已经构建了很多Web 框架,比如JavaScript 社区创建的Angular.js 、Ember.js 和Backbone.js 之类面向前端的Web 框架,它们是现代Web 开发中的先驱。Django 从哪里入手来适应这些框架呢?我们如何将客户端MVC 框架整合成为当前的Django 基础架构? 本书讲述如何利用Django 强大的“自支持”功......一起来看看 《轻量级Django》 这本书的介绍吧!