모바일 개발 도구
모바일 엔지니어링 팀을 위한 오픈 소스 도구입니다. 각 도구는 Revyl CLI를 사용하여 클라우드 장치를 부팅하고, 자연어를 이용해 앱과 상호 작용하며, 증거를 캡처합니다. 이는 AI 기반 자동화를 위해 Claude Code와 결합되었습니다.
이 도구들은 오늘 바로 포크(fork)하고 실행할 수 있는 실제 도구입니다. 또한 팀이 자체 워크플로우에 맞춰 내부 도구를 구축할 수 있도록 가능성을 보여주기 위해 설계된 청사진(blueprints) 역할도 합니다.
시작하기
로컬에서 Revyl을 사용해 보려면 브라우저 기반 로그인부터 시작하세요. 첫 실행 시에는 API 키를 생성하고 복사할 필요가 없습니다.
brew install RevylAI/tap/revyl
pip install revyl
...
그런 다음 아래 도구 중 하나를 선택하고 해당 README를 따르세요. 클라우드 장치를 부팅하는 도구는 Revyl에 앱 빌드를 업로드하도록 요청할 것입니다. API 키도 여전히 지원되지만, 주로 CI(지속적 통합), 자동화 및 기타 비대화형 환경을 위한 것입니다.
Revyl 설정 없이 무언가를 시도하고 싶으신가요? Greenlight는 완전히 오프라인에서 실행되며 계정이 필요하지 않습니다.
도구들
[Security Scanner]
자동화된 모바일 앱 침투 테스트(penetration testing). 소스 코드에 정적 분석(static analysis) (semgrep + 패턴 매칭)을 실행한 다음, 클라우드 장치를 부팅하여 발견된 취약점을 동적으로 악용합니다. 이를 통해 안전하지 않은 저장소, 네트워크 보안, 인증 우회 등을 테스트합니다.
- Android(Java/Kotlin) 및 iOS(Swift/ObjC)에 대한 정적 분석
- 실제 클라우드 장치에서의 동적 악용(exploitation)
- 스크린샷을 증거로 포함한 전체 침투 테스트 보고서 생성
- 10가지 취약점 카테고리에 걸친 34개 이상의 탐지 패턴
pentest scan ./my-app --platform android
| 탐지 항목 | 방법 |
|---|
| 하드코딩된 비밀값(Hardcoded secrets), API 키 | 정적 grep + semgrep 규칙 |
개발자가 PR을 열면, Claude가 diff를 읽고, 무엇이 변경되었는지 파악하며, 새로운 빌드를 가진 클라우드 장치를 부팅하고, 영향을 받은 화면으로 이동한 후, PR에 스크린샷 증거를 직접 게시합니다.
- Claude Code Action을 통해 GitHub Actions에 플러그인 연결
- 테스트할 화면을 결정하기 위해 코드 diff를 이해합니다.
- 앱 탐색 시 자연어 사용 (요소 ID 불필요)
- PR 댓글로 전후 스크린샷 게시
개발자가 버튼 색상 변경을 푸시함
-> Claude가 diff를 읽음
-> 클라우드 장치를 부팅함
...
| PR diff | 장치 스크린샷 |
|---|
CartContext.tsx — 제품 대체 버그 수정됨 | Claude가 장치를 부팅하고, Orchid Mantis를 장바구니에 추가한 후, 버그를 포착함 |
두 빌드 간의 스크린샷을 비교하여 의도하지 않은 UI 변경 사항을 포착합니다. 기준선(baseline) 및 현재 빌드의 모든 핵심 화면을 캡처하고, 이를 픽셀 단위로 비교하며, 강조된 변경 영역이 포함된 시각적 보고서를 생성합니다.
screens.yaml을 통한 설정 가능한 화면 목록
- 변경된 영역에 빨간색/자홍색 오버레이가 적용된 픽셀 비교 엔진
- 나란히 비교 및 통계가 포함된 HTML 보고서
- CI 통합: 설정 가능한 diff 임계값(기본값 0.1%)에 따라 PR을 게이트합니다.
기준선 빌드 | 현재 빌드
| |
[Device A] [Device B]
...
[PASS] shop_home 0.00% diff
[PASS] product_detail 0.03% diff
[FAIL] cart 2.45% diff <- something changed
...
Figma에서 디자인 프레임을 가져와 클라우드 장치에서 실제 앱을 부팅하고, 일치하는 화면의 스크린샷을 찍은 후 픽셀 비교를 수행하여 개발자가 설계된 대로 구축했는지 확인합니다.
- Figma API에서 프레임을 직접 가져옵니다
- 설정을 통해 Figma 프레임 이름을 앱 화면에 매핑합니다
- 혼합 충실도 점수 (픽셀 70% + 구조적 유사성 30%)
- 규정 준수 등급: A (95% 이상)부터 F (70% 미만)까지
- 임베디드 이미지가 포함된 다크 테마 HTML 보고서
Figma 파일 클라우드 기기 보고서
| | |
| 프레임 내보내기 | 앱 부팅 |
...
Shop Home 96.8% [A]
Product Detail 92.4% [B]
Search 90.1% [B]
...
Apple App Store 제출 전 규정 준수 스캐너입니다. 소스 코드, 개인 정보 보호 매니페스트(privacy manifests), IPA 바이너리 및 App Store Connect 메타데이터를 Apple의 검토 가이드라인과 비교하여 분석하며, Apple이 거절하기 전에 위험을 포착합니다.
- 완전히 오프라인이며 계정이 필요 없고 1초 이내에 실행됩니다
- 30개 이상의 코드 패턴 검사: 비공개 API(private APIs), 하드코딩된 비밀 정보, 결제 위반 사항, 누락된 ATT(App Tracking Transparency)
- 개인 정보 보호 매니페스트 검증기: 필수 이유 API(Required Reason APIs), 추적 SDK, PrivacyInfo.xcprivacy 완전성 확인
- IPA 바이너리 검사기: Info.plist 키, 앱 아이콘, 프레임워크 개인 정보 보호 매니페스트
- Swift, Objective-C, React Native 및 Expo 프로젝트 지원
greenlight preflight /path/to/your/project
...
| 스캐너 | 검사 항목 |
|---|
| metadata | 앱 이름, 버전, 번들 ID, 아이콘, 개인 정보 보호 정책 URL, 목적 문자열 |
| ... | |
자동화된 앱 화면 매핑입니다. 클라우드 기기를 부팅하고, AI 기반 BFS(Breadth-First Search) 탐색을 사용하여 모든 화면을 체계적으로 탐색하며, 모든 화면과 사용자 경로의 스크린샷이 포함된 대화형 탐색 지도를 생성합니다.
- AI 기반 탐색 기능 — Claude Code가 앱을 탐색하고, 화면을 식별하며, 전환 경로를 매핑합니다.
- React Flow 그래프, 여정 내비게이터(journey navigator), 및 화면 상세 패널이 있는 인터랙티브 뷰어 제공
- 하이라이팅과 이전/다음 탐색 기능을 통해 사용자 경로를 단계별로 추적할 수 있습니다.
- 접근성 ID(accessibility IDs)나 XPath가 필요 없으며, 모든 Android 또는 iOS 앱에서 작동합니다.
- Mermaid 내비게이션 그래프를 포함한 마크다운 보고서를 생성합니다.
| Feature | How |
|---|
| Screen discovery | AI가 탐색하고 도달 가능한 모든 화면을 스크린샷으로 캡처합니다 |
| ... | |
모든 흐름(flow)을 깨끗하고 끊김 없이 루프되는 GIF(및 MP4)로 변환하며, 이는 깔끔한 기기 목업 프레임 안에 담겨 README나 런칭 트윗에 바로 사용할 수 있습니다. YAML로 몇 단계만 작성하고 앱을 지정하면, 클라우드 장치가 구동되어 각 상태의 스크린샷을 찍고, 이를 프레임화하며, 루프를 연결합니다.
- 자연어 흐름 단계 (
tap/type/swipe/navigate/instruction) — 요소 ID 불필요
- 에셋이 없는 iPhone/Android 프레임: 둥근 화면, 얇은 베젤, Dynamic Island/노치, 측면 버튼, 부드러운 그림자, 사용자 지정 배경 지원
- 홀드 및 크로스페이드가 적용된 끊김 없는 루프를 GIF(ffmpeg
palettegen/paletteuse)와 MP4 형식으로 인코딩합니다.
- 출력물 옆에
preview.html을 컴파일합니다; --dry-run은 장치 없이 캡처된 프레임으로부터 재렌더링합니다.
revyl-gif flows/my-flow.yaml
| Flow | Result |
|---|
flows/ubert.yaml — Home → search → "Times Square" → ride options | README에 바로 사용할 수 있도록 프레임화된 루핑 탑승 예약 GIF |
앱이 백그라운드 처리되면, OS는 앱 전환기 카드(iOS)와 최근 사용 항목 썸네일(Android)을 위해 현재 화면을 스냅샷합니다. 결제 양식이나 SSN(사회보장번호) 화면이 위에 표시되어 있을 경우, 이 스냅샷은 유지됩니다. 이는 모바일 침투 테스트에서 가장 흔하게 실패하는 항목 중 하나입니다 (OWASP MASVS-STORAGE-9 / PCI). 이 도구는 앱을 각 민감한 화면으로 이동시키고, 백그라운드 처리하여 OS가 실제로 기록한 스냅샷이 가려졌는지 확인합니다. 그 결과는 PASS/FAIL과 함께 나란히 비교되는 증거를 제공합니다.
- 클라우드 장치에서 iOS 사용 (Mac 필요 없음) — 앱 전환기는 CLI(Command Line Interface)를 통해 열 수 없기 때문에, Control Center를 끌어내려 앱이 활성 상태를 포기하도록 만듭니다 (OS가 스냅샷을 찍는 데 사용하는 것과 동일한
scenePhase != .active 트리거). 그런 다음 활성 프레임과 비활성 프레임을 블러 불변 상관관계(blur-invariant correlation)로 비교합니다.
- 로컬에서 iOS 사용 (macOS) — 디스크에 있는 앱 전환기 스냅샷을 디코딩하여 (Apple
AAPL → LZFSE → ASTC, 외부 바이너리 없음), 유출된 텍스트를 원문 그대로 복구합니다.
- Android — OS가
FLAG_SECURE 창에 대해 공백 처리하는 최근 사용 항목 썸네일을 판별합니다. 스크린샷은 FLAG_SECURE를 무시하고 직접 읽기 때문에, 실시간 화면이 유일한 증거입니다.
FAIL이 발생하면 0이 아닌 값으로 종료되므로, 규정 준수 게이트(compliance gate)로 바로 CI에 전달됩니다.
python -m redaction_check sensitive-screens.yml
| 화면 | 판정 |
|---|
| Add Card — resign 시 개인 정보 보호 커버 없음 | FAIL — 백그라운드 처리되어도 카드 양식이 여전히 렌더링됨 |
Add Card — scenePhase .inactive에 커버 있음 | PASS — 스냅샷이 불투명한 커버로 대체됨 |
작동 방식 (How They Work)
실행 중인 앱과 상호 작용하는 대부분의 도구는 동일한 패턴을 따릅니다:
- Revyl CLI가 클라우드에서 실제 장치를 부팅하고 사용자의 앱을 설치합니다.
- 자연어 타겟팅 (Natural language targeting) —
revyl device tap --target "Add to Cart button" — 접근성 ID, XPath, 요소 검사기(element inspectors)가 필요 없습니다.
- 증거로서의 스크린샷 — 모든 동작이 캡처되어 보고서에 포함됩니다.
- AI 오케스트레이션 (AI orchestration) — Claude Code는 컨텍스트(차이점, 설정, 디자인)를 읽고 무엇을 테스트할지 결정합니다.
revyl device start --platform android --app-id $APP_ID --json
revyl device tap --target "Add to Cart button" --json
...
--target 플래그는 AI를 사용하여 자연어 설명을 화면 좌표로 해석합니다. 이는 이 도구들이 UI 계층 구조(UI hierarchy)를 알 필요 없이 모든 앱에서 작동한다는 것을 의미합니다.
직접 만들기 (Build Your Own)
이 도구들은 템플릿입니다. 자신만의 도구를 구축하는 패턴은 다음과 같습니다:
- 자동화할 것 정의하기 — 현재 팀이 장치에서 앱을 실행하는 과정에 수동으로 수행하는 작업은 무엇인가요?
- 스크립트 작성하기 — 자연어 상호작용을 위해
--target을 사용한 revyl device 명령어를 사용합니다.
- Claude 추가하기 — CLAUDE.md를 사용하여 Claude에게 앱에 대한 컨텍스트를 제공한 다음, 이를 오케스트레이션(orchestrate)하도록 합니다.
- 연결하기 — GitHub Actions, 크론 작업(cron job), Slack 봇 등 워크플로우에 맞는 것을 사용합니다.
| 도구 | 기능 |
|---|
| 온보딩 검증기 | 신입 사원이 첫 기능을 푸시하면 — 봇이 장치를 부팅하고, 해당 기능을 실행한 다음, PR에 스크린샷을 게시합니다. |
| ... | |
시작하기 (Getting Started)
로컬 탐색을 위해 대부분의 클라우드 장치 도구는 두 가지가 필요합니다:
- 로그인된 Revyl CLI 세션:
- Revyl에 업로드된 앱:
revyl app create --name "MyApp" --platform android --json
revyl build upload --skip-build --platform android --app "$APP_ID" --file app.apk --json --yes
GitHub Actions 또는 기타 비대화형 환경의 경우, app.revyl.ai에서 설정(Settings) -> API 키(API Keys) 아래에 Revyl API 키를 생성하고 이를 REVYL_API_KEY로 설정합니다.
그런 다음 위에 있는 도구 중 아무거나 포크(fork)하여 해당 README를 따르세요.
샘플 앱 (Sample App)
여러 저장소에는 자체 앱을 연결하기 전에 사용할 수 있는 샘플 앱이 포함되어 있습니다. PR Review Bot과 Visual Regression에는 테스트를 위해 의도적으로 버그가 포함된 React Native 이커머스 앱인 Bug Bazaar가 포함되어 있습니다. Figma Design Checker 저장소는 자체 샘플 앱과 예시 보고서 에셋을 포함합니다.
구축된 기술 (Built With)
라이선스 (License)
MIT