[Android] R8의 traceNewInstance() 핥아보기

신민준·2025년 11월 10일
0

안드로이드 빌드

목록 보기
3/4

들어가며

Manifest Android Interview의 R8 스터디용 R8을 조금만 핥아보는 글입니다.

이 글은 traceNewInstance() 메소드 하나만 다루는 아주 짧은 글입니다.

traceNewInstance()

private DexClass traceNewInstance(
      DexType type,
      ProgramMethod context,
      InstantiationReason instantiationReason,
      KeepReason keepReason) {
    DexClass clazz = resolveBaseType(type, context);
    if (clazz != null && clazz.isProgramClass()) {
      DexProgramClass programClass = clazz.asProgramClass();
      if (clazz.isAnnotation() || clazz.isInterface()) {
        markTypeAsLive(programClass, graphReporter.registerClass(programClass, keepReason));
      } else {
        worklist.enqueueMarkInstantiatedAction(
            programClass, context, instantiationReason, keepReason);
      }
    }
    return clazz;
  }

이것은 R8이 new ClassA()와 같은 새로운 인스턴스 생성이 발견되면 호출되는 메소드이다.
한줄씩 무엇인지 살펴보면

  1. DexClass clazz = resolveBaseType(type, context);
    • type이 배열일 수도 있기 때문에 기본 클래스 타입(base type)을 찾아서 DexClass로 반환
  2. if (clazz != null && clazz.isProgramClass())
    • 해당 클래스가 앱 코드인지 확인한다. (라이브러리나 플랫폼 클래스는 제외)
    • 이후 asProgramClass()로 변환
  3. if (clazz.isAnnotation() || clazz.isInterface())
    • 어노테이션이나 인터페이스는 new로 직접 인스턴스화할 수 없으니 "이 타입이 코드에서 참조된다"는 의미로 markTypeAsLive()를 통해 live(살아있는 상태)로 표시
  4. worklist.enqueueMarkInstantiatedAction( programClass, context, instantiationReason, keepReason);
    + 그 외에 일반 클래스는 실제 인스턴스 생성이 가능하므로
    worklist(작업 큐)에 “이 클래스가 인스턴스화되었다”는 작업을 추가한다.

이후 R8의 reachability analysis(도달성 분석) 단계 worklist를 순회하며 사용 중을 판단한다.

결론

스터디를 위해 빠르게 정신없이 글을 3개나 썼는데
막상 써지는 걸 보면 평소에 내가 얼마나 게을렀나를 반성할 수 있었다..ㅎㅎ;;;
추후 worklist 순회하는 부분도 봐야겠다

profile
안드로이드 외길

0개의 댓글