Android

[Android] Compose 런타임 - (9)
노드 연결 및 그리기트리에 노드를 삽입하는 것이 궁극적으로는 우리가 보는 스크린 화면에 어떻게 반영되는 걸까?LayoutNode는 이러한 처리를 위해 Android UI에서 채택된 노드 중 하나다.UiApplier을 구체화한 LayoutNode에게 삽입을 위임하면 다음과 같은 순서로 수행된다.노드 삽입을 위한 조건이 충족되었는는지 확인한다. 가령, 부모 노드가 없는지 등을 확인한다.Z 인덱스에서 정렬된 자식 목록을 Invalidate 한다. Z 인덱스별로 모든 자식을 정렬하여 저장하는 병렬 목록으로 자식 노드들이 순서대로 그려질 수 있다.새 노드를 부모 노드 및 Owner에 연결한다.최종적으로 invalidate를 수행한다.여기서 말하는 Z 인덱스란 앞서 말한 것처럼 Compose UI는 트리 구조를 가..
[Android] Compose 런타임 - (8)
노드 트리 구축 시 성능트리를 하향식으로 작성하는 것과 상향식으로 작성하는 것에는 중요한 차이점이 있다.Compose로 표현하려는 그래프에 노드가 삽입될 때마다 노드의 모든 상위 항목에 알려야 한다고 가정해 보자.하향식 삽입의 경우엔 부모의 부모 노드, 조상 노드 등 수많은 노드에 알려야 할 수 있다.그 수는 그래프에 새로운 깊이(depth)가 추가될 때마다 변경 사항을 알려야 할 노드가 기하급수로 증가한다.반면 상향식 삽입의 경우엔 부모가 트리에 바로 연결되지 않는 특징덕에 자신의 직속 부모에게만 변경사항을 알리면 된다.만약 자식 노드에게만 변화를 알리는 형태의 전략을 취한다면 노드의 변화를 알리기 위한 비용을 많이 절감할 수 있다.따라서 전략은 표현하고 있는 트리에 따라가거나 변경 사항들이 트리의 위..
[Android] Compose 런타임 - (7)
변경 사항 적용하기Composer는 이 추상화 작업을 Applier에 위임하여 composition 이후에 기록된 모든 변경 사항을 적용한다. 이러한 동작을 구체화라고 하며, 이 프로세스는 변경 사항 목록을 실행하고 슬롯 테이블을 업데이트한다.런타임은 이 Applier의 구현체와는 독립적이다. 이는 클라이언트단의 라이브러리를 통해 구현하기 위한 API에 의존한다. Applier는 플랫폼과의 통합점과 같으므로, 유즈케이스에 따라 인터페이스의 구현체가 달라질 수 있다.Applier 인터페이스의 명세는 아래와 같다.interface Applier { val current: N fun onBeginChanges() {} fun onEndChanges() {} fun down(node: N) fun up() fu..
[Android] Compose 런타임 - (6)
현재 상태 스냅샷 접근Composer는 현재 스냅샷에 대한 참조값을 가지고 있는데, 이 유형은 현재 스레드에 대한 가변적인 상태 혹은 상태 객체들이 반환하는 값의 스냅샷과 유사하다.모든 상태 객체는 스냅샷에서 명시적으로 변경되지 않는 한 스냅샷이 생성되었을 때와 동일한 값을 스냅샷에서 갖는다노드 탐색노드 트리 탐색은 Applier에 의해 수행되지만, Applier가 이를 직접 수행을 하진 않는다.Applier가 구독자에 의해 탐색되는 노드의 위치들을 기록하고 downNodes 라는 배열에 기록함으로써 수행된다.노드 탐색이 실행되면 downNodes에 있는 모든 하향 노드 정보를 Applier에 전달하게 되고, 만약 하향 노드 탐색이 수행되기 전에 상향 노드 탐색이 수행될 경우에는 downNodes 스택에..
[Android] Compose 런타임 - (5)
재구성 범위재시작 가능한 그룹이 생성될 때마다, Composer는 이에 대한 RecomposeScope를 생성하고 이를 Composition에 대한 currentRecomposeScope로 설정한다.(재시작 가능한 그룹의 범위 = RecomposeScope)RecomposeScope는 composition의 영역을 모델링하는데 Composable의 recompositon을 수동으로 invalidate 하고 트리거하는 데 사용할 수 있다.invalidate는 composer.currentRecomposeScope(). invalidate()와 같이 Composer를 통해 호출되고 재구성을 위해 Composer는 슬롯 테이블을 해당 그룹의 시작 위치에 배치한 다음 람다에 전달된 재구성 블록을 호출한다.그러면..
[Android] Compose 런타임 - (4)
작성 시기 최적화앞선 포스팅에서 봤듯이 새로운 노드를 삽입하는 작업은 Composer가 담당한다.Composer는 변경 사항이 방출될 때, 해당 데이터들을 기록하는 대신 곧바로 슬롯 데이블에 변경 사항을 작성할 수 있다.그 외의 경우에는 해당 변경 사항들이 변경 목록에 기록되고 잠시 지연되는데, 이는 아직 해당 변경 사항들을 적용할 시점이 아니기 때문이다.쓰기 및 읽기 그룹composition이 완료되면 composition.applyChanges()가 호출되며 트리를 구체화하고 변경 사항이 슬롯 테이블에 저장된다.Composer는 데이터, 노드, 그룹 등 다양한 유형의 정보를 작성할 수 있는데, 그 중 “그룹”은 단순화를 위해 모든 항목을 종합하여 저장하는 형태이다.Composer는 모든 그룹을 시작..