# DX Manager for macOS 사용 및 개발 가이드

Samsung DeX & 다중 가상 디스플레이 매니저 for macOS (.NET 8 Native Edition)

--- ## 1. 개요 (Overview) **DX Manager for macOS**는 삼성 갤럭시 스마트폰의 **Samsung DeX 가상 디스플레이** 및 **앱별 독립 가상 디스플레이(단일창)**를 macOS 환경에서 고성능 저지연으로 제어하고 관리할 수 있도록 포팅된 .NET 8 기반 크로스플랫폼 도구입니다. 기존 Windows 전용 WinForms 구현의 핵심 엔진(`DexManager.Core`)을 플랫폼 중립적인 .NET 8 아키텍처로 분리하고, macOS 환경에 최적화된 대화형 TUI 호스트(`DexManager.Mac`)와 네이티브 플랫폼 서비스(screencapture, launchd, POSIX 권한 관리 등)를 제공합니다. --- ## 2. 시스템 요구사항 (Requirements) - **운영체제**: macOS 14 Sonoma 이상 - **아키텍처**: - Apple Silicon (Apple M series) - Native ARM64 - Intel Mac (x86_64) - **포터블 ZIP 사용자**: Homebrew, .NET, scrcpy와 ADB를 별도로 설치하지 않습니다. Mac 아키텍처에 맞게 미리 빌드된 ZIP에 self-contained .NET 런타임, scrcpy 4.1, ADB와 scrcpy 서버가 포함됩니다. - **소스 개발자**: `global.json`에 지정된 .NET 8 SDK가 필요합니다. - **지원 스마트폰**: - Samsung Galaxy 기기 중 Samsung DeX를 지원하는 기기 (Galaxy S시리즈, Note시리즈, Z Fold시리즈, Tab S시리즈 등) - Android 16 / One UI 8.x (현재 기준 동작 검증) --- ## 3. 포터블 ZIP 실행 (Portable Release) ### 3.1 Mac에 맞는 ZIP 선택 - Apple M 시리즈 Mac: `DX-Manager-v-macos-arm64.zip` - Intel Mac: `DX-Manager-v-macos-x64.zip` 여기서 ``은 공개된 Release 버전(예: `2.0.1`)으로 바꿉니다. ZIP 안의 문서에는 패키징 시 실제 버전이 자동 반영됩니다. 저장소의 GitHub Actions workflow는 `macos-15` Apple Silicon 실행 환경과 `macos-15-intel` Intel 실행 환경에서 각각 전체 빌드·테스트·패키지 검증을 수행하도록 구성되어 있습니다. 버전 태그의 두 작업이 성공하면 검증된 ZIP 두 개와 SHA-256 파일을 포함한 GitHub Release 초안을 만들며, 유지관리자가 확인 후 공개합니다. 이 변경의 첫 원격 workflow 성공 여부는 아직 확인해야 합니다. Release가 공개된 뒤 사용자는 Mac에 맞는 ZIP 하나를 내려받아 전체 폴더의 압축을 풀고 `Start DX Manager.command`를 더블클릭합니다. 소스 빌드는 필요하지 않습니다. 현재 자동 생성 패키지는 Apple Developer ID 서명·공증 전 단계이므로 최초 실행 시 macOS 승인이 필요할 수 있습니다. Control-클릭 후 **열기**를 사용하거나 **시스템 설정 > 개인정보 보호 및 보안**에서 차단된 항목을 확인하십시오. 자동으로 보안 속성을 지우는 명령은 실행하지 않습니다. ### 3.2 스마트폰 설정 1. **개발자 옵션 활성화**: - 휴대폰 **설정 > 휴대전화 정보 > 소프트웨어 정보**에서 **빌드번호**를 7회 연속 탭합니다. 2. **USB 디버깅 켜기**: - **설정 > 개발자 옵션**으로 이동하여 **USB 디버깅**을 활성화합니다. 3. **USB 케이블 연결 및 RSA 디버깅 허용**: - 데이터 전송이 가능한 USB-C 케이블로 Mac과 갤럭시 스마트폰을 연결합니다. - 스마트폰 화면에 나타나는 **"이 컴퓨터에서 항상 디버깅을 허용합니까?"** 팝업에서 **항상 허용**을 체크하고 승인합니다. ## 4. 소스 개발 및 포터블 패키징 (Development & Packaging) 이 절은 프로그램을 수정하거나 배포 ZIP을 만드는 개발자용입니다. 일반 사용자는 3절의 미리 빌드된 ZIP만 사용하면 됩니다. ### 4.1 솔루션 빌드 ```bash # Release 빌드 dotnet build DexManager.Mac.sln -c Release # 빌드 경고를 에러로 엄격 처리하는 빌드 dotnet build DexManager.Mac.sln -c Release /warnaserror ``` ### 4.2 테스트 스위트 실행 DX Manager for macOS는 xUnit 기반 단위/통합 테스트와 다중 기기 회귀 테스트를 사용합니다. ```bash # 95개 xUnit 단위 및 통합 테스트 실행 dotnet test DexManager.Mac.sln -c Release # 39개 다중 기기 세션 격리 회귀 테스트 실행 dotnet run --project DexManager.MultiDeviceTests -c Release ``` ### 4.3 아키텍처별 포터블 ZIP 생성 ```bash # Apple Silicon용 self-contained ZIP scripts/Package-Mac-Release.sh --rid osx-arm64 # Intel용 self-contained ZIP scripts/Package-Mac-Release.sh --rid osx-x64 ``` 스크립트는 DX Manager와 ADB proxy를 지정한 RID로 미리 publish하고, 공식 scrcpy 4.1 정적 빌드의 SHA-256을 확인한 뒤 번들합니다. 생성한 ZIP을 새 임시 폴더에 다시 풀어 실행 권한, CPU 아키텍처, 외부 Homebrew 경로 의존성, 버전, 라이선스와 사용자 데이터 제외 여부를 검사합니다. --- ## 5. 실행 및 CLI 명령어 (Usage & CLI Options) ### 5.1 대화형 콘솔 대시보드 (Interactive Dashboard) 실행 포터블 ZIP 사용자는 압축을 푼 폴더에서 다음 실행기를 더블클릭합니다. ```bash ./Start\ DX\ Manager.command ``` 소스 개발자는 다음 명령 중 하나로 같은 대시보드를 실행할 수 있습니다. ```bash dotnet run --project DexManager.Mac # 또는 빌드된 바이너리 직접 실행: ./DexManager.Mac/bin/Release/net8.0/DXManager.Mac ``` ### 5.2 CLI 인자 모드 (Command-line Arguments) 자동화 스크립트나 터미널 단축 명령을 위한 CLI 인자를 제공합니다: | 명령어 | 단축형 | 설명 | | :--- | :--- | :--- | | `--dex` | `-x` | 선택된 기기의 DeX 모드를 즉시 시작 (종료는 `Ctrl+C`) | | `--stop-dex` | | 현재 실행 중인 DeX 세션을 중지하고 가상 디스플레이 오버레이 정리 | | `--diag` | `-d` | 환경 점검 및 기기 호환성 진단 리포트를 실행하여 콘솔에 출력 | | `--version` | `-v` | DX Manager for macOS 버전 정보 출력 | | `--help` | `-h` | CLI 사용법 및 도움말 출력 | 예시: ```bash # 포터블 ZIP에서 DeX 즉시 실행 ./DXManager.Mac --dex # 시스템 및 기기 진단 리포트 출력 ./DXManager.Mac --diag ``` --- ## 6. 대화형 콘솔 대시보드 조작 가이드 (Dashboard Guide) 대화형 콘솔이 시작되면 연결된 기기 목록, 현재 선택된 기기, 해상도/DPI 설정 및 상태가 실시간으로 표시됩니다: ```text ╔══════════════════════════════════════════════════════════════════════╗ ║ DX MANAGER for macOS (.NET 8 Native Edition) ║ ║ Samsung DeX & High-Performance Screen Mirroring Suite ║ ╚══════════════════════════════════════════════════════════════════════╝ ▶ CONNECTED DEVICES & SYSTEM STATUS * [ACTIVE] [1] 현호의 S26 Ultra - Status: Connected Transports: Usb: R5CT1234567, Wireless: 192.168.0.50:5555 Selected Device : 현호의 S26 Ultra (R5CT1234567) Resolution / DPI : 1920x1080 @ 200 DPI Stream Bitrate/FPS : 24M / 60 FPS Screen Off / Awake : ScreenOff=True, StayAwake=True ▶ OPERATIONS MENU [1] Start DeX Mode [2] Stop DeX Mode [3] Start Single App Window [4] Stop Single App Window [5] Wireless ADB Management [6] File Transfer Coordinator [7] Diagnostics & Environment [8] DX Companion Guardian [9] Settings & Configuration [S] Select Active Device [L] View Recent Logs [Q] Exit DX Manager ``` ### 6.1 메뉴별 상세 기능 1. **`[1] Start DeX Mode`**: - 선택된 휴대폰에 가상 보조 디스플레이(Virtual Display Overlay)를 생성하고 Scrcpy를 통해 macOS 데스크톱에 삼성 덱스 화면을 엽니다. 2. **`[2] Stop DeX Mode`**: - 활성 DeX 세션의 Scrcpy를 종료하고 `overlay_display_devices` 정리를 요청합니다. 휴대폰 연결이 유지되면 가상 디스플레이 제거 결과를 확인하며, 먼저 연결이 끊기면 정리를 확인하지 못할 수 있습니다. 3. **`[3] Start Single App Window`**: - 가상 디스플레이 슬롯(1~3번)을 지정하고, 실행할 안드로이드 앱 패키지명(예: `com.sec.android.app.sbrowser`)을 입력하여 해당 앱만을 위한 독립된 가상 윈도우를 엽니다. 4. **`[4] Stop Single App Window`**: - 특정 단일 앱 슬롯 또는 전체(`A`) 단일 앱 창을 종료하고 리소스를 반환합니다. 5. **`[5] Wireless ADB Management`**: - **1. USB를 무선 모드로 전환**: USB로 연결된 기기에 `tcpip 5555`를 자동 적용하고 무선 엔드포인트로 전환합니다. - **2. 무선 기기 직접 연결**: IP 주소와 포트(기본 5555)를 입력하여 Wi-Fi 경유로 연결합니다. - **3. 무선 연결 해제**: 활성화된 무선 세션을 정상 종료합니다. 6. **`[6] File Transfer Coordinator`**: - Mac의 로컬 파일이나 디렉토리 경로를 스마트폰의 대상 폴더(기본: `/sdcard/Download`)로 전송(ADB Push)합니다. 7. **`[7] Diagnostics & Environment`**: - ADB, Scrcpy, .NET 8 런타임, 디바이스 SDK/One UI 버전, Companion 권한 상태를 종합 진단하여 점검 결과를 출력합니다. 8. **`[8] DX Companion Guardian`**: - 설치된 Companion의 상태와 권한을 확인합니다. 현재 macOS 공개 ZIP에는 Companion APK가 없으므로 자동 설치는 사용할 수 없습니다. 검증된 APK가 실제로 포함된 개발 빌드에서만 해시와 서명을 확인한 뒤 설치 메뉴가 동작합니다. 9. **`[9] Settings & Configuration`**: - 가상 디스플레이 가로/세로 해상도, DPI(기본: 160~240), 스트리밍 비트레이트(예: 16M, 24M), 최대 FPS(60/120), 화면 끄기(TurnScreenOff), 절전모드 방지(StayAwake) 설정을 인터랙티브하게 변경하고 영구 저장합니다. - **`[S] Select Active Device`**: 연결된 여러 대의 갤럭시 기기 중 제어할 대상 기기를 전환합니다. - **`[L] View Recent Logs`**: 실시간 세션 로그 및 ADB 트랜잭션 기록을 확인합니다. - **`[C] Clear Screen`**: 터미널 화면을 정리하고 배너와 대시보드를 다시 그립니다. - **`[Q] Exit`**: 활성 세션의 종료와 가상 디스플레이 정리를 요청하고 결과를 기다린 뒤 프로그램을 종료합니다. 휴대폰 연결이 먼저 끊기면 일부 정리를 확인하지 못했다는 메시지가 표시될 수 있습니다. --- ## 7. macOS Scrcpy 조작 및 단축키 안내 macOS 환경에서 Scrcpy 조작 시 기본 Modifier 키는 **`Option (⌥)`** 또는 **`Left Alt`**입니다: | 동작 | macOS 단축키 | 설명 | | :--- | :--- | :--- | | **한/영 언어 전환** | **`Shift + Space`** | **DeX / 단일창에서 한국어 ↔ 영어 입력 전환 (스마트폰에 한국어 물리 키보드 등록 필요)** | | 전체화면 전환 | `Option + F` 또는 `F11` | Scrcpy DeX 윈도우 전체화면 토글 | | 1:1 창 크기 맞춤 | `Option + G` | 디스플레이 원본 픽셀 크기로 윈도우 리사이즈 | | 스마트폰 화면 끄기 | `Option + O` | PC에서 미러링/DeX를 보면서 휴대폰 화면만 OFF | | 스마트폰 화면 켜기 | `Option + Shift + O` | 휴대폰 화면 다시 켜기 | | 전원 버튼 누름 | `Option + P` | 휴대폰 전원 키 에뮬레이션 | | 클립보드 붙여넣기 | `Cmd + V` 또는 `Option + V` | Mac 클립보드 텍스트를 스마트폰으로 동기화 및 붙여넣기 | | 텍스트 직접 주입 토글 | `Option + i` | Mac 키보드 텍스트 직접 주입 모드(`--prefer-text`) 켜기/끄기 | --- ## 8. 문제 해결 (Troubleshooting) ### Q1. DeX 종료 후 스마트폰 화면 구석에 작은 보조 화면이 남아있습니다. > **원인**: 케이블을 강제로 뽑거나 비정상 종료 시 Android OS가 오버레이 설정을 유지할 수 있습니다. > **해결 방법**: > 1. 대화형 콘솔에서 `[2] Stop DeX Mode`를 다시 실행합니다. > 2. 또는 터미널에서 수동으로 ADB 명령을 전송합니다: > ```bash > adb shell settings delete global overlay_display_devices > ``` > 3. 또는 스마트폰 **설정 > 개발자 옵션 > 보조 디스플레이 시뮬레이션**에서 아무 해상도를 선택했다가 다시 **'없음'**을 선택합니다. ### Q2. `scrcpy`를 실행할 수 없다는 오류가 발생합니다. > **포터블 ZIP 해결 방법**: `DXManager.Mac` 실행 파일만 따로 옮기지 않았는지 > 확인하고 ZIP 전체를 새 폴더에 다시 푸십시오. 같은 폴더의 > `tools/scrcpy/scrcpy`, `tools/scrcpy/adb`와 `scrcpy-server`가 모두 있어야 > 합니다. Homebrew 설치는 포터블 ZIP의 해결 조건이 아닙니다. 소스 개발 > 환경에서만 필요에 따라 PATH의 scrcpy를 fallback으로 사용할 수 있습니다. ### Q3. 기기 목록에 `unauthorized`로 표시됩니다. > **해결 방법**: 스마트폰 화면을 켜고 잠금을 해제한 뒤, Mac에 대한 **"USB 디버깅을 항상 허용"** 팝업을 승인하십시오.