如何便捷定位日志栈追踪中提及的Lambda表达式?
如何快速定位Crash日志中的Lambda表达式
作为经常和RxJava、Lambda打交道的开发者,我太懂这种日志里只显示Lambda #7却找不到对应代码的抓狂感了!分享几个亲测有效的便捷方法:
开启Lambda调试编译选项
这是最治本的方法,让编译器给Lambda生成带有明确标识的字节码。在你的模块级build.gradle里添加如下配置:android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 javaCompilerOptions { arguments += ["android.enableLambdaClassNames": "true"] } } }重新编译后,Crashlytics的栈追踪就会显示Lambda对应的具体类和方法位置,再也不是模糊的编号了。
通过字节码反编译回溯
如果已经拿到了崩溃日志,你可以把出问题的APK或者dex文件用反编译工具(比如Android Studio自带的反编译器、jadx)打开。找到栈中提到的io.reactivex.internal.operators.observable.ay$a类,查看它的onNext方法里调用的mapper函数,就能关联到你代码里对应的Lambda位置——因为Lambda最终会被编译成匿名内部类,反编译后能看到具体的实现逻辑。临时替换Lambda为具名内部类
如果你能缩小范围,知道大概是哪个RxJava操作符里的Lambda出问题,可以临时把Lambda改成具名内部类。比如把:observable.map(data -> data.getNullableField())改成:
observable.map(new Function<Data, Field>() { @Override public Field apply(Data data) { return data.getNullableField(); } })这样崩溃时栈追踪会直接显示这个内部类的名字,瞬间就能定位到代码位置,排查完再改回Lambda就好。
顺带提一句:你遇到的
NullPointerException是RxJava的ObjectHelper在检查mapper返回值时抛出的,所以定位到Lambda后,记得处理返回null的情况哦!
内容的提问来源于stack exchange,提问作者Gaket
相关产品推荐
相关产品推荐

