安卓Build—SDK, JDK适配简明指南

1. SDK 配置

Android 配置时有3个SDK 版本需要指定:

  • compileSdk  指定编译apk时使用的sdk,决定了开发时所能调用的API特性

  • minSdk  指定向下兼容的最小sdk版本。低于此版本的安卓设备尝试安装你的软件时将会失败,显示不兼容或无法安装

  • targetSdk a. 声明开发者测试过的目标设备sdk。b. 软件运行时的行为保持一致。当软件运行在比targetSdk版本更新的设备上时系统会尽量提供兼容一致的用户体验

(1)强制性规则

 minSdk  <=  开发者能使用的API  <= compileSdk 

试图使用大于compileSdk版本的API将会导致编译报错

(2)推荐配置
  • compileSdk 选择最新,targetSdk选择开发者仔细测试过的最高sdk。一般来说,当Google发布新的sdk时,项目可以更新compileSdk, 在测试过新sdk后再提高targetSdk。官方文档中提出targetSdk 必须 <= compileSdk。显然如果targetSdk > compileSdk的话,意味着开发者声明软件的目标是高版本sdk设备,但却是用低版本sdk编译的,不合理。(但是即使这么写,编译一般还是能通过的)

2. Gradle JDK 配置

当SDK配置好后,能使用的Java API 便被限制性确定了。开发者需要做的是尽可能增强向下兼容性。此处配置默认Android Studio 和Gradle是目前新版,JDK讨论长期支持版(8,11,17,21)。

(1)JDK的选择

截至目前,Android 14(API34) 及以上支持Java 17 的一些API 

此外,最新版AGP(Android Gradle Plugin)  8.x 要求JDK>=17 因此新项目一般JDK 至少17

具体可用JDK 版本可对照Gradle Java Support Table 以及 AGP 和Gradle版本关系表AGP Gradle Support Table 查看。若您使用最新版AGP,则可选择JDK17 或21

(2)兼容性

sourceCompatibility 限定源码最高可使用的Java语言特性,例如lambda, var等。例如设定了Java8语法,则源码中无法使用更新的语法。主要影响开发效率。

targetCompatibility 则指定生成的.class字节码文件的版本。安卓R8 D8 编译器会对.class 优化生成.dex

新版8.x AGP 默认支持Java 8 的lambda 等语言特性,即使老版本安卓设备内的ART(Android Runtime)不支持,AGP也会自动Desugar,在编译时将语法糖改写为所有设备兼容的字节码。因此,最低兼容性配置为 Java 8,没有必要设置更低。

compileOptions {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

此外,Android 还有Java 8 , 11 的API 的额外支持,详见 Java 8, 11 Desugar

通过添加额外的库,可以使用Java 8 的Stream以及Java 11 的一些API 而无需担心向下兼容。编译时会自动添加额外的Java库到apk中,通过给软件打补丁,使其与旧设备兼容。

android {
    defaultConfig {
        // Required when setting minSdkVersion to 20 or lower
        multiDexEnabled = true
    }

    compileOptions {
        // Flag to enable support for the new language APIs

        // For AGP 4.1+
        isCoreLibraryDesugaringEnabled = true
        // For AGP 4.0
        // coreLibraryDesugaringEnabled = true

        // Sets Java compatibility to Java 8
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}

dependencies {
    // For AGP 7.4+
    coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")
    // For AGP 7.3
    // coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.2.3")
    // For AGP 4.0 to 7.2
    // coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.9")
}

JDK配置总结:   

  • 最保守的写法是兼容Java 8, (如果要用stream等额外的API,添加desugar 库)。
  • 在添加了desugar 库的前提下,兼容Java 11 比较稳定。
  • 如果想要利用新版安卓的Java 17 API支持,选择兼容 Java 17, 则需要格外注意minSdk不兼容的Java 17 API,因为desugar 库目前似乎并不支持Java 17。

具体情况请详细参考资料中引用的官方文档,最好利用Android Studio虚拟机全面测试。安卓兼容性问题比较复杂,开发效率和适配性的平衡是关键。

参考资料

Use Java 8 language features and APIs  |  Android Studio  |  Android Developers

Java 11+ APIs available through desugaring  |  Android Studio  |  Android Developers

Which Java APIs can I use in my Java or Kotlin source code? | Android Developers

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值