리눅스 리뷰 #2 Android Rust Binder 패치
"We're generally not proponents of rewrites (nasty uncomfortable things that make you late for dinner!). So why rewrite Binder?" 2023년 11월 1일에 작성된 메일의 첫 줄이 크게 의미심장합니다. 왜 저녁 식사를 늦게 만드는 불쾌하고 또 불편한 이 지지 받지 못할 일을 하려는 것일까요? 안드로이드에서 바인더는 각각 독립된 프로세서들을 연결해주는 IPC와 같은 역할을 하는데, 기존에 C로 되어 있는 구현을 "Rust로 재작성"한다는 내용입니다. 기존에 C의 구현은 1. 복잡성 수많은 오류 시나리오를 처리하면서도 13개의 서로 다른 잠금, 7개의 참조 카운터 및 아토믹 변수를 결합하고 중첩하면서도 모든 작업을 최대한 빠르고 효율적으로 수행해야 하는데, 이런 작업을 하기에는 기존에 작성된 C 의 코드가 너무 복잡하다. 2. 기술부채 천 줄이 넘는 함수와 오류가 발생하기 쉬운 구조 등으로 인하여 새로운 구현이나 수정 등이 어렵다. 3. 보안 Android에서 샌드박스에서 실행되는 프로그램조차 이 바인더에 직접 접근할 수 있다. 이렇게 3가지의 주된 이유로 보안문제와 기술부채를 해결하면서 안드로이드의 바인더를 발전시키기 위해서 복잡성을 줄여야 하고, 이는 Rust 를 통해서 해결 가능할 수 있기에 Rust 로 재작성하기로 결정하였습니다. 러스트를 통해서 * 참조 계산, 잠금, 범위 확인과 관련된 실수를 쉽게 방지 가능 * 소멸자와 같은 기능을 사용하여 단순화된 오류 처리가 가능하여 오류 처리의 복잡성을 줄이는데 효율적 * 바인더 드라이버에는 복잡한 소유권을 갖는 다양한 개체가 존재하는데, 예를 들어, 일부 포인터는 참조 카운트를 소유하고, 일부 포인터는 독점 소유권을 가지며, 일부 포인터는 객체를 참조하는데, 이런 소유권과 관련된 부분을 쉽게 구현 가능 * 프로그래머가 객체 수명 관리를 구현해주어야 하는 복잡성이 사리짐 이런 이점을 얻을 수 있기에 재작성 하기로 결정하였다고 합니다. 그리고 이렇게 재작성하는데 있어서 기존 디자인에서 신중하게 고려된 여러 개념을 반영하고, 코드 상태, 구조, 가독성, 견고성, 보안, 유지 관리 가능성 및 확장성을 향상시키는 것을 목표로 잡았습니다. 러스트로 작성된 바인더와 C 로 작성된 바인더의 성능 벤치마킹의 결과 역시 러스트 바인더로 작성된 안드로이드 장치(테스트 장치)가 정상적으로 부팅되었으며, 다양한 앱과 기능이 문제 없이 실행되고 모든 테스트를 통과했다고 합니다. 기능의 경우 러스트 바인더는 아직 일부 디버깅을 제외하고 C 바인더가 지원하는 모든 기능을 구현했다고 합니다. 또한 성능 역시 C 바인더와 유사한 성능을 가지고 있다고 하네요. 하지만 러스트 바인더의 경우 트랜잭션 규모가 큰 경우는 아직 C 바인더 성능에 미치지 못하지만 이를 해결할 수 있으며 해결해 나갈 것 이라고 합니다. Ps. 러스트 공부할 생각이 없었는데, 러스트도 공부 리스트에 넣어 두는 것으로 🤪 https://lore.kernel.org/rust-for-linux/20231101-rust-binder-v1-0-08ba9197f637@google.com/