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

强制编译32位Android源码

在Android源码中 若是
  • wd4084
  • wd4084
  • 2011年02月13日 21:28
  • 1657

android 预制32 64 位so, bin

Android 编译 32 64位SO
  • Le_773
  • Le_773
  • 2016年06月20日 00:00
  • 2852

android工程如何编译32位和64位库

android.mk文件中有LOCAL_MODULE_PATH的值比如为$(TARGET_OUT_SHARED_LIBRARIES)/hw的改为LOCAL_MODULE_RELATIVE_PATH :...
  • pan0755
  • pan0755
  • 2016年11月16日 10:01
  • 1835

怎样在64位安卓系统中使用32位SO库 2

之前跟的项目, 那些号称64位 CPU的主控, 跑的软件全是 32位的; 我仍然很清楚的记得, 当年 CEO 在给大家讲解财报,描述技术蓝图的时候, 宣称 64bit 软件的运行效率其实远不如预期, ...
  • jsn_ze
  • jsn_ze
  • 2017年05月30日 00:23
  • 702

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

可以利用三种方式来判断CPU是32位还是64位: 1. 读取Android 的system property ("ro.product.cpu.abilist64")来判断 2. 读取"/...
  • ly890700
  • ly890700
  • 2016年10月17日 09:28
  • 840

怎样在64位安卓系统中使用32位SO库

背景知识: 对于64位系统的编译规则,可参考:http://source.android.com/source/64-bit-builds.html 关键点:JAVA编译不分32bit和64bit...
  • jsn_ze
  • jsn_ze
  • 2017年05月29日 09:44
  • 650

如何在64位安卓系统中使用32位SO库

背景知识:对于64位系统的编译规则,可参考:http://source.android.com/source/64-bit-builds.html关键点:JAVA编译不分32bit和64bit(APK...
  • codehat
  • codehat
  • 2016年04月11日 14:49
  • 7115

windows 32位程序编译成64位

VS2010新建的VC++项目默认的组件平台是32位 要将它编译为64位程序,按以下步骤: 1.点击“Win32”下拉框,打开“配置管理器” 2.点击...
  • wangwenjing90
  • wangwenjing90
  • 2013年04月03日 14:03
  • 34665

32位和64位程序的区别

由于操作系统内存分配的不同,导致软件开发过程中,需要编译不同版本的软件,此处以VS为例。 1、编译程序根据需要选择不同的编译环境: X86和win32位32位程序,X64为64位程序,可以选择不同...
  • nma_123456
  • nma_123456
  • 2015年04月16日 17:13
  • 8269

C/C++32位程序移植到64位操作系统(转)

1.  32位平台与64位平台 平台的定义 计算机系统是由硬件与软件两部分组成的。所谓平台也就是指硬件与相应的系统软件(包括操作系统、编译器和与开发环境有关的应用程序(如数据库))。  64位硬...
  • dragoo1
  • dragoo1
  • 2015年05月22日 00:52
  • 5958
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 64位变32位
举报原因:
原因补充:

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