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

android SDK 的 Java 版本支持

  •  
  •   kujio · 2021-12-07 13:54:47 +08:00 · 10310 次点击
    这是一个创建于 1089 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想问下 android SDK 的 Java 版本支持,查了一下开发者指南好像目前只支持最高 java1.8. 但是我想用 java15,主要是因为 15 支持文本块,因为项目里有大量的 sql 语句,文本块更好看也更好改.

    于是我把 sourceCompatibility 和 targetCompatibility 都改成 Java_15,发现竟然就 OK 了,编译运行也没问题,使用 15 语法也没问题,

    有点懵逼,很好奇,Android SDK 的 Java 版本支持到底在哪里查,还是 Java 高版本可以向下兼容,有没有大佬帮我解答一下疑惑

    22 条回复    2021-12-10 17:59:39 +08:00
    xmt328
        1
    xmt328  
       2021-12-07 14:20:50 +08:00
    安卓的运行时与电脑上的 JVM 是不一样的
    高级语法编译后安卓设备是不支持的
    但是构建过程中有一步是脱糖
    所以你的 java15 代码最终是等价替换为低版本的字节码去运行的
    Cbdy
        2
    Cbdy  
       2021-12-07 14:21:47 +08:00 via Android
    安卓不是 Java
    AoEiuV020CN
        3
    AoEiuV020CN  
       2021-12-07 14:31:44 +08:00
    官方只有一句话带过,直接说 AGP 4.0.0 以后支持了语法脱糖和部分 api 脱糖,
    看这意思像是支持所有新语法糖以及部分 java8 的 api ,文本块算是语法糖,就被脱糖了,
    kujio
        4
    kujio  
    OP
       2021-12-07 15:43:08 +08:00
    @xmt328 有没有详细的文档教程啥的?
    kujio
        5
    kujio  
    OP
       2021-12-07 15:43:40 +08:00
    @AoEiuV020CN 这个我也查到了,以为只是支持 java8 的语法糖 api
    crayygy
        6
    crayygy  
       2021-12-07 15:44:49 +08:00
    直接用 Kotlin ?
    guyuesh2
        7
    guyuesh2  
       2021-12-07 16:06:03 +08:00
    hingbong
        8
    hingbong  
       2021-12-07 16:22:59 +08:00
    文本块编译成字节码能和别的字符串有区别?
    kujio
        9
    kujio  
    OP
       2021-12-07 16:26:20 +08:00
    @guyuesh2 这个只说了 java8 脱糖,更高的 java 版本具体的支持情况也没说
    kujio
        10
    kujio  
    OP
       2021-12-07 16:30:48 +08:00
    @hingbong 没区别就是语法糖,但是我想知道 Android SDK 的 JAva 版本支持的具体情况.
    如果从 java8 到 java17 更新的全都是语法糖并且都能被 Gradle 脱糖,那就可以得出结论:支持 java8 到目前最新版本.
    但显然并不是.
    kujio
        11
    kujio  
    OP
       2021-12-07 16:31:47 +08:00
    @crayygy 屎山加 kotlin 就更麻烦了,
    ikas
        12
    ikas  
       2021-12-07 16:40:59 +08:00   ❤️ 1
    安卓使用 d8 来编译,脱糖..
    其早在多年就支持到高版本 java,官方直到今年才正式加入 java11 支持....
    为啥那么慢...当然是推广 kotlin 了
    jakewharton.com/androids-java-9-10-11-and-12-support/
    kujio
        13
    kujio  
    OP
       2021-12-07 17:04:37 +08:00
    @ikas 啊这个回答到点了,赞一个
    AoEiuV020CN
        14
    AoEiuV020CN  
       2021-12-07 18:33:27 +08:00
    @ikas #12 这个过时了,20 年的 AGP 4.0.0 之前和之后的脱糖是完全两码事,这文章都 18 年了,最新目前看来就是支持所有语法糖,有任何问题可以直接当 bug 反馈,
    ikas
        15
    ikas  
       2021-12-07 18:45:14 +08:00
    @AoEiuV020CN d8 还过时吗???? 建议多看看把....
    AoEiuV020CN
        16
    AoEiuV020CN  
       2021-12-07 18:47:56 +08:00 via Android
    @ikas 不是 d8 过时,是文章过时,
    ikas
        17
    ikas  
       2021-12-07 18:52:05 +08:00
    好吧...文章只是用来说明 d8 对 java 的支持情况.....管中窥豹..同样对于更高 java 的语法..道理也是一样的
    ikas
        18
    ikas  
       2021-12-07 18:54:01 +08:00
    @AoEiuV020CN 另外..即便是 AGP 4.0.0 或者更高..他也是脱糖+插入支持库...因为本质安卓的虚拟机并没支持更高,这与 java 是不同的
    pursuer
        19
    pursuer  
       2021-12-07 19:01:49 +08:00
    建议使用 kotlin ,语法糖可以脱糖,但 API 不会,有时候低版本 android 上调用了高版本 API 程序直接挂了,还会碰到像这样的坑 https://www.v2ex.com/t/717605#reply6 。如果要覆盖较广范围的 android 版本,我觉得还是不用原生最好,原生只写一些胶水。android 的 jvm 运行环境比较坑
    mxalbert1996
        20
    mxalbert1996  
       2021-12-07 19:09:32 +08:00 via Android
    402159806
        21
    402159806  
       2021-12-09 10:22:50 +08:00
    gradle 里改好版本直接用,只是会提示你需要 api 24 ,如果最低版本就是 24 那没问题,脱糖也只是把 1.8 的部分新语法脱糖了,其他的还是需要 api 24
    yukiww233
        22
    yukiww233  
       2021-12-10 17:59:39 +08:00
    大部分语法脱应该能用, 支持的 api 得看官方的列表
    https://developer.android.com/studio/write/java8-support-table
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2575 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 15:28 · PVG 23:28 · LAX 07:28 · JFK 10:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.