Android Studio Android Flutter问题记录 - UNABLE TO FIND BUNDLED JAVA VERSION

2024-01-21

前言

有个紧急问题需要修复,本以为很快就能解决继续休假,没想到项目打开运行后Android端跑不起来了,iOS端正常运行,这就有点莫名其妙,明明放假前还是没问题的,难道我拉取的最新代码有问题?不会吧,谁放假还敲代码啊?樂️看了下最新的提交记录,还是放假前我提交的,那就肯定不是项目的问题。

开发环境

Android Studio: 2022.1.1 Flutter: 3.3.10

问题描述 :

Android端构建运行失败,报错信息如下:

Execution failed for task ':app:processDebugMainManifest'.

> Unable to make field private final java.lang.String java.io.File.path accessible: module java.base does not "opens java.io" to unnamed module

问题分析

先网上搜一搜,大部分都是说JDK版本有问题,提到JDK版本我想到放假最后一天升级了Android Studio版本,从2021.3.1升级到2022.1.1,这应该算大版本更新,难道是这个升级导致JDK版本出问题了。尝试设置项目的JDK版本,折腾一番无果。

既然是Flutter项目,那可以尝试用Flutter命令检查Android Studio正不正常:

flutter doctor

执行输出:

[✓] Flutter (Channel stable, 3.3.10, on macOS 13.0.1 22A400 darwin-x64, locale

zh-Hans-CN)

[!] Android toolchain - develop for Android devices (Android SDK version 33.0.1)

✗ Android license status unknown.

Run `flutter doctor --android-licenses` to accept the SDK licenses.

See https://flutter.dev/docs/get-started/install/macos#android-setup for

more details.

[✓] Xcode - develop for iOS and macOS (Xcode 14.2)

[✓] Chrome - develop for the web

[!] Android Studio (version 2022.1)

✗ Unable to find bundled Java version.

[✓] IntelliJ IDEA Community Edition (version 2022.3.1)

[✓] VS Code (version 1.74.2)

[✓] Connected device (3 available)

[✓] HTTP Host Availability

原来真有问题,还不止一个,那就逐个解决。

Android license status unknown

这个问题的解决办法Flutter已经给出了,执行下方命令即可:

flutter doctor --android-licenses

执行输出:

Error: A JNI error has occurred, please check your installation and try again

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/prefs/AndroidLocationsProvider has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClass(ClassLoader.java:756)

at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)

at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)

at java.net.URLClassLoader.access$100(URLClassLoader.java:74)

at java.net.URLClassLoader$1.run(URLClassLoader.java:369)

at java.net.URLClassLoader$1.run(URLClassLoader.java:363)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:362)

at java.lang.ClassLoader.loadClass(ClassLoader.java:418)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)

at java.lang.ClassLoader.loadClass(ClassLoader.java:351)

at java.lang.Class.getDeclaredMethods0(Native Method)

at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)

at java.lang.Class.privateGetMethodRecursive(Class.java:3048)

at java.lang.Class.getMethod0(Class.java:3018)

at java.lang.Class.getMethod(Class.java:1784)

at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:650)

at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:632)

好家伙,这命令执行竟然报错了,我记得老早以前执行过没报错,网上一搜又是JDK版本问题。奇了怪了,虽然我电脑上有装多个版本的JDK,但是Android Studio一直是用的自带的JRE。

Unable to find bundled Java version

这个报错是说找不到捆绑的Java版本樂️,难道新版的Android Studio移除了自带的JRE?这么一想好像已经找到问题的根源所在了。接下来就是验证这个想法。

首先把Flutter框架项目代码拉下来,搜索关键词Unable to find bundled Java version:

关键代码(位于Flutter框架项目下的packages/flutter_tools/lib/src/android/android_studio.dart文件):

final String javaPath = globals.platform.isMacOS ?

version != null && version.major < 2020 ?

globals.fs.path.join(directory, 'jre', 'jdk', 'Contents', 'Home') :

globals.fs.path.join(directory, 'jre', 'Contents', 'Home') :

globals.fs.path.join(directory, 'jre');

final String javaExecutable = globals.fs.path.join(javaPath, 'bin', 'java');

if (!globals.processManager.canRun(javaExecutable)) {

_validationMessages.add('Unable to find bundled Java version.');

} else {

// 省略

}

这段代码的作用就是拼接Java可执行程序的路径,并验证是否能执行。现在我们把涉及到路径的几个变量打印出来,打印很简单,这是Dart写的,直接用print方法就可以了。

print('directory: $directory');

print('javaPath: $javaPath');

print('javaExecutable: $javaExecutable');

现在的问题是怎么执行到修改后的文件,当我们执行flutter doctor命令时,会执行到packages/flutter_tools/bin/flutter_tools.dart文件(后面会分析),然后再进一步解析命令执行。所以我们直接通过Dart命令执行flutter_tools.dart文件是不是就可以了。

dart flutter_tools.dart doctor

切换到Flutter框架项目的packages/flutter_tools/bin目录下执行输出:

flutter_tools.dart:1:1: Error: The specified language version is too high. The highest supported language version is 2.18.

// Copyright 2014 The Flutter Authors. All rights reserved.

^

../lib/executable.dart:1:1: Error: The specified language version is too high. The highest supported language version is 2.18.

// Copyright 2014 The Flutter Authors. All rights reserved.

^

../lib/runner.dart:1:1: Error: The specified language version is too high. The highest supported language version is 2.18.

// Copyright 2014 The Flutter Authors. All rights reserved.

^

../lib/src/artifacts.dart:1:1: Error: The specified language version is too high. The highest supported language version is 2.18.

// Copyright 2014 The Flutter Authors. All rights reserved.

^

../lib/src/base/context.dart:1:1: Error: The specified language version is too high. The highest supported language version is 2.18.

// Copyright 2014 The Flutter Authors. All rights reserved.

^

../lib/src/base/io.dart:1:1: Error: The specified language version is too high. The highest supported language version is 2.18.

// Copyright 2014 The Flutter Authors. All rights reserved.

^

../lib/src/base/io.dart:28:8: Error: Expected an identifier, but got ';'.

Try inserting an identifier before ';'.

library;

^

../lib/src/base/logger.dart:1:1: Error: The specified language version is too high. The highest supported language version is 2.18.

// Copyright 2014 The Flutter Authors. All rights reserved.

^

../lib/src/base/platform.dart:1:1: Error: The specified language version is too high. The highest supported language version is 2.18.

// Copyright 2014 The Flutter Authors. All rights reserved.

^

../lib/src/base/template.dart:1:1: Error: The specified language version is too high. The highest supported language version is 2.18.

// Copyright 2014 The Flutter Authors. All rights reserved.

^

执行报错了,原因是Dart SDK版本低了,电脑上当前的Dart SDK版本是2.18,拉下来的Flutter框架项目代码要求更高的版本。这时候不用去下载最新的Dart SDK版本,Flutter框架项目是自带Dart SDK的,位于项目bin/cache/dart-sdk路径下。

2023/01/26更新:以上说明有点问题,实际的Flutter框架项目默认是不带Dart SDK的,如果你没找到,请看补充说明1。

指定Dart可执行程序路径: 

flutter框架项目路径/bin/cache/dart-sdk/bin/dart flutter_tools.dart doctor

或者用这个,这个最终也是用到了bin/cache/dart-sdk/bin/dart: 

flutter框架项目路径/bin/dart flutter_tools.dart doctor

执行输出(省略部分): 

directory: /Applications/Android Studio.app/Contents

javaPath: /Applications/Android Studio.app/Contents/jre/Contents/Home

javaExecutable: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java

接下来检查/Applications/Android Studio.app/Contents路径下文件,可以选择[访达] -> [顶部菜单栏的前往] -> [前往文件夹] -> [输入路径跳转]或[应用程序] -> [Android Studio.app] -> [右键显示包内容] -> [Contents]。

实锤了,新版本的Android Studio真的移除了JRE,jre目录找不到,怪不得报错了,不过多了一个jbr目录,找了个以前的Android Studio版本对比(旧版下载,不是很全):

搜了一下jbr(JetBrains Runtime),原来IDEA老早就开始用了,是基于OpenJDK修改的东西。不知道为什么Android Studio从2022.1.1版本才开始支持,去下载了两个预览版也是没有jre目录了,说明后续应该都没了。

综上,问题的根源在于Android Studo移除了jre目录。那如果我直接修改代码,将路径拼接过程中的jre改为jbr是不是就没问题了,实测可行,执行flutter框架项目路径/bin/cache/dart-sdk/bin/dart flutter_tools.dart doctor命令一切正常。

解决方案

如果你略过了前面的问题分析,请注意,以下所说的jbr所在目录路径为:

macOS系统:/Applications/Android Studio.app/Contents

Windows系统:Android Studio的安装目录

2023/01/30更新:实测以下三种解决方法在Flutter 3.7.0版本依旧适用。对于前两种方法,如果你尝试后未能解决,请先检查上方所说的目录中是否有jre目录或者软链接。

这里提供三种解决方法(任选一种):

简单粗暴的方法

如果是macOS系统,在jbr同目录下创建一个jre目录,然后将jbr目录内的全部文件复制一份到jre目录下即可。 如果是Windows系统,jre目录是存在的,不过里面几乎没东西,可以直接将jbr目录内的全部文件复制一份到jre目录下即可。

创建软链接的方法

如果是macOS系统,切换到jbr所在目录执行命令:

ln -s jbr jre

注意,如果是通过cd命令切换到jbr所在目录,需要对路径中的空格进行转义或用单/双引号包裹路径,例如cd /Applications/Android\ Studio.app/Contents。

如果是Windows系统,使用管理员身份打开终端(可以按Win+X键,然后选择Windows 终端(管理员)),切换到jbr所在目录执行命令:

mklink /D jre jbr

这里有几点要注意:

一定要管理员身份运行,不然权限不足会报错提示你没有足够的权限执行此操作如果打开终端默认用的是PowerShell(输入命令那一行最前面有PS字符),需要输入cmd切换到命令提示符,这是因为PowerShell不支持mklink命令执行命令前需要删除已经存在的jre目录,不然会报错提示当文件已存在时,无法创建该文件右键创建快捷方式实测是行不通的,这种方式创建的快捷方式其实是创建了一个新的文件,只不过这个文件属性里面包含了目标路径,查看这个文件大小,才1000字节。通过mklink命令方式创建的,文件大小和占用空间等属性和目标文件属性一致。

执行flutter doctor输出:

Doctor summary (to see all details, run flutter doctor -v):

[✓] Flutter (Channel stable, 3.3.10, on macOS 13.0.1 22A400 darwin-x64, locale

zh-Hans-CN)

[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.1)

[✓] Xcode - develop for iOS and macOS (Xcode 14.2)

[✓] Chrome - develop for the web

[✓] Android Studio (version 2022.1)

[✓] IntelliJ IDEA Community Edition (version 2022.3.1)

[✓] VS Code (version 1.74.2)

[✓] Connected device (3 available)

[✓] HTTP Host Availability

• No issues found!

一切正常!

2023/01/26更新:注意,修改Flutter SDK文件后,后续使用Flutter命令升级时可能会提示你是否要保留这些改动,一般来说,使用flutter upgrade --force 命令强制升级即可。

快写完了,才发现差点忘了一开始是因为什么原因写这篇文章的,按以上解决方案做,如果执行flutter doctor命令没问题,实测Android端构建运行也恢复正常了,所以这其实是同一个问题导致的,如果感兴趣的话,可以看看补充分析Flutter问题记录 - Unable to find bundled Java version(续)。

补充说明1

如果在Flutter框架项目中没找到Dart SDK,需要先执行命令:

flutter框架项目路径/bin/flutter

执行后,Flutter会自动下载Dart SDK,下载完成后会构建flutter tool,也就是生成flutter_tools.snapshot快照文件。 由于我执行过Flutter命令,所以一开始没注意到项目中默认是不带Dart SDK的。

也许执行命令后你还会遇到这样的问题:

Error: The Flutter directory is not a clone of the GitHub project.

The flutter tool requires Git in order to operate properly;

to install Flutter, see the instructions at:

https://flutter.dev/get-started

解决方法:使用Git工具拉取Flutter框架项目代码,不要直接下载。

补充说明2

如果生成flutter_tools.snapshot快照文件失败,报错提示:

../lib/src/test/flutter_tester_device.dart:180:11: Warning: Operand of null-aware operation '!' has type 'Uri' which excludes null.

- 'Uri' is from 'dart:core'.

forwardingUri!,

^

../lib/runner.dart:9:8: Error: Error when reading '../../../.pub-cache/hosted/pub.flutter-io.cn/args-2.3.1/lib/command_runner.dart': No such file or directory

import 'package:args/command_runner.dart';

^

../lib/src/runner/flutter_command.dart:6:8: Error: Error when reading '../../../.pub-cache/hosted/pub.flutter-io.cn/args-2.3.1/lib/command_runner.dart': No such file or directory

import 'package:args/command_runner.dart';

^

../lib/runner.dart:10:8: Error: Error when reading '../../../.pub-cache/hosted/pub.flutter-io.cn/intl-0.17.0/lib/intl.dart': No such file or directory

import 'package:intl/intl.dart' as intl;

^

../lib/runner.dart:11:8: Error: Error when reading '../../../.pub-cache/hosted/pub.flutter-io.cn/intl-0.17.0/lib/intl_standalone.dart': No such file or directory

import 'package:intl/intl_standalone.dart' as intl_standalone;

^

../lib/src/runner/flutter_command_runner.dart:6:8: Error: Error when reading '../../../.pub-cache/hosted/pub.flutter-io.cn/args-2.3.1/lib/command_runner.dart': No such file or directory

import 'package:args/command_runner.dart';

^

../lib/src/artifacts.dart:5:8: Error: Error when reading '../../../.pub-cache/hosted/pub.flutter-io.cn/file-6.1.4/lib/memory.dart': No such file or directory

import 'package:file/memory.dart';

^

../lib/src/cache.dart:8:8: Error: Error when reading '../../../.pub-cache/hosted/pub.flutter-io.cn/file-6.1.4/lib/memory.dart': No such file or directory

import 'package:file/memory.dart';

^

../lib/src/artifacts.dart:6:8: Error: Error when reading '../../../.pub-cache/hosted/pub.flutter-io.cn/process-4.2.4/lib/process.dart': No such file or directory

import 'package:process/process.dart';

^

../lib/src/cache.dart:10:8: Error: Error when reading '../../../.pub-cache/hosted/pub.flutter-io.cn/process-4.2.4/lib/process.dart': No such file or directory

import 'package:process/process.dart';

^

../lib/src/commands/analyze.dart:6:8: Error: Error when reading '../../../.pub-cache/hosted/pub.flutter-io.cn/process-4.2.4/lib/process.dart': No such file or directory

import 'package:process/process.dart';

^

执行命令获取flutter_tools所需要的依赖包即可解决:

flutter update-packages

总结

写完这篇文章,想着不知道有没有人提issue,要是没人提,我去提一个。没想到,老早就有人提了issue,应该是用Android Studio预览版的人提的,最近也还有人不断在重复提。

最后

如果这篇文章对你有所帮助,请不要吝啬你的点赞!加星!,谢谢~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Studio Android Flutter问题记录 - UNABLE TO FIND BUNDLED JAVA VERSION 的相关文章

随机推荐

  • 做测试不会 SQL?超详细的 SQL 查询语法教程来啦!

    前言 作为一名测试工程师 工作中在对测试结果进行数据比对的时候 或多或少要和数据库打交道的 要和数据库打交道 那么一些常用的sql查询语法必须要掌握 最近有部分做测试小伙伴表示sql查询不太会 问我有没有sql查询语法这一块的文档可以学习
  • 一台java服务器可以跑多少个线程?

    一台java服务器可以跑多少个线程 一台java服务器能跑多少个线程 这个问题来自一次线上报警如下图 超过了我们的配置阈值 打出jstack文件 通过IBM Thread and Monitor Dump Analyzer for Java
  • 查找薪水记录超15条的员工号emp_no以及其对应的记录次数

    理想 大模型面经 23届试用期没通过 还能找到工作吗 有没有啥厂招往届生啊 腾讯音乐前端暑期实习一面 已oc 华为od 机试 面试面经 华为OD技术岗面经汇总 软开 算法 测试岗 想看一下大家看法 一个月过去了 25终于找到JAVA实习 华
  • 怎么把视频压缩变小?节约空间的工具推荐

    nbsp 我平时逛街的时候 看见有趣的事情就忍不住会用视频的方式记录下来 有时候还会拍给朋友看 但是 这些视频占据大量的存储空间 给我的手机带来不小的压力 所以有时候 为了方便分享或传输 我就会将视频文件压缩 以便更轻松地将其发送给朋友或发
  • 海报模板怎么进行编辑文字?公司宣传海报就这样做

    作为负责公司宣传事宜的部门 我每天不是在做海报 就是在找做海报的素材 力求要把这些宣传的物料都做得精致又有内容 经过我长时间的试用下来 给大家从基本功能 使用体验和不同场景下的应用这几个方面 总结出了海报制作软件哪个好用 接下来就让我为你详
  • Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业

    项目说明 随着公司的快速发展 企业人员和经营规模不断壮大 公司对内部招采管理的提升提出了更高的要求 在企业里建立一个公平 公开 公正的采购环境 最大限度控制采购成本至关重要 符合国家电子招投标法律法规及相关规范 以及审计监督要求 通过电子化
  • 【计算机选题推荐】校园兼职小程序的设计与实现

    精彩专栏推荐订阅 在下方主页 作者主页 计算机毕设木哥 文章目录 一 项目介绍 二 开发环境 三 系统展示 四 代码展示 五 项目总结 font color fe2c24 大家可以帮忙点赞 收藏 关注 评论啦 一 项目介绍 随着高等教育的普
  • tcpdump抓包

    tcpdump抓包 基本概念 1 类型的关键字 host 指明一台主机 如 host 10 1 110 110 net 指明一个网络地址 如 net 10 1 0 0 port 指明端口号 如 port 8090 2 确定方向的关键字 sr
  • Vue 如何使用WebSocket与服务器建立链接 持续保持通信

    WebSocket 浏览器通过JavaScript向服务器发出建立WebSocket链接的请求 链接建立后 客户端和服务器端就可以通过TCP链接直接交互数据 WebSocket链接后可以通过 send 方法来向服务器发送数据 并通过 onn
  • 不要再苦苦寻觅了!AI 大模型面试指南(含答案)的最全总结来了!

    AI 大模型技术经过2023年的狂飙 2024年必将迎来应用的落地 对 IT 同学来讲 这里蕴含着大量的技术机会 越来越多的企业开始招聘 AI 大模型岗位 本文梳理了 AI 大模型开发技术的面试之道 从 AI 大模型基础面 AI 大模型进阶
  • CAP与BASE理论

    CAP与BASE理论 CAP 一个分布式系统最多只能同时满足一致性 Consistency 可用性 Availability 和分区容错性 Partition tolerance 这三项中的两项 C一致性 状态的一致性 缓存 数据库 集群等
  • 图片翻译在线怎么用?分享翻译软件给你

    作为一个不擅长学习语言的人 我真是要被生活中似乎无处不在的英语搞蒙了 想象一下 你正在逛商场 想买一瓶洗护用品 拿起来却看到商品上满是看不懂英文说明 是不是一头雾水 或者 你在浏览社交媒体时 看到一张充满英文的趣味图片 却因为语言障碍而错过
  • 挖掘知识的宝藏:如何利用在线资源提升个人技能

    在这个信息爆炸的时代 互联网已经成为我们获取知识 提升技能的重要途径 无论是学习编程 提高语言能力 还是了解新的行业趋势 网络资源都为我们提供了无限可能 本文将探讨如何有效利用在线资源进行自我提升 一 选择合适的在线学习平台 首先 我们需要
  • 电脑操作系统的发展史:从初级到高级的演变

    自电脑诞生以来 操作系统作为其重要组成部分 不断推动着电脑技术的进步与发展 本文将带您回顾电脑操作系统的发展历程 探究其在不同阶段的特点与影响 一 早期操作系统 真空管与批处理 在电脑诞生初期 真空管技术占主导地位 此时的操作系统尚未形成完
  • 人工智能 AI 如何让我们的生活更加便利

    每个人都可以从新技术中获益 一想到工作或生活更为便利 简捷且拥有更多空余时间 谁会不为之高兴呢 借助人工智能 每天能够多一些空余时间 或丰富自己的业余生活 为培养日常兴趣爱好增添一点便利 从电子阅读器到智能家居 再到植物识别应用和智能室内花
  • 鸿蒙开发Flex、栅格布局详解

    Flex弹性布局 一 direction 1 FlexDirection Row 主轴为水平方向 子组件从起始端沿着水平方向开始排布 2 FlexDirection RowReverse 主轴为水平方向 子组件从终点端沿着FlexDirec
  • 独家 | 鸿蒙(HarmonyOS)开发详细学习笔记免费分享

    前言 华为宣布 将在1月18日 在北京 上海 杭州 南京 成都 厦门 武汉 长沙 8 大城市同时召开大会 届时将揭秘鸿蒙生态和 HarmonyOS NEXT 进阶新篇章 简单的来说就是 纯血鸿蒙系统 即将彻底揭晓 鸿蒙系统自推出来以来 就一
  • SpringBoot中整合ElasticSearch快速入门以及踩坑记录

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目 若依前后端分离版手把手教你本地搭建环境并运行项目 本地运行若依前后端分离 CSDN博客 参考上面搭建项目 ElaticSearch Elasticsearch 是java开发的 基于
  • 会议设备:提升会议体验与效率的关键

    在当今高度信息化的社会 会议已成为企业 机构和团队之间交流与合作的重要方式 而会议设备的选择与使用 对于提升会议的体验与效率具有举足轻重的地位 本文将详细探讨会议设备的重要性 以及如何选择和使用合适的会议设备 以实现高效 顺畅的沟通 首先
  • Android Studio Android Flutter问题记录 - UNABLE TO FIND BUNDLED JAVA VERSION

    前言 有个紧急问题需要修复 本以为很快就能解决继续休假 没想到项目打开运行后Android端跑不起来了 iOS端正常运行 这就有点莫名其妙 明明放假前还是没问题的 难道我拉取的最新代码有问题 不会吧 谁放假还敲代码啊 樂 看了下最新的提交记