Android 64位变32位

来源:互联网 发布:邪恶力量第十二季 知乎 编辑:程序博客网 时间:2024/04/30 19:59

人生最大的改变就是去做自己害怕的事情。

今年的Google I/O大会上Google提出了Android GO,其目的是尽可能的让Android系统能运行在低配的手机设备。其中就提到了为了节省存储空间,Android GO是32位系统。

本篇博文沿着这个思路,介绍将Android改为32系统的方法。修改的地方较少,只用修改两个地方。

修改64位Android系统成32位

  1. 定义TARGET_ARCH跟TARGET_ARCH_VARIANT为32位,TARGET_2ND_ARCH跟TARGET_2ND_ARCH_VARIANT赋空值.
  2. 配置zygote为32位,在项目对应的make文件中添加
PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.zygote=zygote32

到此修改完毕了,可以收工了。当然如果你还想知道这背后的细节知识,请继续往下看。

TARGET_ARCH是什么

TARGET_ARCH代表的是编译Android的目标CPU架构的名称,比如:arm,x86。利用uname -m可以查看当前手机的的CPU架构,我自己手机运行结果如下:

$ adb shell uname -marmv7l

TARGET_ARCH_VARIANT是什么

VARIANT英文译为”不同的”,TARGET_ARCH_VARIANT之前被称为TARGET_ARCH_VERSION,其作用是区分相同CPU架构的不同版本,比如arm架构它有很多个版本,我们依靠TARGET_ARCH_VARIANT来进行选取。

TARGET_ARCH_VARIANT在源码中有多个值,比如armv7-a-neon/x86_64/mips64r6。这些分别代表什么含义呢?

arm系列

以armv7-a-neon来举例说明,arm打头代表CPU架构是arm的,v7表示版本,v7以及v7以下的版本均是32位的,从v8开始就是64位了。而v7版本的arm又细分为三种:

  • a:专为Application设计,a代表Applications
  • r:专为实时系统设计,r代表Real-time
  • m:精简版本,m代表Microcontroller

这其中a跟r非常类似。更详细的说明请查考arm官方文档:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406c/index.html
我们平时见的多是armv7-a系列。

提下neon, 它是arm公司专为移动消费类设备设计的。它提供了更卓越的视频编码解码,3D图形渲染,语音处理,流媒体处理等功能。

还有vfp,vfp是Vector Floating-Point的缩写,它在处理矢量浮点运算方面表现更好。

明白了这些在看下面这些配置值心里就明白意思了。

armv7-a-neonarmv5te-vfparmv8-a

mips系列

mips是区别与arm的另一种CPU架构。由MIPS公司开发并授权,它跟arm一样都基于精简指令集处理器架构的思想,常见的有

mips64r6mips32r2-fpmips32-fp

x86系列

x86_64中x86表示cpu架构是由因特尔公司开发,而64表示是64位系统。

TARGET_2ND_ARCH和TARGET_2ND_ARCH_VARIANT分别什么含义

TARGET_2ND_ARCH

从Android5.0之后出现了64位系统,Android系统就需要考虑兼容之前大量的32位程序了,如果打算在64位系统上,也具有编译32程序的能力,就该TARGET_2ND_ARCH出场了,它的出现正是Android系统为了兼容64/32的程序而引入的。

这里的目标程序多数情况下指的是库文件,默认系统只会编译出运行在TARGET_ARCH架构下的库文件.

看看下面的例子:

TARGET_ARCH=arm64TARGET_2ND_ARCH=arm

TARGET_ARCH说明芯片架构是面向64位系统的,并且在这个基础上又定义了TARGET_2ND_ARCH,它表明芯片也是兼容32位程序的。当确定需要编译32位库文件时,需要在库文件模块的Android.mk文件中加入:

LOCAL_MULTILIB := 32 # 只编译32位LOCAL_MULTILIB := both # 64/32位都编译

TARGET_2ND_ARCH_VARIANT

解释完TARGET_2ND_ARCH,TARGET_2ND_ARCH_VARIANT的含义也就明朗了。它表示兼容cpu架构的版本。

zygote32是什么

zygote32顾名思义,它服务的是32位系统。因为从Android5.0之后蹦出了64位,因此zygote也需要跟着适配,分成32/64的版本。
开篇提到的

PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.zygote=zygote32

改动是什么道理呢?
system/core/rootdir/init.rc

import /init.environ.rcimport /init.usb.rcimport /init.${ro.hardware}.rcimport /vendor/etc/init/hw/init.${ro.hardware}.rcimport /init.usb.configfs.rcimport /init.${ro.zygote}.rc

我们将ro.zygote赋值为zygote32,所以最终就有import /init.zygote32.rc
init.zygote32.rc所在位置如下图:
这里写图片描述

这里也可以看到zygote有四个版本,不应该是两个吗?(一个32另一个64),查看内容就知道区别了。
system/core/rootdir/init.zygote32_64.rc

service zygote /system/bin/app_process32 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote    class main    priority -20    user root    group root readproc    socket zygote stream 660 root system    onrestart write /sys/android_power/request_state wake    onrestart write /sys/power/state on    onrestart restart audioserver    onrestart restart cameraserver    onrestart restart media    onrestart restart netd    onrestart restart wificond    writepid /dev/cpuset/foreground/tasksservice zygote_secondary /system/bin/app_process64 -Xzygote /system/bin --zygote --socket-name=zygote_secondary    class main    priority -20    user root    group root readproc    socket zygote_secondary stream 660 root system    onrestart restart zygote    writepid /dev/cpuset/foreground/tasks

它们的区别如下表:

配置文件名称 含义 init.zygote32.rc 只启动一个面向32位的app_process32进程 init.zygote64.rc 只启动一个面向64位的app_process64进程 init.zygote32_64.rc 启动两个app_process进程,其中app_process32为主,app_process64为辅 init.zygote64_32.rc 启动两个app_process进程,其中app_process64为主,app_process32为辅
原创粉丝点击