Claude Code를 사용해 LG TV를 리버스 엔지니어링하고 네이티브 Plex 클라이언트를 만들었습니다
I used Claude Code to reverse-engineer an LG TV and build a native Plex client
핵심 요약
Claude Code를 활용해 느린 LG TV의 공식 Plex 앱을 대체할 빠르고 가벼운 네이티브 Plex 클라이언트를 직접 개발했습니다.
- 리버스 엔지니어링 — Ghidra와 Claude Code를 활용해 LG TV의 미디어 스택을 분석함
- 성능 최적화 — 웹 기반의 느린 공식 앱 대신 Rust와 OpenGL로 60fps 네이티브 UI 구현
- 개발 과정 — C로 시작해 Rust로 전환하며 에이전트와 함께 아키텍처를 개선함
- 사용자 경험 — 기존 30초 걸리던 앱 실행 시간을 3초대로 단축함
TL;DR: 내 2019년형 LG TV는 패널은 끝내주는데, 공식 Plex 앱은 프로필 선택 화면 뜨는 데만 30초가 걸림. LG는 일반 개발자한테 공개된 네이티브 SDK를 안 풀어주니까, Ghidra랑 Claude Code로 네이티브 미디어 스택을 직접 리버스 엔지니어링해서 나만의 Plex 클라이언트인 PlxNative를 만들었음. 처음엔 C로 시작했다가 거의 Rust로 갈아엎었고, 어쩌다 보니 나만의 OpenGL UI 프레임워크까지 짜게 됨. 같은 TV에서 프로필 선택 화면 뜨는 데 3초 컷임. 루팅도 필요 없음. 사이트랑 소스 코드는 아래에 있음.
데스크탑 시뮬레이터에서 캡처한 홈 화면 (TV에서 돌아가는 코드와 동일). CC BY 영화 데모 라이브러리, Sintel © Blender Foundation.
난 iOS 개발자라 그동안 UI 작업은 GPU 위에서 몇 단계나 추상화된 환경에서만 해봤음.
몇 달 전에 알리익스프레스에서 싼 MP3 플레이어 사서 펌웨어 꼬라지에 빡친 사람이 Codex로 리버스 엔지니어링해서 패치 만든 글을 봤거든. 그 뒤로 사람들이 그 패치 깔려고 똑같은 플레이어를 사기 시작하더라고. 이 생각이 진짜 마음에 들었음. 보통 우리는 기기에 깔린 소프트웨어를 고정된 걸로 생각하잖아. 구리면 그냥 새 기기 사는 거지. 얼마 안 가서 나도 내 TV로 똑같은 짓을 하고 있더라.
내 LG TV는 2019년형인데 패널은 아직도 짱짱함. 문제는 소프트웨어임. TV 공식 Plex 앱 콜드 스타트 속도 보면 가관임:
-
"누가 시청 중인가요?" 뜨는 데 30초
-
홈 그리드 뜨는 데 30초
-
메뉴 하나 여는 데 5초
-
영화 페이지 로딩하는 데 10초
그냥 웹 페이지처럼 돌아가는데, 실제로 웹 페이지니까 당연한 거임.
그래서 진짜 네이티브 UI가 가능한지 확인해보고 싶었음. 일반 개발자가 TV 미디어 스택에 접근할 수 있는 공개된 네이티브 SDK는 없지만, 당연히 그 밑바닥엔 스택이 존재하잖아. 그래서 개발용 TV를 루팅해서 네이티브 라이브러리를 뽑아내고 Ghidra로 뜯어보기 시작함. (루팅은 연구할 때만 필요했고, PlxNative 자체는 루팅 없이도 돌아감.) webOS 홈브류 커뮤니티가 이미 플랫폼에 대해 놀라울 정도로 많은 정보를 문서화해 놔서 시간 엄청 아꼈음. 진짜 고맙다.
LG 바이너리 뜯어보기
난 원래 OS가 밑바닥에서 어떻게 돌아가는지 관심이 많았음. 를 몇 년째 유지보수하고 있는데, 크래시 리포팅이라는 게 결국 문서에 적힌 대로가 아니라 시스템이 실제로 어떻게 돌아가는지 파헤치는 작업이거든. AI 나오기 전엔 Hopper 켜고 어셈블리랑 문자열 보면서 호출 관계 하나하나 따라가야 그림이 그려졌음. 근데 이제는 이 작업이 엄청나게 쉬워짐. 이제 Opus한테 내부 구현 방식 물어보면 문서화가 개판이거나 아예 없어도 알아서 바이너리 뒤지고, 주소랑 xref, 문자열 사이를 넘나들면서 찾아줌. 모델이 가끔 헛소리할 때도 있어서 바이너리랑 실제 하드웨어가 최종 확인을 해줘야 하긴 함. 그래도 며칠씩 걸리던 조사가 훨씬 빨리 끝남.



