⚙️ 안드로이드 메인스레드

sery270·2021년 4월 9일
3

Android

목록 보기
7/13

안녕하세요 :) 오늘은 메인스레드, main() 함수라는 것이 무엇인지 살펴보고, 안드로이드 환경에선 이 개념이 어떻게 적용되는지 알아보려합니다. 안드로이드 메인스레드의 역할, 생성, 특징에 대해 알아볼 것입니다. 또한 UI 작업에 대한 단일스레드 모델과 관련하여, ANR에 대해서 알아보려합니다. 오늘도 화이팅 입니다 ! 🌿

1️⃣ 메인스레드의 역할과 특징에 대해 알아보자


일반적인 메인스레드

  • 프로세스 실행 중의 필요에 따라 스레드가 생성 및 실행됩니다.
  • 스레드는 기존에 이미 실행되어있는 다른 스레드에 의해 생성 및 실행됩니다.
  • 이때 최초의 스레드를 메인스레드라고 부릅니다. 이 스레드가 생성되고 시작되는 곳을 main() 함수라고 부릅니다.
  • 즉, 프로세스가 시작되어, 프로세스의 시작점인 main() 함수에서, 실행되는 최초의 스레드가 메인스레드가 되는 것입니다.

안드로이드의 메인스레드

  • 앱에 포함된 액티비티 중 하나를 런처로 지정함으로써, 앱의 시작점, 즉 앱 프로세스의 시작점을 지정해줄 수 있습니다.

    • 여러분들이 AndroidManifest.xml에 작성하셨던 가 바로 런처를 지정하는 부분이 됩니다.

  • 이렇게 앱 프로세스의 시작점을 지정하는 것까진 알겠는데, 안드로이드 개발을 하면서 직접 main() 함수를 적어본적이 없을텐데요. 안드로이드 앱의 main()는 안드로이드 프레임워크에 존재하기 때문입니다.

    • 기본적으로 저희가 개발하는 안드로이드 앱은 안드로이드 프레임워크 위에서 동작합니다.

    • 즉 main()는 저희가 작성하는 코드 범위가 아니라, 안드로이드 프레임워크에 위치합니다. 더 정확히는 android.app.ActivityThread 클래스에 위치한 main()함수가 실행되며 앱 프로세스가 시작되는 것입니다. 이 main()함수 안에서 메인 스레드가 준비되고 실행됩니다. 메인스레드가 실행되고나선 앞서 런처로 지정한 액티비티를 실행(UI 작업)하게 됩니다.

  • 안드로이드의 메인스레드는 컴포넌트 생명주기 메서드와 그 안의 메서드 호출을 기본적으로 담당하고 있습니다.

  • 따라서 안드로이드의 메인스레드의 주요 업무 중엔 UI 작업도 포함 됩니다. 여기서 큰 특징으로, 안드로이드 메인스레드가 UI 작업을 할땐, 단일스레드 모델이 적용된다는 점입니다.

2️⃣ 안드로이드 메인스레드의 UI 작업은 왜 단일스레드 모델을 사용할까 ?


  • 한마디로 정리하면, UI 작업에 있어 경합 상태, 교착 상태를 방지하고자, 메인스레드엔 단일 스레드 모델이 적용됩니다.

    • 하나의 위젯에 멀티 스레드를 사용한다고 하면, 앞서 언급한, 동일 자원에 대한 교착 상태, 경합 상태등의 문제가 발생될 수 있습닌다.

      단일 스레드 모델은 자원 접근에 대한 동기화를 신경쓰지 않아도 되고, 작업전환(context switching) 비용을 요구하지 않으므로, 경합 상태와 교착 상태를 방지할 수 있다.

    • 또 만약 하나의 액티비티에 N개의 위젯이 있고, 각 위젯에 대한 작업을 위해 N개의 멀티 스레드를 사용한다고 가정하면, 각 위젯이 그려지거나 업데이트되는 순서를 보장할 수 없게 됩니다.

  • 안드로이드에서의 단일 스레드 모델이란 안드로이드 화면을 구성하는 뷰나 뷰그룹을 하나의 스레드에서만 담당하는 원칙을 말합니다. 단일 스레드 모델은 아래 두 가지 규칙을 갖습니다.

    첫째, 메인 스레드(UI 스레드)를 블럭하지 말 것

    둘째, 안드로이드 UI 툴킷은 오직 메인 스레드(UI 스레드)에서만 접근할 수 있도록 할 것

  • 따라서, UI 작업은 단일스레드 환경에서만 이뤄져야하며, 이 UI 작업을 맡고 있는 메인스레드가 UI 작업을 할 땐, 단일스레드 원칙에 맞게 동작해야하는 것입니다.

    • 즉, UI 작업은 메인스레드에서만 이뤄져야합니다. 메인스레드가 UI작업을 할 수 있는 유일한 스레드인것 입니다.
    • 이것이 메인스레드를 UI 스레드라고도 부르는 이유입니다.
      • UI 스레드라는 말이 메인스레드가 UI 작업한다는 의미는 아닌것을 상기해주세요.

UI 스레드와 Looper

  • 사용자 입력이 필수인 프로그램에서는, 연속적으로 사용자 입력을 받고, UI 이벤트를 처리하기 위해 루프(Loop)가 실행되어야 합니다.
  • 무작정 for나 while문을 사용하여 무한 루프를 사용하게 되면, 불필요한 대기시간이 발생해, 이 동안 자원을 활용하지 못하고, 이는 시스템 낭비로 이어지게 됩니다.
    • 따라서, UI 프레임워크는 Message Queue를 사용하여 루프(Loop) 코드를 작성하도록 가이드합니다. 여기서 Looper가 Message Queue와 함께 동작하게 됩니다.
      • 이렇게 Message Queue를 활용함으로써, 특정 UI 자원에 대한 경합 상태도 예방할수도 있게 됩니다.
      • 이 Looper의 개념은 GUI가 태동될때 출현했다고 합니다.

3️⃣ 안드로이드 메인스레드의 생성 소스를 확인해보자( ActivityThread의 main() )


작성 중....!!

4️⃣ ANR의 판단 매커니즘을 이해하자


공부 중입니다 ~,~

#️⃣ Reference


profile
개발세리의 성장기🌿

0개의 댓글