记 AndroidStudio Tracer工具导致的编译失败

一、前言

大概说一下我们项目一些工具版本情况:

  • JDK : 11

  • gradle:7.3.3

  • AGP:7.2.2

  • Android Studio 版本:

二、编译报错

这天我高高兴兴的开始编译,点了一下 IDE 的这个按钮:

突然,来了一拨飘红:

完整内容如下:

csharp 复制代码
OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/tools/tracer/agent/TraceAgent has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
	at java.base/java.lang.ClassLoader.findBootstrapClass(Native Method)
	at java.base/java.lang.ClassLoader.findBootstrapClassOrNull(ClassLoader.java:1263)
	at java.base/java.lang.System$2.findBootstrapClassOrNull(System.java:2147)
	at java.base/jdk.internal.loader.ClassLoaders$BootClassLoader.loadClassOrNull(ClassLoaders.java:118)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:616)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:640)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:616)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:527)
	at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:431)
	at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)
*** java.lang.instrument ASSERTION FAILED ***: "result" with message agent load/premain call failed at src/java.instrument/share/native/libinstrument/JPLISAgent.c line: 422
FATAL ERROR in native method: processing of -javaagent failed, processJavaStart failed
Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.dylib+0x3829cc]  jni_FatalError+0x138
V  [libjvm.dylib+0x481ce4]  JvmtiExport::post_vm_initialized()+0x18c
V  [libjvm.dylib+0x708640]  Threads::create_vm(JavaVMInitArgs*, bool*)+0x70c
V  [libjvm.dylib+0x3a0c28]  JNI_CreateJavaVM+0x78
C  [libjli.dylib+0x4fe4]  JavaMain+0x104
C  [libjli.dylib+0x7b38]  ThreadJavaMain+0xc
C  [libsystem_pthread.dylib+0x6fa8]  _pthread_start+0x94

-----------------------
Check the JVM arguments defined for the gradle process in:
 - gradle.properties in project root directory

同时,我用命令行进行编译 **./gradlew clean assembleDebug** ,发现可以正常编译通过,这就有点神奇了。我也尝试了重启大法, **重启 IDE、重启电脑、invalidate caches & restart** 都不 work

三、冷静分析

首先看到报错的第一时间,肯定是看清楚报的具体是什么错误,是什么东西导致的。

从错误里我们能看到,一个叫 com/android/tools/tracer/agent/TraceAgent 的文件已经被编译成了 61.0 版本的 class 文件,我们配置的 java 编译环境只能够识别 55.0 版本的 class 文件。从下面表格能看出来,一个是 JDK17,一个是 JDK11。

疑惑一:哪里配的 jdk17?

我们检查一下我们 IDE 上的一些配置,包括:

  1. gradle JDK 配置:
  2. gradle build tools配置:

并没有看到有任何的 JDK 17的配置。

疑惑二: **com/android/tools/tracer/agent/TraceAgent** 究竟是个啥文件?

顺手google一下,找到了这个文件:/studio-master-dev/tracer/BUILD 这个文件里有个配置就是我们报错的这个文件。

四、摸清问题

摸清问题前,我们汇总一下现有的一些信息:

  1. AndroidStudio 的编译不通过,但是命令行能编译通过

  2. 清 IDE 的 cache及一些其他的重启大法都不好使

  3. 报错是说 TraceAgent 是个 JDK17 的 class,无法被我们的编译环境配置的 JDK11 识别

  4. 我们项目里、IDE 的配置里都没有 JDK 17 的配置

  5. gogole 一下 TraceAgent,能在 /studio-master-dev/tracer/BUILD 里找到相关内容

/studio-master-dev/tracer/BUILD 是个啥玩意儿?

看起来是 AndroidStudio 的一个编译期会生效的工具,名叫 tracer,如果真是这样的话:

  1. 能解释的清为啥 IDE 编不过,但是命令行可以,因为命令行编译的过程中,肯定不会有 tracer 的工具在 work。

  2. 能解释的清为啥清各种 IDE 和重启大法不好使,以及为啥报错的是个 JDK17 的 class,是Android Studio的工具肯定不会在大家编译 app 的时候现编然后生效的,只可能是工具提前已经编译好了,而且是用 JDK17 编译的。

接着我们去 IDE 的设置里尝试搜一下 trace 关键字看看,找到了一个好像有关系的设置 Trace Gradle import with profile

我们试着把他关闭一下,重新编译下看看:

最后再正反印证下,把 tracer 的开关打开,果然,再次编译失败,而且跟之前错误一毛一样。

再后面的 tracer 工具到底是个啥,怎么 work 的,没啥兴趣去了解了。

五、写在最后

  1. 遇到问题不要慌,从肉眼可见的线索去发散的多想想
  2. 大家喜欢周末,大家也喜欢下班,国庆节后的两天 周末+下班 大家应该爽死了。
相关推荐
大白要努力!24 分钟前
Android opencv使用Core.hconcat 进行图像拼接
android·opencv
天空中的野鸟1 小时前
Android音频采集
android·音视频
小白也想学C2 小时前
Android 功耗分析(底层篇)
android·功耗
曙曙学编程3 小时前
初级数据结构——树
android·java·数据结构
闲暇部落5 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
诸神黄昏EX7 小时前
Android 分区相关介绍
android
大白要努力!8 小时前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
Estar.Lee8 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
Winston Wood8 小时前
Perfetto学习大全
android·性能优化·perfetto
浩宇软件开发8 小时前
Android开发,使用TabLayout+ViewPager2实现校园健康安全宣传
android studio·android开发