lipo 사용법
lipo 사용법
iOS 라이브러리나 바이너리를 다루다 보면 특정 시점에 꼭 만나는 도구가 lipo다. 평소 앱 개발만 할 때는 거의 쓸 일이 없지만, 서드파티 바이너리 분석, 시뮬레이터와 디바이스 아키텍처 분리, 레거시 프레임워크 정리 같은 작업을 하다 보면 갑자기 필요해진다.
문제는 대부분 lipo를 아키텍처 제거 명령 한 줄 정도로만 기억한다는 점이다. 그런데 이 도구는 얇게 알면 실수하기 쉽고, 잘못 다루면 업로드 실패나 링크 오류로 이어질 수 있다. 지금은 XCFramework가 권장 포맷이지만, 여전히 벤더 SDK나 레거시 산출물 때문에 lipo를 볼 일이 남아 있다.
lipo가 하는 일
간단히 말하면 lipo는 Mach-O 바이너리의 아키텍처 조합을 확인하고, 분리하고, 합치는 도구다.
대표적으로 할 수 있는 작업은 아래다.
- 바이너리에 어떤 아키텍처가 들어있는지 확인
- 특정 아키텍처만 추출
- 특정 아키텍처 제거
- 여러 바이너리를 하나로 합치기
가장 먼저 쓰는 명령
어떤 아키텍처가 들어있는지 확인
lipo -info MyFramework.framework/MyFramework
또는 아키텍처 이름만 간단히 보고 싶다면 아래 명령을 쓴다.
lipo -archs MyFramework.framework/MyFramework
실무에서는 이 두 명령이 가장 자주 쓰인다. 빌드 에러가 났을 때도 우선 바이너리에 arm64, x86_64가 실제로 들어 있는지부터 보는 편이 빠르다.
자주 쓰는 예제
특정 아키텍처만 추출
lipo MyBinary -extract arm64 -output MyBinary-arm64
공급사 바이너리가 여러 아키텍처를 포함할 때 디바이스용만 떼어 확인하고 싶다면 이런 식으로 쓴다.
특정 아키텍처 제거
lipo MyBinary -remove x86_64 -output MyBinary-no-sim
예전에는 App Store 업로드 전에 시뮬레이터 아키텍처를 제거하는 용도로 자주 썼다. 다만 지금은 배포 구조 자체를 XCFramework로 정리하는 편이 더 낫다.
바이너리 합치기
lipo -create Device/MySDK Simulator/MySDK -output Universal/MySDK
디바이스용과 시뮬레이터용 바이너리를 합쳐 Universal 형태를 만들 때 쓴다. 예전 프레임워크 배포 방식에서는 익숙했지만, 현재는 충돌 여지가 있어 신중해야 한다.
왜 아직 알아둘 가치가 있나
XCFramework가 표준처럼 자리 잡았는데도 lipo가 쓸모 있는 이유는 레거시가 생각보다 오래 남기 때문이다.
- 오래된 사내 SDK 유지보수
- 벤더가 전통적인
.framework만 제공 - 바이너리 내부 구조를 빠르게 확인해야 하는 상황
- CI에서 아키텍처 검증 스크립트를 짤 때
즉, 요즘 방식의 주역은 아니지만 문제를 진단하는 스캐너로는 여전히 유용하다.
자주 겪는 함정
arm64 하나만 남겼더니 시뮬레이터가 안 돈다
Apple Silicon 시대에는 시뮬레이터도 arm64를 쓸 수 있어서 예전 감각으로 단순 제거하면 더 헷갈릴 수 있다. arm64 = 디바이스라고만 생각하면 안 된다. 어떤 플랫폼용 arm64인지 구분해야 한다.
Universal로 합쳤는데 Xcode에서 이상하게 동작한다
바이너리 병합 자체가 된다고 해서 배포 구조가 올바른 것은 아니다. 프레임워크 메타데이터, 모듈 구성, 플랫폼 차이까지 고려해야 한다. 그래서 요즘은 lipo로 억지 병합하는 것보다 xcodebuild -create-xcframework가 대체로 낫다.
업로드 실패 원인을 lipo 탓으로만 본다
실제 원인은 서명, 심볼, 프레임워크 포함 방식, 잘못된 embedding 설정일 수 있다. lipo는 확인 도구이지 만능 해결책은 아니다.
XCFramework와의 관계
지금 새로 배포 구조를 만든다면 솔직히 lipo보다 XCFramework를 먼저 고려하는 편이 맞다. 그래도 lipo를 알아두면 아래에 유리하다.
- 들어 있는 아키텍처를 빠르게 확인
- 공급사 바이너리 문제 진단
- CI에서 sanity check 자동화
예를 들어 CI에서는 아래처럼 같이 확인해 둘 수 있다.
lipo -info MySDK.framework/MySDK
file MySDK.framework/MySDK
빠른 체크리스트
- 먼저
lipo -info로 실제 아키텍처를 확인했다 - arm64를 플랫폼 구분 없이 단순 해석하지 않았다
- 레거시 배포가 아니라면 XCFramework 사용 가능성을 먼저 검토했다
- 제거나 병합 후 실제 빌드와 실행으로 검증했다
- 문제 원인을 lipo 하나로 단정하지 않았다
마무리
lipo는 화려한 도구는 아니지만, 바이너리 아키텍처 문제를 만났을 때 가장 빠르게 현실을 보여 주는 도구다. 특히 레거시 프레임워크와 공급사 SDK를 다룰 때는 아직도 유효하다. 다만 지금 기준으로는 확인에는 lipo, 배포에는 XCFramework라는 감각을 갖고 가는 편이 훨씬 안전하다.
댓글남기기