V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nnegier
V2EX  ›  Java

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

  •  
  •   nnegier · 41 天前 · 3896 次点击
    这是一个创建于 41 天前的主题,其中的信息可能已经有所发展或是发生改变。
    this.httpServer = HttpServer.create(new InetSocketAddress(host, port), 0);
    
    import com.sun.net.httpserver.HttpServer;
    

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

    第 1 条附言  ·  41 天前
    其实我的问题不是找一个 http server 库,而是想问怎样才能让 Android 用上非阉割版的 java ,这样很多库就可以直接搬了
    第 2 条附言  ·  41 天前
    不知道有人会不会也想折腾这个 HttpServer 包,如果有的话,可以附上一点资源:
    rt.jar 文件在哪儿:在 jdk/jre/lib/rt.jar ,然后这个 rt.jar 大小在 60MB 以上
    [1] https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/jdkfiles.html
    rt.jar 实测 jdk1.7 和 jdk1.8 都有,且在同一个路径,其它没有测试,这是 jdk1.7 的下载链接
    [2] https://www.oracle.com/tw/java/technologies/javase/javase7-archive-downloads.html

    会遇到的问题,desugarDebugFileDependencies 这个任务中失败,叫你把 minSDK 弄到 26 及以上。
    改了之后能运行也不报错。但是这我第二次依然没有成功,这次是输入地址后没有任何效果,地址端口均正确,显示:“无法访问此网站 192.168.0.100 拒绝了我们的连接请求。”
    28 条回复    2025-02-12 16:08:14 +08:00
    neptuno
        1
    neptuno  
       41 天前
    我不是安卓开发,只能说没有提示的话,你先写了,看看能不能在模拟器上启动 server ,启动不了就是阉割了。阉割了就只能用安卓 sdk 里面有的方式去做,或者用第三方的库
    bunnyblueair
        2
    bunnyblueair  
       41 天前
    反射大法试一下 获取不到 class 就换别的方式吧
    w568w
        3
    w568w  
       41 天前
    这很难吗: https://letmegooglethat.com/?q=android+http+server+library

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

    bionic 是出于轻量化考虑。

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

    建议是不要生搬硬套,你猜猜 android 开发跟 java 开发为什么 jd 区别不小?
    WindProtect
        9
    WindProtect  
       41 天前
    @nnegier 这个问题 google 下都有大把答案吧。找个 android 用的 http server 的实现呗。
    nnegier
        10
    nnegier  
    OP
       41 天前
    @flyqie 谢谢你的回答。我认为 jd 区别不小的原因是 Android 有一个 Framework 层(各种框架服务)通过 SDK 提供了很多 API ,以及各个 android 版本会有改动,开发者需要去了解,需要多看文档多读源码以及多实践,而 java 程序员就是纯面向 Java 了,once write ,run anywhere 。看你说的,可能真的没有办法在 Android 中使用非阉割版的 java 了,其实如果支持,Android 程序员会爽很多。我有这个问题,是因为我在写一个 http server ,当然这个不难,就是解析 http 文本返回数据,当然最主要是因为我需求很简单,然后之前用 IDEA 写好了代码搬不到 Android 去,现在又在重新写,真的挺烦的因为完全是重复的
    sofm
        11
    sofm  
       41 天前   ❤️ 1
    Android 的 Java 类库基于 Java SE ,但针对移动设备进行了大量定制和优化,移除了部分不常用的功能,增加了移动开发所需的 API 。因此,Android 开发与 Java SE 开发在类库和工具上有显著差异。
    macaodoll
        12
    macaodoll  
       41 天前 via Android
    用 nanohttpd
    Shatyuka
        13
    Shatyuka  
       41 天前
    这东西也不在 Java SE 里,哪里说得上是阉割呢。
    HojiOShi
        14
    HojiOShi  
       41 天前
    @nnegier #7 这个比较困难,至少做成应用打包的话不太好实现。如果是仅部署,我目前唯一能想到的方案是安装 Termux ,然后在这上面按照正常 linux 发行版那样安装 java 。
    cxtrinityy
        15
    cxtrinityy  
       41 天前 via Android
    你如果是想复制粘贴,不如试试让 ai 帮你写平替代码,如果只是重新写但不熟悉 Android 的对应库,我觉得没所谓,就算是重新实现的库,其实也大差不差,了解下很快的吧
    xuanbg
        16
    xuanbg  
       41 天前
    Android SDK 不是 Java SDK ,两个根本就不是一个东西,所以也不存在什么阉割。
    Kamiyu0087
        17
    Kamiyu0087  
       41 天前
    ktor +1
    Android 上 http server 实现应该一找一大把吧?
    w568w
        18
    w568w  
       41 天前   ❤️ 6
    > 怎样才能让 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
        19
    coala  
       41 天前
    谷歌当时是和 SUN 关系好,JVM 应该是重写过的,规避版权之类的, 就拿来用了. 后面被甲骨文收了可就关系不咋样了, 这么多年发展下来.. 建议去看安卓开发吧...
    nnegier
        20
    nnegier  
    OP
       41 天前
    @w568w #18 回答很好,然后[4]那个我早先试过,运行没成功
    neoblackcap
        21
    neoblackcap  
       41 天前
    Android 的运行时不是 Java SE ,自然就没法用那些库。所以 Android 也没有宣称自己的运行时跟 Java 有什么关系(甲骨文版权官司警告)。
    Android 就连字节码跟 JVM 的都不是一个东西。
    w950888
        22
    w950888  
       40 天前
    是的,java SDK 里很多 api Android 端都用不了,比如图片,图形和 GUI 相关的
    lisongeee
        23
    lisongeee  
       40 天前
    《拒绝了我们的连接请求》

    android 需要网络权限才能用,你确定声明了网络权限吗?还有你的监听地址是 0.0.0.0 吗
    spritecn
        24
    spritecn  
       40 天前
    javaer,我正常都用 aws 的 jdk,偶尔也会有些 sun 的包没有,比如 base64,这不是很正常
    murmurkerman
        25
    murmurkerman  
       40 天前 via iPhone
    很简单加几个 jar 就好了 https://github.com/piyush01123/Android-Server
    我记得 netty 是可以跑在安卓上的,调整下 minSdk 到支持 nio 的版本好像是 24 。
    ktor 也可以跑 server 。
    jetty 应该也可以。
    murmurkerman
        26
    murmurkerman  
       40 天前 via iPhone
    遇到问题搜下 GitHub😶‍🌫️
    sir283
        27
    sir283  
       40 天前 via Android
    我都是用 socket 手搓 http server ,安卓的 Java 给我的感觉就是 jdk1.5 ,不能完全套用 Java1.8 那些特性,特别是要兼容旧版本安卓的时候。

    这是我手搓的 http server 功能源码,你直接复制就能用了。
    https://github.com/MrsEWE44/easyManager/blob/master/app/src/main/java/com/easymanager/activitys/FileSharedLayoutActivity.java
    nnegier
        28
    nnegier  
    OP
       39 天前
    @lisongeee #23 这个是基础,网络权限肯定是加了的,而且我还自行写了一个 socket 来测试过
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   996 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:35 · PVG 02:35 · LAX 11:35 · JFK 14:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.