文章目录
  1. 1. 升级遇到的问题
  2. 2. 解决问题
  3. 3. 为什么要用听云

升级遇到的问题

项目中由于需要,集成了听云的SDK,最近把听云的SDK版本从2.4.4升级到2.5.7,重新运行时,在编译过程中报了如下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
[NBSAgent.error] Error:com.networkbench.agent.compile.a: NetworkBench NewLens Android Agent Error: Your agent and class rewriter versions do not match: agent = 2.4.4 class rewriter = 2.5.7. You probably need to update one of these components.
java.lang.RuntimeException: com.networkbench.agent.compile.a: NetworkBench NewLens Android Agent Error: Your agent and class rewriter versions do not match: agent = 2.4.4 class rewriter = 2.5.7. You probably need to update one of these components.
at com.networkbench.agent.compile.NBSStubPreMain$e.a(SourceFile:517)
at com.networkbench.agent.compile.NBSStubPreMain$e.a(SourceFile:296)
at com.networkbench.agent.compile.NBSStubPreMain$e$1$1.invoke(SourceFile:328)
at com.networkbench.agent.compile.NBSStubPreMain$e.invoke(SourceFile:425)
at com.android.dx.command.dexer.Main.processClass(Main.java)
at com.android.dx.command.dexer.Main.processFileBytes(Main.java:723)
at com.android.dx.command.dexer.Main.access$1200(Main.java:85)
at com.android.dx.command.dexer.Main$FileBytesConsumer.processFileBytes(Main.java:1653)
at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
at com.android.dx.command.dexer.Main.processOne(Main.java:677)
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:569)
at com.android.dx.command.dexer.Main.runMultiDex(Main.java:366)
at com.android.dx.command.dexer.Main.run(Main.java:275)
at com.android.dx.command.dexer.Main.main(Main.java:245)
at com.android.dx.command.Main.main(Main.java:106)
Caused by: com.networkbench.agent.compile.a: NetworkBench NewLens Android Agent Error: Your agent and class rewriter versions do not match: agent = 2.4.4 class rewriter = 2.5.7. You probably need to update one of these components.
at com.networkbench.agent.compile.a.e.a(SourceFile:91)
at com.networkbench.agent.compile.a.h.a(SourceFile:43)
at com.networkbench.agent.compile.b.f.a(SourceFile:644)
at com.networkbench.agent.compile.b.f.a(SourceFile:439)
at com.networkbench.agent.compile.NBSStubPreMain$e.a(SourceFile:479)
... 16 more
Dex: Error converting bytecode to dex:
Cause: java.lang.RuntimeException: Exception parsing classes
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: Exception parsing classes
at com.android.dx.command.dexer.Main.processClass(Main.java:760)
at com.android.dx.command.dexer.Main.processFileBytes(Main.java:723)
at com.android.dx.command.dexer.Main.access$1200(Main.java:85)
at com.android.dx.command.dexer.Main$FileBytesConsumer.processFileBytes(Main.java:1653)
at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
at com.android.dx.command.dexer.Main.processOne(Main.java:677)
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:569)
at com.android.dx.command.dexer.Main.runMultiDex(Main.java:366)
at com.android.dx.command.dexer.Main.run(Main.java:275)
at com.android.dx.command.dexer.Main.main(Main.java:245)
at com.android.dx.command.Main.main(Main.java:106)
Caused by: java.lang.NullPointerException
at com.android.dx.util.ByteArray.<init>(ByteArray.java:76)
at com.android.dx.cf.direct.DirectClassFile.<init>(DirectClassFile.java:206)
at com.android.dx.command.dexer.Main.parseClass(Main.java:769)
at com.android.dx.command.dexer.Main.access$1500(Main.java:85)
at com.android.dx.command.dexer.Main$ClassParserTask.call(Main.java:1700)
at com.android.dx.command.dexer.Main.processClass(Main.java:755)
... 12 more
1 error; aborting
:app:transformClassesWithDexForDebug FAILED
:app:networkBenchNewLensDeinstrumentTask
[NBSAgent.debug] NetworkBench begin
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: Error while executing java process with main class com.android.dx.command.Main with arguments {--dex --num-threads=4 --multi-dex --main-dex-list /data/jenkins/workspace/app/build/intermediates/multi-dex/debug/maindexlist.txt --output /data/jenkins/workspace/app/build/intermediates/transforms/dex/debug/folders/1000/1f/main /data/jenkins/workspace/app/build/intermediates/transforms/jarMerging/debug/jars/1/1f/combined.jar}
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED

