请教高手, Android 对 JVM 生态圈的兼容极限在哪里?

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

但是,我的疑惑是,这样的实现,它的技术极限在哪里,Google 是否真的做到了二进制级别的兼容?
10672 次点击
所在节点    Android
12 条回复
guyeu
2021-04-08 13:14:24 +08:00
显然没有,语法层面的兼容都没有做到,所以很多库会同时有 jre 版本和 android 版本。另外,Google 也复用了一大堆 JDK 的原始代码,后来因为官司问题都替换成了自己的实现而已。
abcbuzhiming
2021-04-08 16:03:48 +08:00
@guyeu 能不能举个同时有 jre 版本和安卓版本库的例子
guyeu
2021-04-08 16:10:48 +08:00
@abcbuzhiming #2 最著名的大概就是 guava 了
iminto
2021-04-08 17:17:05 +08:00
@guyeu 这个例子不应该被认为是 API 不兼容导致,它的安卓版本是做了内存方面的优化和编码风格的改变,虽然某些 API 确实输出上有不同,但是 android 在语法层面应该认为是兼容某个特定 JRE 的。
ychost
2021-04-08 17:28:13 +08:00
Guava 还好,后面 JDK 都借鉴了相关 api 比如 Optional,Future 之类的
wobuhuicode
2021-04-08 17:28:46 +08:00
我记得 12 年刚学安卓 2.X 开发的时候,很多底层就是 JDK 的,好像安卓 4.4 之后才全部换过来。
bigbyto
2021-04-08 17:30:06 +08:00
应该是取决于 android 的虚拟机。 很久没接触安卓,像早期的 dalvik 虚拟机,dex 是由 jvm bytecode(class 文件)转译过去的,因此一些新的 jvm 特性(如 invokedynamic 指令)需要等待安卓的虚拟机进行兼容,才能在代码中使用 lambda 表达式。
guyeu
2021-04-08 17:57:13 +08:00
@iminto #4 的确,guava 的 android 和 jre 版本更多在于编码风格和特定于 android 的优化。android 在编写和编译的层面也兼容某一个特定的 java 版本,可以说合法的 java 代码就是合法的 android 代码。不同的是运行时。
cjh1095358798
2021-04-08 18:36:08 +08:00
android 符合 jvm 规范
ikas
2021-04-08 20:49:37 +08:00
android 就是一个独立的平台,本身也是事实分裂了 java 生态,并且 android 的虚拟机不符合 jvm 规范,安卓跑的是 dex,jvm 跑的是 class, java 代码是先编译成 class,然后再转换成 dex.
ikas
2021-04-08 21:02:56 +08:00
置于兼容,他根本不需要符合 jvm,同样也不需要去完整兼容,事实也是,他现在 java8 兼容完整了吗?
chenyu8674
2021-04-09 11:49:43 +08:00
java 程序员随便学两下就可以去写 Android,算不算另一种形式的“兼容”

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/769005

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX