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
Análise do Problema Após pesquisar na internet, a maioria das soluções apontava para problemas com a versão do JDK. Isso me fez lembrar que na última manhã antes do feriado, fiz uma atualização do Android Studio da versão 2021.3.1 para a 2022.1.1. Será que essa atualização grande causou o problema com o JDK? Tentei configurar a versão do JDK do projeto, mas sem sucesso. Como é um projeto Flutter, decidi verificar o Android Studio usando comandos do Flutter:
flutter doctor
A saída mostrou:
[✓] 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
Realmente havia problemas, mais de um, então precisei resolvê-los um por um.
Android License Status Unknown O próprio Flutter sugere a solução, basta executar:
flutter doctor --android-licenses
A saída apresentou erro:
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
O comando apresentou erro! Lembro-me de ter executado isso antes sem problemas. Pesquisando, novamente o problema estava relacionado à versão do JDK. Embora eu tenha várias versões do JDK instaladas, o Android Studio sempre usou o JRE embarcado.
Unable to Find Bundled Java Version Esta mensagem indicava que não conseguia encontrar a versão Java embarcada. Será que a nova versão do Android Studio.removeu o JRE interno? Essa parecia ser a raiz do problema. Hora de investigar.
Primeiro, fiz o download do código-fonte do Flutter e pesquisei pelo termo "Unable to find bundled Java version". O código的关键部分 está no arquivo packages/flutter_tools/lib/src/android/android_studio.dart:
final String caminhoJava = globals.platform.isMacOS ?
versao != null && versao.major < 2020 ?
globals.fs.path.join(diretorio, 'jre', 'jdk', 'Contents', 'Home') :
globals.fs.path.join(diretorio, 'jre', 'Contents', 'Home') :
globals.fs.path.join(diretorio, 'jre');
final String executavelJava = globals.fs.path.join(caminhoJava, 'bin', 'java');
if (!globals.processManager.canRun(executavelJava)) {
_mensagensValidacao.add('Unable to find bundled Java version.');
} else {
// código omitido
}
Este código monta o caminho do executável Java e verifica se pode ser executado. Decidi adicionar prints para debugar:
print('diretorio: $diretorio');
print('caminhoJava: $caminhoJava');
print('executavelJava: $executavelJava');
Para executar o código modificado, utilizei o arquivo flutter_tools.dart que é invocado quando rodamos o comando flutter doctor. executei:
dart flutter_tools.dart doctor
No diretório packages/flutter_tools/bin do projeto Flutter, mas ocorreu erro de versão do Dart SDK:
Error: The specified language version is too high. The highest supported language version is 2.18.
O Dart SDK do sistema estava desatualizado. Por isso, utilizei o Dart SDK embarcado no Flutter, localizado em bin/cache/dart-sdk/bin/dart.
Atualização 2023/01/26: O projeto Flutter não traz o Dart SDK por padrão. Se não encontrar, consulte a nota de supplemento 1.
Comando executado:
caminho/do/projeto/flutter/bin/cache/dart-sdk/bin/dart flutter_tools.dart doctor
Saída (parcial):
diretorio: /Applications/Android Studio.app/Contents
caminhoJava: /Applications/Android Studio.app/Contents/jre/Contents/Home
executavelJava: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java
Então, verifiquei manualmente o diretório /Applications/Android Studio.app/Contents. Encontrei algo surpreendente: a nova versão do Android Studio.removeu realmente o diretório jre! Em vez disso, havia um diretório chamado jbr.
Pesquisei sobre o jbr (JetBrains Runtime) e descobri que o IDEA já utiliza há muito tempo. É baseado no OpenJDK com modificações. Não sei por que o Android Studio só passou a suportar isso a partir da versão 2022.1.1.
Confirmado: a causa raiz é a remoção do diretório jre pelo Android Studio. 修改ando o código para usar jbr em vez de jre, funcionou corretamente.
Soluções As soluções a seguir consideram o diretório jbr em: macOS: /Applications/Android Studio.app/Contents Windows: Diretório de instalação do Android Studio Atualização 2023/01/30: As três soluções abaixo funcionam no Flutter 3.7.0. Para as duas primeiras, verifique se existe o diretório jre ou link simbólico.
Método Simples (Cópia de Arquivos) No macOS, crie um diretório jre no mesmo nível do jbr e copie todo o conteúdo do jbr para ele. No Windows, o diretório jre existe, mas está vazio. Basta copiar o conteúdo do jbr para o jre.
Método com Link Simbólico No macOS, execute no terminal:
ln -s jbr jre
Cuidado com espaços no caminho. Use escape ou aspas: cd /Applications/Android\ Studio.app/Contents No Windows, execute o terminal como administrador (Win+X → Windows Terminal (Admin)):
mklink /D jre jbr
Notas importantes: Execute sempre como administrador, ou receberá erro de permissão Se o terminal estiver no PowerShell (começa com PS), digite cmd para usar o Prompt de Comando Apague o diretório jre existente antes de criar o link simbólico Criar atalho pelo menu de contexto não funciona - o arquivo criado tem apenas 1000 bytes
Saída do flutter doctor após a correção:
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!
Tudo funcionando!
Atualização 2023/01/26: Após modificar arquivos do Flutter SDK, o comando flutter upgrade pode perguntar se deseja manter as alterações. Use flutter upgrade --force para forçar a atualização.
Supplemento 1 - Dart SDK Não Encontrado Se o Dart SDK não existir no projeto Flutter, execute:
caminho/do/projeto/flutter/bin/flutter
O Flutter baixará automaticamente o Dart SDK e construirá o snapshot flutter_tools.snapshot. Se encontrar o erro:
Error: The Flutter directory is not a clone of the GitHub project.
The flutter tool requires Git in order to operate properly;
Resolução: Baixe o projeto usando Git, não com download direto.
Supplemento 2 - Falha na Geração do Snapshot Se houver erro ao gerar flutter_tools.snapshot relacionado a dependências:
Error when reading '../../../.pub-cache/hosted/pub.flutter-io.cn/args-2.3.1/lib/command_runner.dart'
Execute para resolver:
flutter update-packages
Conclusão Pesquisando, descobri que o issue já havia sido reportado por usuários de versões preview do Android Studio, e continua sendo reportado frequentemente.
Se este artigo foi útil, considere deixar sua星!