Manifest Android Interview의 R8 스터디용 R8을 조금만 핥아보는 글입니다.
이 글은 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()와 같은 새로운 인스턴스 생성이 발견되면 호출되는 메소드이다.
한줄씩 무엇인지 살펴보면
DexClass clazz = resolveBaseType(type, context); if (clazz != null && clazz.isProgramClass())asProgramClass()로 변환if (clazz.isAnnotation() || clazz.isInterface())markTypeAsLive()를 통해 live(살아있는 상태)로 표시 worklist.enqueueMarkInstantiatedAction( programClass, context, instantiationReason, keepReason);이후 R8의 reachability analysis(도달성 분석) 단계 worklist를 순회하며 사용 중을 판단한다.
스터디를 위해 빠르게 정신없이 글을 3개나 썼는데
막상 써지는 걸 보면 평소에 내가 얼마나 게을렀나를 반성할 수 있었다..ㅎㅎ;;;
추후 worklist 순회하는 부분도 봐야겠다