记 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. 大家喜欢周末,大家也喜欢下班,国庆节后的两天 周末+下班 大家应该爽死了。
相关推荐
Jouzzy5 小时前
【Android安全】Ubuntu 16.04安装GDB和GEF
android·ubuntu·gdb
极客先躯5 小时前
java和kotlin 可以同时运行吗
android·java·开发语言·kotlin·同时运行
茜茜西西CeCe7 小时前
移动技术开发:登录注册界面
java·gitee·gradle·android studio·安卓·移动技术开发·原生安卓开发
Good_tea_h8 小时前
Android中的单例模式
android·单例模式
计算机源码社12 小时前
分享一个基于微信小程序的居家养老服务小程序 养老服务预约安卓app uniapp(源码、调试、LW、开题、PPT)
android·微信小程序·uni-app·毕业设计项目·毕业设计源码·计算机课程设计·计算机毕业设计开题
丶白泽13 小时前
重修设计模式-结构型-门面模式
android
晨春计14 小时前
【git】
android·linux·git
标标大人15 小时前
c语言中的局部跳转以及全局跳转
android·c语言·开发语言
竹林海中敲代码15 小时前
Qt安卓开发连接手机调试(红米K60为例)
android·qt·智能手机
木鬼与槐16 小时前
MySQL高阶1783-大满贯数量
android·数据库·mysql