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库配置为不混淆即可。