Android 64位变32位

原创 2017年11月14日 19:25:13

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

今年的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 -m
armv7l

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-neon
armv5te-vfp
armv8-a

mips系列

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

mips64r6
mips32r2-fp
mips32-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=arm64
TARGET_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.rc
import /init.usb.rc
import /init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.${ro.hardware}.rc
import /init.usb.configfs.rc
import /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/tasks

service 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为辅
版权声明:欢迎转载,请尊重作者azhengye,标明出处http://blog.csdn.net/azhengye

相关文章推荐

Android 如何判断CPU是32位还是64位

可以利用Android 的系统 property (android.os.SystemProperties) 来判断CPU是32位还是64位: public static String ge...

android studio正确加载so文件及出现的问题(32位,64位文件的正确使用)

android studio正确加载so文件及出现的问题(32位,64位文件的正确使用)android studio 1.5及以上版本为例,加载的两种方式: 在主项目libs文件加载 android{...

Android 如何判断CPU是32位还是64位

转自: http://blog.csdn.net/wangbaochu/article/details/47723265 可以利用三种方式来判断CPU是32位还是64位: 1. 读...
  • sno_guo
  • sno_guo
  • 2016年01月24日 11:43
  • 3451

Android 如何判断CPU是32位还是64位

可以利用三种方式来判断CPU是32位还是64位: 1. 读取Android 的system property ("ro.product.cpu.abilist64")来判断 2. 读取"/...

32位ubuntu系统升级为64位系统,然后编译4.3android源码 很顺利很成功

32位ubuntu系统升级为64位系统,然后编译4.3android源码 很顺利很成功

关于Android引入高德地图、百度地图、Qrcode、Jpush等三方架包报32位、64位找不到问题

这个错误信息在一个项目中引入高德地图、百度地图、Jpush、Ping++、二维码扫描Qrcode等三方架包时应该会遇到下面这个报错信息: java.lang.UnsatisfiedLinkErr...

重新配置android开发环境(由32位到64位)

原来电脑装的32位java,JDK。 后来加个跟内存条,重装了64位系统。  现在想重新配置64位的JDK,搭建android开发环境。...

32位和64位系统内置数据变量的大小区别

32位和64位系统区别及int字节数 一)64位系统和32位有什么区别?  1、64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 64位变32位
举报原因:
原因补充:

(最多只允许输入30个字)