Fatal Exception: android.app.RemoteServiceException: Bad notification posted from package com.xx.yy: Couldn't create icon: StatusBarIcon(icon=Icon(typ=RESOURCE pkg=com.xx.yy id=0x7f0c0002) visible user=0 )
at android.app.ActivityThread$H.handleMessage + 2204(ActivityThread.java:2204)
at android.os.Handler.dispatchMessage + 108(Handler.java:108)
at android.os.Looper.loop + 166(Looper.java:166)
at android.app.ActivityThread.main + 7529(ActivityThread.java:7529)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run + 245(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main + 921(ZygoteInit.java:921)
我分析有两个原因:
- 推送样式含有特殊的布局(非Relativeayout, LinearLayout, FrameLayout的等)
- 手机不能显示图片,比如说海信的一些机型,只要push带图,必crash
如果路子野,可以直接接管Looper, try catch住
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.util.AndroidRuntimeException;
import android.util.Log;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class FixRemoteStatusBarNotificationHandler {
private static final String TAG = "lishaokai";
private static boolean DEBUG = false;
public static void enableDebug() {
DEBUG = true;
}
private static void log(String s) {
if (DEBUG) Log.e(TAG, s);
}
// FIX ALL JAVA CRASH... UGLY BUT USEFUL
// 理论上能修复所有JAVA主线程的crash
// 代码先搞上去,不轻易使用
// 一次调用,会浪费一个msg
//
// https://github.com/leotyndale/EnCrashWhiteList/blob/master/whitecrash/src/main/java/com/imuxuan/whitecrash/CrashCatcher.java
public static void startCatchLooper() {
if(!shouldHook()) return;
Log.e("lishaokai", "startCatchLooper RemoteServiceException");
sHooked = true;
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
while (true) {
try {
Looper.loop();
} catch (AndroidRuntimeException e) {
if(e.toString().contains("android.app.RemoteServiceException")) {
Log.e(TAG, " loop crash:" + e);
} else {
throw e;
}
}
}
}
});
}
private static boolean shouldHook() {
try {
String brand = Build.MANUFACTURER;
String model = Build.MODEL;
if(model.toUpperCase().contains("AL10") && Build.VERSION.SDK_INT == 24) return true;
if(model.toUpperCase().contains("AL00") && Build.VERSION.SDK_INT == 24) return true;
if(model.toUpperCase().contains("TL10") && Build.VERSION.SDK_INT == 24) return true;
if(model.toUpperCase().contains("TL10A") && Build.VERSION.SDK_INT == 24) return true;
if(model.toUpperCase().contains("DL09") && Build.VERSION.SDK_INT == 24) return true;
if(model.toUpperCase().contains("W09") && Build.VERSION.SDK_INT == 24) return true;
if(brand.toUpperCase().equals("VIVO") && model.toUpperCase().contains("Y31") && Build.VERSION.SDK_INT == 22) return true;
if(brand.toUpperCase().equals("VIVO") && model.toUpperCase().contains("Y51") && Build.VERSION.SDK_INT == 22) return true;
if(brand.toUpperCase().equals("VIVO") && model.toUpperCase().contains("Y31") && Build.VERSION.SDK_INT == 23) return true;
if(brand.toUpperCase().equals("VIVO") && model.toUpperCase().contains("Y51") && Build.VERSION.SDK_INT == 23) return true;
if(brand.toUpperCase().equals("HUAWEI") && model.toUpperCase().contains("MED-AL00") && Build.VERSION.SDK_INT == 29) return true;
if(brand.toUpperCase().equals("VIVO") && model.toUpperCase().contains("Y31") && Build.VERSION.SDK_INT == 21) return true;
if(brand.toUpperCase().equals("VIVO") && model.toUpperCase().contains("Y51") && Build.VERSION.SDK_INT == 21) return true;
if(brand.toUpperCase().equals("TCL") && model.toUpperCase().contains("V760") && Build.VERSION.SDK_INT == 25) return true;
if(model.toUpperCase().contains("OC106") && Build.VERSION.SDK_INT == 25) return true;
if(model.toUpperCase().contains("OC105") && Build.VERSION.SDK_INT == 25) return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
网友评论