繁体   English   中英

Android Studio (Windows) 中的 Flutter 错误:无法识别的选项:--add-opens

[英]Flutter error in Android Studio (Windows): Unrecognized option: --add-opens

我一直在开发一个 Flutter 应用程序,在过去的几周里我已经成功地在 Android 模拟器和物理设备上运行。 不知何故,突然间,我无法在调试模式下运行它。 我尝试了在 SO 中找到的几个答案,但它们似乎都是无法真正解决问题的技巧。

错误

当我尝试运行该应用程序时,Gradle 守护进程抛出错误,因为它无法创建 JVM,如下面的屏幕截图所示...

在此处输入图像描述

Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Unrecognized option: --add-opens

可能的原因???

我记得我将 Gradle 插件升级到我不知道的版本,我并没有真正关注它(我的错)但我继续工作没有任何问题。 然后,我将 Flutter 升级到版本 2.2.2,那时问题开始蔓延(也许)。

支持信息

操作系统:Windows Server 2016 标准版 (x64)
IDE:Android Studio Artic Fox 2020.3.1
颤动版本:2.2.2
JAVA_HOME:指向 JDK 1.8

项目结构 -> 项目设置 -> 项目

在此处输入图像描述

Java版本...

在此处输入图像描述

颤振医生输出...

在此处输入图像描述

摇篮文件

android/build.gradle

buildscript {
    ext.kotlin_version = '1.3.50'
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

应用程序/build.gradle

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
    compileSdkVersion 30

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.domain.app_name"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

是否有明显的错误修复方法?
自从我开始这个项目以来,我已经有大约 2 年没有在 Android 上工作了,所以我的问题可能很明显。 我可能在这里遗漏了一些东西,但如果我遗漏了,请告诉我,我会更新答案。

--add-opens选项本身是合法的,我觉得不是根本原因,请看https://docs.oracle.com/en/java/javase/16/migrate/migrating-jdk-8-later -jdk-releases.html#GUID-12F945EB-71D6-46AF-8C3D-D354FD0B1781

我认为这可能是 java 版本问题,请尝试检查您的机器上有哪些可用的 SDK

4个选项

  1. 使用最新的 Gradle

  2. 将 JDK 版本设置为嵌入式 JDK

为什么?

最新的 OpenJDK 副本与 Android Studio 2.2+ 捆绑在一起。 这是GOOGLE推荐的JDK版本。

要使用捆绑的 JDK,请执行以下操作:

如何?

Android Studio > Preferences... > Build, Execution, Deployment > Build Tools > Gradle 在 Gradle JDK 下,选择 Embedded JDK 选项。 单击确定。

对于窗户

选择 File > Settings... > Build, Execution, Deployment > Build Tools > Gradle 在 Gradle JDK 下,选择 Embedded JDK 选项。

  1. --add-opens 如果必须允许类路径上的代码进行深度反射以访问非公共成员,则使用--add-opens 运行时选项。

一些库进行深度反射,意思是 setAccessible(true),因此它们可以访问所有成员,包括私有成员。 您可以使用 java 命令行上的 --add-opens 选项授予此访问权限。 使用此选项不会生成任何警告消息。

如果 --illegal-access=deny,并且您在运行时看到 IllegalAccessException 或 InaccessibleObjectException 消息,您可以使用 --add-opens 运行时选项,将参数基于异常消息中显示的信息。

  1. 配置 jvm 选项 从版本 9 开始,Java 编译器可以配置为为旧版本的 Java 生成字节码,同时确保代码不使用更新版本的任何 API。 Gradle 现在支持 CompileOptions 上的这个发布标志直接用于 Java 编译。 此选项优先于下面描述的属性。

由于 Java 9 中的一个错误已在 Java 10 中修复,因此 Gradle 在使用 Java 9 进行编译时无法利用发布标志。

示例 6. 设置 Java 发布标志 GroovyKotlin build.gradle compileJava { options.release = 7 } Java 编译器的历史选项仍然可用:

了解更多信息https://docs.gradle.org/current/userguide/gradle_daemon.html

请检查 gradel/properties 文件

 org.gradle.jvmargs=-Xmx1536M --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED 
 android.useAndroidX=true
 android.enableJetifier=true

将此更改为:-

在此处输入图像描述

删除 jvmargs 之后的行

让我知道这是否可行。 干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM