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

Posted

技术标签:

【中文标题】Android Studio (Windows) 中的 Flutter 错误:无法识别的选项:--add-opens【英文标题】:Flutter error in Android Studio (Windows): Unrecognized option: --add-opens 【发布时间】:2021-10-16 16:53:24 【问题描述】:

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

错误

当我尝试运行应用程序时,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 版本...

颤振医生输出...

Gradle 文件

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


app/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 上工作了,所以我的问题可能很明显。 我可能在这里遗漏了一些东西,但如果我遗漏了,请告诉我,我会更新答案。

【问题讨论】:

Java_Home 指向 1.8 但您的项目似乎指向其他有 SDK,运行颤振医生并检查它使用哪个 可以添加flutter医生结果吗 【参考方案1】:

--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 可用

【讨论】:

【参考方案2】:

4 个选项

    使用最新的 Gradle

    将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 选项。

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

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

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

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

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

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

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

【讨论】:

感谢您的回答。要么我的设置存在根本性错误,要么您的某些观点针对不同版本的 Android Studio。 (1) 我使用的是 gradle wrapper 6.7 版(不一定是最新的),但为了解决这个问题,我降级到了 4.10。 (2) 我使用的是嵌入式 JDK,但在 Gradle 下没有设置嵌入式 JDK 的选项 (4) 我可能会尝试在本地环境中升级 java 版本 是的。 Android Studio Artic Fox 2020.3.1 @Leo 请按照@UmAnusorn 所说的进行操作。 Project Structure -> Project Settings -> Modules。单击'+' 符号并选择'Android' 按应用。这也应该解决可能出现的一些问题。我也在使用 Android Studio Artic Fox 2020 并遇到了类似的问题。

以上是关于Android Studio (Windows) 中的 Flutter 错误:无法识别的选项:--add-opens的主要内容,如果未能解决你的问题,请参考以下文章

[Android] Windows 7下 Android studio 安装 Genymotion 来调试 Android 遇到的问题总结

为啥我的Android studio里面没有Preview。在View-Tool Windows

windows7平台android studio新建Android项目,报错

Android Studio 无法在 Windows 7 上运行 [重复]

安装android studio需要配置哪些环境

Android studio 如何启动