解决问题

遇到了上面的编译错误问题,先google了一下,没有人提出了这样的错误,也没有解决方案,而且从搜索的结果来看,用的人也不多。这问题只能是自己解决了,从上面的错误提示来看,这个错误是听云中抛出来的。也就是听云干预了编译过程。从这个NetworkBench NewLens Android Agent Error: Your agent and class rewriter versions do not match: agent = 2.4.4 class rewriter = 2.5.7. You probably need to update one of these components.错误提示上来看,说是版本没有对应起来。的确,听云在project下面的build.gradle中的dependencies块中的classpath中和module下面的build.gradle中的dependencies块中的compile两个地方都要指定一个版本SDK。一个是用来干预编译过程,植入代码;一个则是要植入的代码。

引入方式如下代码所示:

project目录下面的build.gradle

1
2
3
4
5
6
dependencies {
classpath 'com.networkbench.newlens.agent.android:agent-gradle-plugin:2.5.7'
}

app目录下面的build.gradle

1
2
3
4
5
6
dependencies {
compile 'com.networkbench.newlens.agent.android:nbs.newlens.agent:2.5.7'
}

那为什么会有上面有错误?按道理说两者都具备就可以了,猜是听云的版本兼容性问题,也就是2.5.7不兼容2.4.4版本。也就是上面说的classpathcompile版本要一一对应,版本号必须保持一致。但修改时的版本号是保持一致的呀?问题出在哪儿?缓存问题?

于是先clean,然后再重新build了一下,再运行时,发现问题依旧。没折了,我把版本号改回去2.4.4总行吧?结果还是编译报错,无语了,试了几次,还是这样,现在感觉到自己进入到进退两难的地步了。最后重新启动AS,再重新运行了,问题解决了,编译时不报错了,真是太惊喜,太意外了。

OK,本地问题解决了,服务器的自动构建上又出现问题。按照解决本地问题的思路,不可能重启服务器吧?仔细一想,还是缓存问题?问了运维,说每次构建都会自动清除build目录中的内容。但心想,与build目录的内容无关,自己解决问题时都删了好几次,问题依旧没有解决。突然想起平时经常被killjava.exe进程,这个进程里面会缓存一些东西,编译时经常会看到Starting a Gradle Daemon这样的提示,AS要提高编译速度,肯定会在这个进程里面缓存一些东西,不然这个java.exe进程内存占用会有几百M甚至超过1个G?

跑去跟运维说,你把这个java进程先kill,然后再重新构建。果然,kill进程之后再重新自动构建就OK了。后来想了一下,自己本地重启AS也是重新启动这个java进程。

为什么要用听云

听云是收费的,但也有免费的版本,免费的版本最多只能看三天的数据。我看重听云的最大一个好处是可以监控网络情况,比如说哪些接口失败率比较高、请求耗时等,这样可以做一些优化。

但听云有一个不好的地方是,对代码进行侵入,有时候在报错的堆栈中看到了听云的堆栈信息。如果项目结构设计不好,用的第三方库太多,估计听云的代码会插入的到处都是,这里没有整理出数据来。

另外听去的另外一个ANR日志收集的功能没有做好,把traces.txt日志文件中的有用的信息基本都过虑掉了,只留下一些堆栈信息。

文章目录
  1. 1. 升级遇到的问题
  2. 2. 解决问题
  3. 3. 为什么要用听云