Android 对 JVM 生态圈的兼容*限在哪里?

*近才意识到,实际上当年 Google 仅仅是把 Java 的 api 接口搬了过来,接口下面的代码完全重新写了一遍,虚拟机也是完全自己实现。这样的东西从标准来说应该不能算 JDK,本质其实是语法像 java 语言的全新语言。在当时确实可以把 java 生态圈里的很多东西,直接拿来用。

但是,我的疑惑是,这样的实现,它的技术*限在哪里,Google 是否真的做到了二进制级别的兼容?

12 条回复    2021-04-09 11:49:43 +08:00
guyeu
    1

guyeu   1 天前

显然没有,语法层面的兼容都没有做到,所以很多库会同时有 jre 版本和 android 版本。另外,Google 也复用了一大堆 JDK 的原始代码,后来因为官司问题都替换成了自己的实现而已。
abcbuzhiming
    2

abcbuzhiming   21 小时 32 分钟前

@guyeu 能不能举个同时有 jre 版本和安卓版本库的例子
guyeu
    3

guyeu   21 小时 25 分钟前

@abcbuzhiming #2 *著名的大概就是 guava 了
iminto
    4

iminto   20 小时 19 分钟前

@guyeu 这个例子不应该被认为是 API 不兼容导致,它的安卓版本是做了内存方面的优化和编码风格的改变,虽然某些 API 确实输出上有不同,但是 android 在语法层面应该认为是兼容某个特定 JRE 的。
ychost
    5

ychost   20 小时 8 分钟前

Guava 还好,后面 JDK 都借鉴了相关 api 比如 Optional,Future 之类的
wobuhuicode
    6

wobuhuicode   20 小时 7 分钟前

我记得 12 年刚学安卓 2.X 开发的时候,很多底层就是 JDK 的,好像安卓 4.4 之后才全部换过来。
bigbyto
    7

bigbyto   20 小时 6 分钟前

应该是取决于 android 的虚拟机。 很久没接触安卓,像早期的 dalvik 虚拟机,dex 是由 jvm bytecode(class 文件)转译过去的,因此一些新的 jvm 特性(如 invokedynamic 指令)需要等待安卓的虚拟机进行兼容,才能在代码中使用 lambda 表达式。
guyeu
    8

guyeu   19 小时 39 分钟前

@iminto #4 的确,guava 的 android 和 jre 版本更多在于编码风格和特定于 android 的优化。android 在编写和编译的层面也兼容某一个特定的 java 版本,可以说合法的 java 代码就是合法的 android 代码。不同的是运行时。
cjh1095358798
    9

cjh1095358798   19 小时 0 分钟前

android 符合 jvm 规范
ikas
    10

ikas   16 小时 46 分钟前

android 就是一个独立的平台,本身也是事实分裂了 java 生态,并且 android 的虚拟机不符合 jvm 规范,安卓跑的是 dex,jvm 跑的是 class, java 代码是先编译成 class,然后再转换成 dex.
ikas
    11

ikas   16 小时 33 分钟前

置于兼容,他根本不需要符合 jvm,同样也不需要去完整兼容,事实也是,他现在 java8 兼容完整了吗?
chenyu8674
    12

chenyu8674   1 小时 46 分钟前

java 程序员随便学两下就可以去写 Android,算不算另一种形式的“兼容”