본문 바로가기
IT/Android

안드로이드 ANR 분석

by 큰공 2020. 6. 12.
728x90
반응형

ERROR 메시지

. 안드로이드 anr 이 발생하였는가? 잘 돌아가는 프로세스인데, 어디서 어떻게 발생한지도 모르겠고, 로그만 떡하니 남아 있을 경우, 재현도 안되고, 난감한가?

. ANR 발생시 anr 발생 로그에서 어디 프로세스 및 Activity 에서 발생하였는지 찾아라

Process: com.***.***.***
Flags: 0xc8be45
Package: com.***.***.***
Activity: com.***.***.***/.settings.ui.AAAAAATEST
Subject: Input dispatching timed out (Waiting because the touched window has not finished processing the input events that were previously delivered to it.)

TIMED_WAIT

 . TIMED_WAIT를 찾자!

 . TIMED_WAIT 는 현재 처리 되지 못하고 기다리고 있는 Thread 를 의미한다.

 . F/W 부분의 ActivityMnagerService.java에서 해당 Thread 가 TIMED_WAIT 로 기다리고 있으며, 이부분이 ANR 로 의심된다. 

                      "CpuTracker" prio=5 tid=17 TIMED_WAIT 
                        | group="main" sCount=1 dsCount=0 obj=0x425f72a0 self=0x5bf35348 
                        | sysTid=538 nice=0 sched=0/0 cgrp=apps handle=1542674336 
                        | state=S schedstat=( 658060072 220650126 833 ) utm=38 stm=27 core=1 
                        at java.lang.Object.wait(Native Method) 
                        - waiting on <0x425f72a0> (a com.android.server.am.ActivityManagerService$4) 
                        at java.lang.Object.wait(Object.java:401) 
                        at com.android.server.am.ActivityManagerService$4.run(ActivityManagerService.java:2307) 

onResume Main Thread 분리

 . F/W Thread 에서 블럭이 발생하지만, 우리가 F/W 을 수정하기는 어려우므로, APP 에서 수정하고자 한다.

 . onResume 에서 시간이 많이 소요되는 구문을 Main Thread 에서, Fork 된 Thread 로 분리하여, 해결해보자.

 . runable 객체를 바로 생성해서, 간단하게 Thread 로 구현하자.

 

 

 . 기존

	@Override
	protected void onResume()
	{
		super.onResume();
		
		**** 실행 코드 **** 
                
	}

 

 . 변경

	@Override
	protected void onResume()
	{
		super.onResume();
		
		new Thread(new Runnable()
		{
			public void run()
			{
				**** 실행 코드 **** 
			}
		}).start();
	}

 

728x90
반응형

댓글