admin 管理员组文章数量: 1184232
人生最大的改变就是去做自己害怕的事情。
今年的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 -m
armv7lTARGET_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官方文档:
我们平时见的多是armv7-a系列。
提下neon, 它是arm公司专为移动消费类设备设计的。它提供了更卓越的视频编码解码,3D图形渲染,语音处理,流媒体处理等功能。
还有vfp,vfp是Vector Floating-Point的缩写,它在处理矢量浮点运算方面表现更好。
明白了这些在看下面这些配置值心里就明白意思了。
armv7-a-neon
armv5te-vfp
armv8-amips系列
mips是区别与arm的另一种CPU架构。由MIPS公司开发并授权,它跟arm一样都基于精简指令集处理器架构的思想,常见的有
mips64r6
mips32r2-fp
mips32-fpx86系列
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=armTARGET_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为辅 |
版权声明:本文标题:一键转换神器:64位APK变身32位指南 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1771283319a3542839.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论