美文网首页
Fatal Exception: android.app.Rem

Fatal Exception: android.app.Rem

作者: 开哥Android开发 | 来源:发表于2020-04-29 10:49 被阅读0次
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)

我分析有两个原因:

  1. 推送样式含有特殊的布局(非Relativeayout, LinearLayout, FrameLayout的等)
  2. 手机不能显示图片,比如说海信的一些机型,只要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;
    }

}

相关文章

网友评论

      本文标题:Fatal Exception: android.app.Rem

      本文链接:https://www.haomeiwen.com/subject/pscgwhtx.html