웹브라우저는 HTML을 텍스트 그대로 parsing 하여 화면을 그리지만 모바일에서는 환경이 다릅니다. 제한된 CPU와 메모리, 배터리를 고려해야 하기 때문이다. 텍스트 XML을 매번 parsing하는것은 비효율적인데 그럼 어떻게 처리 하는걸까?
안드로이드는 빌드 시점에 XML을 바이너리 형식으로 미리 컴파일을 한다.
XML 레이아웃 컴파일은 크게 3단계로 이루어진다.
AAPT2 컴파일 → 바이너리 XML → 런타임 인플레이션 → 화면의 View
첫 번째 단계에서 AAPT2는 우리가 작성한 텍스트 XML을 분석하고 검증을 한다. 두 번째 단계에서는 이를 효율적인 바이너리 형식으로 변환을 한다. 마지막으로 앱 실행시 LayoutInflater가 바이너리 데이터를 읽어 실제 View 객체를 생성한다.
텍스트 형식에서는 <LinearLayout … 이런 문자열을 하나하나 읽어야 하지만 바이너리에서는 (0x01 등)으로 표현된다. 문자열 match_parent는 상수값 -1로 저장된다. 이런 변환을 통해 파싱속도가 훨씬 빨라지기 때문이다.
AAPT2는 XML이 올바른 형식인지 확인을 한다. 닫히지 않은 태그나 잘못된 속성등 이 있다면 이 단계에서 에러를 발생 시킨다. 런타임이 아닌 빌드 시점에 문제를 발견할수 있도록 한다. 그 다음 리소스 참조하고 있는 것을 리소스 ID로 변환 한다. 마지막으로 텍스트를 바이너리 구조로 변환 한다.
컴파일된 바이너리 XML은 다음과 같은 구조를 가지는데