移动测试基础 Android 的兼容性问题剖析

MQC · 2017年08月08日 · 886 次阅读

image

1.PC 是 X86 构架,主要生产厂是 Inter 和 AMD,android 智能手机基本上都是 ARM 构架,主要生产厂家有高通、三星、NVIDIA 等,也不是很多,所以架构方面应该不是导致碎片化的主要原因才是啊?或许我理解的问题?

架构方面是一个重要原因。

x86 架构从当年 8086 开始,到如今的 x64 的 64 位平台,能做到汇编指令完全兼容。

再看看 ARM 架构有多混乱:

ARM 处理器内核列表

x86 架构的字节序是固定的,而 ARM 架构的字节序都是可变的,字节序就是大小端的意思,比如一个 32 位的数据:0x12345678,在 x86 架构下,内存里永远都是 0x78 0x56 0x34 0x12,而在 ARM 架构里,可能是前者,也可能是 0x12 0x34 0x56 0x78.

字节序本身没有什么优劣之分,但对于开发人员来说,可变的字节序意味着移植机器代码是有困难的。

2.各厂商的 ROM 应该只是做一些二次开发,不会动核心部分吧?而 APP 的开发不是只需要跟核心匹配就行了么?就像 WIN 2000 和 XP 一样,同样的 NT 核心,程序基本可以兼容。

安卓系统基于的内核是 Linux,Linux 不是微内核架构,而是宏内核,内核里包含的东西很多。而 Windows 是一个近似微内核的架构,微内核的好处就是驱动什么的可以很容易改变以适用的变化(准确的说 Windows 确实不是完全微内核,但比 Linux 而言内核确实很小)。

宏内核的缺点就是如果硬件改变的太大,很多时候内核要跟着变动。而且由于 ARM 平台本身硬件上差异也很大,导致厂商修改驱动的做法很频繁。如果 Linux 是一个微内核结构,那么可能兼容性就不是现在这样子,但可惜 Linux 不是。

当然,如果存储空间足够大,那么宏内核也没什么问题,PC 端的 Linux 兼容性不都是很好吗?是的,但移动平台的存储空间不是足够大的,所以,没有见到哪家厂商把各种驱动都装到手机上。所以各个厂商之间的安卓系统无法直接兼容。

另外,众所周知 android 是一个开源系统,而 windows 则是一个闭源系统。开放系统的源代码可以让众多手机厂商参与系统的定制。但定制 ROM 会不同程度地修改原生 ROM 的 API,这种现象便是碎片化。碎片化势必会让 google play 中的 app 在这些定制 ROM 里出现兼容性的问题。而 windows 是闭源系统,内部的 API 其他厂商无权修改的,所以不存在这个问题。

3.关于中间层,我的想法是:

①由 Google 主导开发以消灭碎片化。
②类似.NET Framework 和 JAVA 这种,JIT 编译。就是不知道性能开销如何。
③Google 应该会不断的升级系统,而 Android 的开放性决定了终端的多样性,所以中间层还是有价 值的。

第一条,Google 在做了。

第二条,也是安卓现在的做法。要是没有 JIT,安卓的也就基本没有多少活路了。Java 的效率会越来越高,这最终会消除兼容性的问题,但消除不掉的是从硬件到驱动这一层的差异。

最后我想补充一条:各个厂商不开放硬件规范也是一个大问题,比如魅族想把系统移植到小米手机上,前提是魅族知道小米的 BSP(board support package)代码,不然再厉害也没有用。而 PC 平台上大多数厂商都是开放自己的硬件规范的,主板厂商用的芯片组基本上就是那几个,并且都跟微软达成了联合开发的协议。这一点是人为制造的兼容性障碍。

总结一下:

Windows 的兼容性成功有几个原因:硬件指令完全兼容、存储设备足够大以存放各种兼容代码、微内核结构方便扩展;Linux 在 PC 平台的兼容性成功是基本跟 Windows 相同的,只是没有微内核结构。

但到里移动平台,因为硬件指令不能完全兼容,硬件种类又很多,所以如果要兼容各种设备就需要大量的全套的驱动,而移动平台存储设备又太小,你希望你只有 8G 内置存储的手机里有 7.8G 都放着各种驱动吗?并且内置存储小的手机又根本放不下,所以要想活路,只好暂时放弃兼容性,把兼容性的问题留给 JIT 去做。

当然,这种趋势最终会被打破,移动设备的内置存储总有一天会很大,硬件厂商总有一天会统一,那么到时候,就看设备厂商是否愿意开放所有的驱动代码了。

反驳几个观点:

有人说 Windows 也有兼容性的问题,但请问:兼容性再有问题也不会出现 Windows 从 dell 电脑上拿到联想电脑上就不能运行吧?安卓你试试把小米系统移植到魅族手机上?

早期的硬件配置确实麻烦,跳线不对机器都起不来,但用户在正确指导下是可以配起来的,但现在呢?各个厂商封闭自己的 BSP 代码和硬件规范,用户能把小米系统移植到魅族手机上吗?

还有人拿分辨率说事,DOS 时代到 WIN7,分辨率变化了多少了?分辨率只是影响显示的样子,说白了就是好看跟不好看而已,现在安卓系统面对的可不仅仅是好看不好看的问题。

有人说 PC 的接口规范是为 Windows 准备的,那您可真让 Linux 汗颜了。Windows 驱动五花八门难道都是自己变出来的?都是人写的。移动平台的问题是每个厂商都想只做自己的驱动,别人的驱动我才不管呢,当然想管也管不了,后果就是一个硬件平台定制出来的东西完全不兼容另一种平台。

还有人说 ARM 没有兼容性问题,确实,现在主流手机都是 ARM7 指令集,ARM7 是没有兼容性问题,但别忘了 ARM 指令集还有 ARM4 呢,这个跟 ARM7 差异很大的。另外大小端的事情怎么解决?虽然 ARM 默认是小端的。

Windows 系统有问题,硬件有变化,可以升级驱动,为什么可以升级驱动,因为微内核容易升级驱动,驱动变动对微内核影响很小,并且驱动再大也不会出现硬盘里放不下的程度。Linux 的宏内核导致稍微大点的改动就要重编内核,请问有多少人会重编 Linux 内核的?再看有多少人会给 Windows 装驱动的?

评论里有人说到 Linux 在 PC 上也有碎片化的问题,这个确实存在的,但现在 Linux 在不同 PC 硬件之间迁移基本上没难度,手机系统呢?

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册