Android 的 Java 是阉割版的?何解呢

208 天前
 nnegier
this.httpServer = HttpServer.create(new InetSocketAddress(host, port), 0);
import com.sun.net.httpserver.HttpServer;

这种写在 IDEA 里面正常用的代码,在 Android Studio 提示没有,那 Android 的 JDK 铁定是阉割版的了,这种应该怎么办呢?

4374 次点击
所在节点    Java
28 条回复
neptuno
208 天前
我不是安卓开发,只能说没有提示的话,你先写了,看看能不能在模拟器上启动 server ,启动不了就是阉割了。阉割了就只能用安卓 sdk 里面有的方式去做,或者用第三方的库
bunnyblueair
208 天前
反射大法试一下 获取不到 class 就换别的方式吧
w568w
208 天前
这很难吗: https://letmegooglethat.com/?q=android+http+server+library

这种库实在太多以至于我不知道先给你推荐哪个……我用得最多的是 https://github.com/ktorio/ktor
Wvg9eBo3U0c8BLd2
208 天前
com.sun 开头的类是 JDK 的内部实现,不是 Java 官方 API 的一部分, 安卓中没有 HttpServer 这个类, 安卓的网络编程与标准 Java SE 的实现不同,要使用更适合移动应用的库。
HojiOShi
208 天前
你之前的回答说深入过 Android 应用层,我感觉有点水啊。
一是你不知道 Android 的 Java 就是阉割版(以至于都有脱糖库这种东西存在),二是 Google 都不用就来问。
nnegier
208 天前
@HojiOShi 谢谢你抓我,可以让我更好的反思自己。另外,这个我显然是知道才发出来的,java 确实有很多版本,但我确实没有和别人交流过这件事情,因为我多次想将一些 java lib 直接考到 Android 项目中用,都会报各种错误。
nnegier
208 天前
@HojiOShi 所以我的问题来了,应该怎么办呢?自己写一个吗,有没有办法就是使用到非阉割版的 java 呢在 Android 里呢?
flyqie
208 天前
是所谓的阉割版,包括你用的 c 库都是重新实现的(bionic)。

bionic 是出于轻量化考虑。

java 应该是轻量化+规避版权风险(不知道前期是否考虑过),版权风险具体可以参考甲骨文跟 google 那场关于 api 算不算侵权的官司。

建议是不要生搬硬套,你猜猜 android 开发跟 java 开发为什么 jd 区别不小?
WindProtect
208 天前
@nnegier 这个问题 google 下都有大把答案吧。找个 android 用的 http server 的实现呗。
nnegier
208 天前
@flyqie 谢谢你的回答。我认为 jd 区别不小的原因是 Android 有一个 Framework 层(各种框架服务)通过 SDK 提供了很多 API ,以及各个 android 版本会有改动,开发者需要去了解,需要多看文档多读源码以及多实践,而 java 程序员就是纯面向 Java 了,once write ,run anywhere 。看你说的,可能真的没有办法在 Android 中使用非阉割版的 java 了,其实如果支持,Android 程序员会爽很多。我有这个问题,是因为我在写一个 http server ,当然这个不难,就是解析 http 文本返回数据,当然最主要是因为我需求很简单,然后之前用 IDEA 写好了代码搬不到 Android 去,现在又在重新写,真的挺烦的因为完全是重复的
sofm
208 天前
Android 的 Java 类库基于 Java SE ,但针对移动设备进行了大量定制和优化,移除了部分不常用的功能,增加了移动开发所需的 API 。因此,Android 开发与 Java SE 开发在类库和工具上有显著差异。
macaodoll
208 天前
用 nanohttpd
Shatyuka
208 天前
这东西也不在 Java SE 里,哪里说得上是阉割呢。
HojiOShi
208 天前
@nnegier #7 这个比较困难,至少做成应用打包的话不太好实现。如果是仅部署,我目前唯一能想到的方案是安装 Termux ,然后在这上面按照正常 linux 发行版那样安装 java 。
cxtrinityy
208 天前
你如果是想复制粘贴,不如试试让 ai 帮你写平替代码,如果只是重新写但不熟悉 Android 的对应库,我觉得没所谓,就算是重新实现的库,其实也大差不差,了解下很快的吧
xuanbg
208 天前
Android SDK 不是 Java SDK ,两个根本就不是一个东西,所以也不存在什么阉割。
Kamiyu0087
208 天前
ktor +1
Android 上 http server 实现应该一找一大把吧?
w568w
208 天前
> 怎样才能让 Android 用上非阉割版的 java

首先,Java 标准是分得很碎的,至少有 Java SE API 和 JDK API 两部分[1]。Java SE 保证在所有完整的 Java 实现中存在,但 JDK 只是可选。你说的 com.sun.net.httpserver.HttpServer 属于 jdk.httpserver 模块[2],所以甚至都不属于 Java SE ,而是 JDK 这个可选规范的一部分。

然后,Android 用的根本不是标准 JVM ,各种 Java 8 、11+ API 都是脱糖实现的[3],所以塞不进额外模块是理所当然的。先不说这些模块的实现可能依赖额外语言功能,光是有 JNI/JNA 就足够喝一壶了。这些平台下的最优解就是换用对应的库,不要想着沿用原来的写法了。

当然如果你钻牛角尖说「我就是要用 com.sun.net.httpserver.HttpServer ,别的库用了我晚上睡不着」,这里[4]也有人试过直接把 runtime 打包塞进 APK 里,至少 HttpServer 看起来能工作。

[1] https://docs.oracle.com/en/java/javase/23/docs/api/index.html
[2] https://docs.oracle.com/en/java/javase/23/docs/api/jdk.httpserver/module-summary.html
[3] https://developer.android.com/studio/write/java11-default-support-table
[4] https://stackoverflow.com/a/70486739
coala
208 天前
谷歌当时是和 SUN 关系好,JVM 应该是重写过的,规避版权之类的, 就拿来用了. 后面被甲骨文收了可就关系不咋样了, 这么多年发展下来.. 建议去看安卓开发吧...
nnegier
208 天前
@w568w #18 回答很好,然后[4]那个我早先试过,运行没成功

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

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

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

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

© 2021 V2EX