一次混淆XLog导致的crash分析记录

crash报错内容如下。

yaml 复制代码
08-27 00:04:36.844 18272 18272 E AndroidRuntime: FATAL EXCEPTION: main
08-27 00:04:36.844 18272 18272 E AndroidRuntime: Process: com.XXX.XXXX, PID: 18272
08-27 00:04:36.844 18272 18272 E AndroidRuntime: java.lang.UnsatisfiedLinkError: field:level, sig:I
...
08-27 00:04:36.844 18272 18272 E AndroidRuntime:    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2168)
08-27 00:04:36.844 18272 18272 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:106)
08-27 00:04:36.844 18272 18272 E AndroidRuntime:    at android.os.Looper.loopOnce(Looper.java:222)
08-27 00:04:36.844 18272 18272 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:319)
08-27 00:04:36.844 18272 18272 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:8189)
08-27 00:04:36.844 18272 18272 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
08-27 00:04:36.844 18272 18272 E AndroidRuntime:    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:583)
08-27 00:04:36.844 18272 18272 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1013)

在Tencent的Xlog库搜索关键字appenderOpen,可以定位到问题代码所在。

ini 复制代码
JNIEXPORT void JNICALL Java_com_tencent_mars_xlog_Xlog_appenderOpen(JNIEnv* env, jclass clazz, jobject _log_config) {
    if (NULL == _log_config) {
        xerror2(TSF "logconfig is null");
        return;
    }

    jint level = JNU_GetField(env, _log_config, "level", "I").i;
    
    ...
}

结合crash信息可知_log_config的level字段找不到了,下面是该native方法在java中的声明。

java 复制代码
private static native void appenderOpen(XLogConfig logConfig);

结合两段代码知道_log_config对应着的应该是XLogConfig类。

怀疑是代码进行了混淆导致的。

把Jenkins上打的APK拉下来,使用Jadx软件进行解析,搜索XLogConfig。

可以看到被混淆后的XLogConfig类中确实没有level字段,而混淆前的代码里是有的。

arduino 复制代码
//混淆前的代码
static class XLoggerInfo {
    public int level;
    public String tag;
    public String filename;
    public String funcname;
    public int line;
    public long pid;
    public long tid;
    public long maintid;
}

因此解决办法也很简单,把Tencent的Xlog库配置为不混淆即可。

相关推荐
提子拌饭13317 小时前
番茄时间管理:鸿蒙Flutter 实现的高效时间管理工具
android·flutter·华为·架构·开源·harmonyos·鸿蒙
4311媒体网18 小时前
帝国CMS二次开发实战:精准实现“最新资讯”标识与高亮判断
android
BLUcoding18 小时前
Android 轻量级本地存储 SharedPreferences
android
冬奇Lab18 小时前
Camera HAL3 接口:Android 相机的真正底牌
android·音视频开发·源码阅读
sensen_kiss18 小时前
CAN302 Technologies for E-Commerce 电子商务技术 Pt.6 市场营销与SEO(搜索引擎优化)
android·学习·搜索引擎
菜鸟国国19 小时前
Compose + Koin ViewModel 实战完全手册
android
小羊子说19 小时前
Android 音频系统深度解析:从 App 到内核的完整链路
android·人工智能·性能优化·车载系统
fengci.19 小时前
php反序列化(复习)(第三章)
android·开发语言·学习·php
D4c-lovetrain19 小时前
linux个人心得24 (mysql③,AI排版尝试)
android·adb
csj5020 小时前
安卓基础之《(25)—竖屏与横屏切换》
android