返回

Android O 及更高版本中 MethodHandle.invoke 和 MethodHandle.invokeExact 导致构建失败问题详解

Android

Android O 及更高版本中 MethodHandle.invoke 和 MethodHandle.invokeExact 导致的构建失败

简介

随着 Android Studio Gradle 插件的升级,开发人员可能会遇到 Android 应用程序无法构建的问题。错误堆栈跟踪指向 Apache POI 和 Apache log4j 库,这些库使用 Android O 及更高版本不支持的 MethodHandle.invokeMethodHandle.invokeExact 方法。

问题原因

在 Android O(API 26)之前,MethodHandle.invokeMethodHandle.invokeExact 方法不支持。而 Apache POI 和 Apache log4j 库中使用了这些方法。导致在升级 Gradle 插件后,使用这些库的应用程序无法构建。

解决方案

有两种方法可以解决此问题:

方法 1:增加 minSdkVersion

将主模块(app)的 build.gradle 文件中 defaultConfig 块的 minSdkVersion 提高到 28 或更高版本。

defaultConfig {
    ...
    minSdkVersion 28
    ...
}

方法 2:排除有问题的类

在主模块(app)的 build.gradle 文件的 dependencies 块中添加排除语句,以排除 Apache POI 和 Apache log4j 库中导致问题的类。

implementation('org.apache.poi:poi:5.2.5') {
    exclude group: 'org.apache.poi', module: 'poi-ooxml'
}

implementation('org.apache.logging.log4j:log4j-api:2.21.1') {
    exclude group: 'org.apache.logging.log4j', module: 'log4j-core'
}

其他提示

  • 确保应用程序没有直接引用或使用 Apache POI 或 Apache log4j 中的受影响类。
  • 使用最新版本的 Gradle 插件。
  • 如果上述方法都不起作用,请尝试使用以下方法:
    • 清除项目构建缓存:./gradlew clean
    • 同步项目:./gradlew sync
    • 重建项目:./gradlew build

常见问题解答

  1. 为什么在 Android O 之前不支持 MethodHandle.invokeMethodHandle.invokeExact 方法?
    Android O 引入了对 Java 8 的支持,而 MethodHandle.invokeMethodHandle.invokeExact 方法是 Java 8 中引入的。

  2. 为什么 Apache POI 和 Apache log4j 库使用这些不支持的方法?
    这些库在开发时可能依赖于 Java 8,并使用了这些方法。

  3. 除了提高 minSdkVersion 或排除有问题的类之外,还有其他解决方案吗?
    可以使用反射来调用不支持的方法,但这可能导致应用程序不稳定或性能问题。

  4. 如果我无法提高 minSdkVersion,我该怎么办?
    请联系 Apache POI 和 Apache log4j 项目维护者,了解是否提供了针对较低 Android 版本的替代库。

  5. 如何确保我的应用程序不受此问题的未来影响?
    在编写代码时,避免使用 Android O 之前不支持的 API。并经常更新应用程序,使用最新版本的库,这些库已为新版本的 Android 进行了更新。

结论

通过升级 Gradle 插件,开发人员可能会遇到 Android O 及更高版本中 MethodHandle.invokeMethodHandle.invokeExact 方法导致的构建失败。通过提高 minSdkVersion 或排除有问题的类,可以解决此问题。通过采用这些方法,开发人员可以确保他们的应用程序在 Android O 及更高版本上顺利运行。