聊聊线上崩溃

前言

大改版上线,这一周累的跟孙子似的,几乎天天2,3点睡觉,最要命的是,出现了一些及其诡异的bug,有一些现在仍然没有找到任何原有,并且我估计也不可能找到原因了,下面简单说一说其中遇到的一个问题。
这篇文章也是开篇吧,用来记录以后工作中遇到的一些奇葩的,比较容易拿出来探讨的一些问题。

问题汇总

noSuchMethodError

复现

复现场景如下:A模块调用B模块的x方法,x方法返回值为w1,打包A模块为aar,然后,修改B模块的x方法返回值为w2,然后打包B模块,然后联合打包出包,就出现了这个问题。

猜测原因

这个肯定涉及到打包部分的代码,楼主目前也不是相当了解,所以,只能猜测,打包某个模块,肯定是打包成aar(.class文件),而不是打包成.dex文件。
所以下面我们说说,.class文件有什么特殊的,为什么会造成这种问题。
下面我们来模拟一下这种情况,看看.class文件里面究竟有什么。
模拟代码

\\TestNoSuchMethodError.java文件
public class TestNoSuchMethodError {
    public void tat(B b) {
        b.get();
    }
}
\\B.java文件
public class B {
    public String get() {
        return "";
    }
}

上面就是模拟情况,我们先使用

javac -d .\ *.java

来把这两个文件编译成.class文件,再使用

java -p  .\TestNoSuchMethodError.class

来查看调用的方法。
下面是截图
聊聊线上崩溃_第1张图片
注意最后的tat那一行
聊聊线上崩溃_第2张图片
看到invokevirtual#7 应该就能明白了,#7在第一张图中。这里其实指定了方法描述符。注意,java虚拟机层面,是使用java方法名和方法签名来唯一确认一个方法调用。这里经常和java方法描述符搞混,方法描述符和方法签名是不一样的

方法签名是由方法的名称和参数类型构成。
方法签名的存在是为了在Java语法层面上保证开发者能够正确的命名方法、重载方法。

方法描述符是由方法的参数类型以及返回类型所构成。
JVM在判定重写时,看的是方法描述符。

注意,一个是java层面的,一个是jvm层面的。也可以理解为,jvm是允许,相同方法名,相同方法参数,但是不同返回值存在的,也就是说,jvm的重载判断方法和java的重载判断方法不一样。
真相大白。

onAnimationEnd的执行线程

这个是由bugly上面的一个问题引起的。
聊聊线上崩溃_第3张图片
我画线的地方就是问题,可能大家还是没明白,问题在哪里。问题是:属性动画的onAnimationEnd回调,竟然不是在主线程。
这个问题先记录先来,等过段时间忙完之后,我再来继续深挖这个问题。

总结

这只会是一个系列的开篇,后续我会把相关遇到的知识点性质的bug陆续都总结到这个里面来,欢迎大家一起探讨提问。

你可能感兴趣的:(jvm,安卓,jvm,java)