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

android SDK 的 Java 版本支持

  •  
  •   kujio · 167 天前 · 2282 次点击
    这是一个创建于 167 天前的主题,其中的信息可能已经有所发展或是发生改变。

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