Android Application Errors

(未完待续)

在Android中,对于App error有一个集中管理类:com.android.server.am.AppErrors

AppErrors.java

 // 处理ANR
 void handleShowAnrUi(Message msg)
 // 处理Crash
 void handleShowAppErrorUi(Message msg)
 boolean handleAppCrashLocked(ProcessRecord app, String reason, String shortMsg, String longMsg, String stackTrace, AppErrorDialog.Data data)

ANR调用顺序

InputManager.cpp

  status_t InputManager::start() {
         status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY);
         // .......
  }

InputDispatcher.cpp

  bool InputDispatcherThread::threadLoop() {
      mDispatcher->dispatchOnce();
      return true;
  }

InputDispatcher.cpp

  void InputDispatcher::dispatchOnce() {
         // .......
         dispatchOnceInnerLocked(&nextWakeupTime);
         // .......
  }

InputDispatcher.cpp

  void InputDispatcher::dispatchOnceInnerLocked(nsecs_t* nextWakeupTime) {
         // .......
         done = dispatchMotionLocked(currentTime, typedEntry,
            &dropReason, nextWakeupTime);
         // .......
  }

InputDispatcher.cpp

  bool InputDispatcher::dispatchMotionLocked(nsecs_t currentTime, MotionEntry* entry, 
                         DropReason* dropReason, nsecs_t* nextWakeupTime) {
         // .......
         if (isPointerEvent) {
               // Pointer event.  (eg. touchscreen)
               injectionResult = findTouchedWindowTargetsLocked(currentTime, entry, inputTargets, 
                                 nextWakeupTime, &conflictingPointerActions);
         } else {
               // Non touch event.  (eg. trackball)
               injectionResult = findFocusedWindowTargetsLocked(currentTime, entry, inputTargets, 
                                 nextWakeupTime);
         }
         // .......
  }

InputDispatcher.cpp

  int32_t InputDispatcher::findFocusedWindowTargetsLocked(nsecs_t currentTime, const EventEntry* entry,
                     Vector<InputTarget>& inputTargets, nsecs_t* nextWakeupTime) {
         // .......
         injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
                mFocusedApplicationHandle, NULL, nextWakeupTime,
                "Waiting because no window has focus but there is a "
                "focused application that may eventually add a window "
                "when it finishes starting up.");
         // .......
         injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
            mFocusedApplicationHandle, mFocusedWindowHandle, nextWakeupTime, reason.string());
         // ......
  }

  int32_t InputDispatcher::findTouchedWindowTargetsLocked(nsecs_t currentTime, 
                const MotionEntry* entry, Vector<InputTarget>& inputTargets, 
                nsecs_t* nextWakeupTime, bool* outConflictingPointerActions) {
        // .......
        injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
                    NULL, touchedWindow.windowHandle, nextWakeupTime, reason.string());
        // .......
  }

InputDispatcher.cpp

  int32_t InputDispatcher::handleTargetsNotReadyLocked(nsecs_t currentTime, const EventEntry* entry,
                                const sp<InputApplicationHandle>& applicationHandle,
                                const sp<InputWindowHandle>& windowHandle,
                                nsecs_t* nextWakeupTime, const char* reason) {
        // ......
        onANRLocked(currentTime, applicationHandle, windowHandle, entry->eventTime, mInputTargetWaitStartTime, reason);
        // ......
  }

InputDispatcher.cpp

  void InputDispatcher::onANRLocked(nsecs_t currentTime, const sp<InputApplicationHandle>& applicationHandle,
                const sp<InputWindowHandle>& windowHandle, nsecs_t eventTime, 
                nsecs_t waitStartTime, const char* reason) {
        // ......
        CommandEntry* commandEntry = postCommandLocked(& InputDispatcher::doNotifyANRLockedInterruptible);
        // ......
  }

InputDispatcher.cpp

  void InputDispatcher::doNotifyANRLockedInterruptible(CommandEntry* commandEntry) {
        // ......
        nsecs_t newTimeout = mPolicy->notifyANR(commandEntry->inputApplicationHandle,
                       commandEntry->inputWindowHandle, commandEntry->reason);
        // ......
  }

com_android_server_input_InputManagerService.cpp

  nsecs_t NativeInputManager::notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle,
    const sp<InputWindowHandle>& inputWindowHandle, const String8& reason) {
        // ......
        jlong newTimeout = env->CallLongMethod(mServiceObj,
            gServiceClassInfo.notifyANR, inputApplicationHandleObj, inputWindowHandleObj,
            reasonObj);
        // ......
  }

InputManagerService.java

  private long notifyANR(InputApplicationHandle inputApplicationHandle,
        InputWindowHandle inputWindowHandle, String reason) {
        return mWindowManagerCallbacks.notifyANR(
            inputApplicationHandle, inputWindowHandle, reason);
  }

InputMonitor.java

  @Override
  public long notifyANR(InputApplicationHandle inputApplicationHandle,
        InputWindowHandle inputWindowHandle, String reason) {
        // ......
        long timeout = ActivityManagerNative.getDefault().inputDispatchingTimedOut(
                    windowState.mSession.mPid, aboveSystem, reason);
        // ......
  }

ActivityManagerService.java

  @Override
  public long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) {
        // ......
        if (!inputDispatchingTimedOut(proc, null, null, aboveSystem, reason)) {
              return -1;
        }
        // ......
  }

ActivityManagerService.java

  public boolean inputDispatchingTimedOut(final ProcessRecord proc,
        final ActivityRecord activity, final ActivityRecord parent,
        final boolean aboveSystem, String reason) {
        // ......
        mAppErrors.appNotResponding(proc, activity, parent, aboveSystem, annotation);
        // ......
  }

AppErrors.java

  final void appNotResponding(ProcessRecord app, ActivityRecord activity, 
        ActivityRecord parent, boolean aboveSystem, final String annotation) {
        // ......
        msg.what = ActivityManagerService.SHOW_NOT_RESPONDING_UI_MSG;
        msg.obj = map;
        msg.arg1 = aboveSystem ? 1 : 0;
        // ......
        mService.mUiHandler.sendMessage(msg);
  }

ActivityManagerService$UiHandler.java

  @Override
  public void handleMessage(Message msg) {
        switch (msg.what) {
        // .......
        case SHOW_NOT_RESPONDING_UI_MSG: {
            mAppErrors.handleShowAnrUi(msg);
            ensureBootCompleted();
        } break;
        // .......
        }
  }

AppErrors.java

  void handleShowAnrUi(Message msg) {
        // .......
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,800评论 25 707
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,412评论 2 45
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 这是风靡全球的一系列影片,我居然一部都没看,之前也没有一点想去看的意思。因为周末去看了《神奇动物在哪里》,这部...
    笨小孩_1981阅读 2,187评论 1 3
  • 2016.10.27发现一棵叶插小苗有根粉蚧壳虫,马上连同盆的另一棵小苗浸水清理,然后栽到另外一个盆里。原盆土扔掉...
    猫与多肉阅读 291评论 0 0