Android 64位变32位
来源:互联网 发布:邪恶力量第十二季 知乎 编辑:程序博客网 时间:2024/04/30 19:59
人生最大的改变就是去做自己害怕的事情。
今年的Google I/O大会上Google提出了Android GO,其目的是尽可能的让Android系统能运行在低配的手机设备。其中就提到了为了节省存储空间,Android GO是32位系统。
本篇博文沿着这个思路,介绍将Android改为32系统的方法。修改的地方较少,只用修改两个地方。
修改64位Android系统成32位
- 定义TARGET_ARCH跟TARGET_ARCH_VARIANT为32位,TARGET_2ND_ARCH跟TARGET_2ND_ARCH_VARIANT赋空值.
- 配置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
它们的区别如下表:
- Android 64位变32位
- android 64位兼容32位
- 32位 64位
- 16位、32位、64位
- Win 64位 和32位开发android应用程序
- Android 64位系统和32位的兼容性分析
- android开发环境搭建 最新版 64位 32位同理
- Android 如何判断CPU是32位还是64位
- Android 如何判断CPU是32位还是64位
- Android 如何判断CPU是32位还是64位
- Android 如何判断CPU是32位还是64位
- Android 如何判断CPU是32位还是64位
- android工程如何编译32位和64位库
- eclipse android集成开发环境分享 32位 64位
- android 64位系统,调用32位so文件
- 32位/64位 区别
- 32位 移植 64 位
- 32位装64位
- ES6~解构赋值
- HTTPS://WWW.CNBLOGS.COM/ANDROID-JOKER/P/4414891.HTML https://www.cnblogs.com/android-joker/p/4414891
- 用ipython 写spark
- Go Effective
- gunicorn + Flask架构中使用多进程全局锁
- Android 64位变32位
- submint()和onsubmit() 的区别
- HDU
- ORACLE SQL TUNING ADVISOR 使用方法
- 如何查找论文资料
- SpringBoot系列(二)--web应用之jsp篇
- Qt--Meta-Object Model
- 计算单词的个数
- RxJava 详解