Tauri 앱에 scrcpy 통합 — Mac에서 Android 화면 미러링

발행: (2026년 5월 24일 PM 02:25 GMT+9)
3 분 소요
원문: Dev.to

출처: Dev.to

HiyokoKit 은 scrcpy 를 이용한 Android 원격 제어 기능을 포함합니다. Tauri 앱에서 scrcpy 를 실행하고 관리하는 데는 몇 가지 특수한 과제가 있습니다.
scrcpy 는 ADB 를 통해 Android 기기의 화면을 미러링하고 제어할 수 있는 오픈 소스 도구입니다. Mac 에서 Android 화면을 미러링하기 위한 최고의 무료 옵션으로, 빠르고 지연이 낮으며 기기에 별도의 앱을 설치할 필요가 없습니다.

use std::process::{Command, Child};

pub struct ScrcpyProcess {
    child: Option<Child>,
}

impl ScrcpyProcess {
    pub fn start(
        &mut self,
        device_serial: &str,
        max_size: u32,
        bit_rate: &str,
    ) -> Result<(), AppError> {
        let child = Command::new("scrcpy")
            .args([
                "--serial", device_serial,
                "--max-size", &max_size.to_string(),
                "--video-bit-rate", bit_rate,
                "--window-title", "Android Mirror",
                "--no-audio",
            ])
            .spawn()
            .map_err(|e| AppError::Scrcpy(e.to_string()))?;

        self.child = Some(child);
        Ok(())
    }

    pub fn stop(&mut self) {
        if let Some(mut child) = self.child.take() {
            child.kill().ok();
        }
    }

    pub fn is_running(&mut self) -> bool {
        if let Some(child) = &mut self.child {
            child.try_wait().map(|s| s.is_none()).unwrap_or(false)
        } else {
            false
        }
    }
}

scrcpy 가 사용자의 머신에 설치돼 있거나 앱에 번들되어 있어야 합니다. 저는 앱 리소스에 유니버설 바이너리 형태로 번들합니다:

{
  "bundle": {
    "resources": [
      "bin/scrcpy",
      "bin/adb"
    ]
  }
}

런타임에서 리소스 경로를 얻는 방법은 다음과 같습니다:

let scrcpy_path = app_handle
    .path()
    .resource_dir()
    .unwrap()
    .join("bin/scrcpy");

scrcpy 는 사용자가 미러링 창을 닫으면 자동으로 종료됩니다. 이를 감지해 UI 를 업데이트하려면 다음과 같이 백그라운드에서 폴링합니다:

// 백그라운드에서 폴링
tokio::spawn(async move {
    loop {
        tokio::time::sleep(Duration::from_secs(1)).await;

        let running = {
            let mut proc = scrcpy_state.lock().unwrap();
            proc.is_running()
        };

        if !running {
            app_handle.emit("scrcpy-stopped", ()).ok();
            break;
        }
    }
});

여러 기기가 연결돼 있을 때는 --serial 플래그를 사용해 특정 기기를 선택해야 합니다. adb devices 로 시리얼 번호를 가져와 명시적으로 전달하는 예시는 다음과 같습니다:

async fn get_device_serial() -> Result<String, AppError> {
    let output = Command::new("adb")
        .args(["devices"])
        .output()
        .await?;

    let stdout = String::from_utf8_lossy(&output.stdout);
    stdout.lines()
        .skip(1)
        .find(|l| l.contains("device"))
        .and_then(|l| l.split_whitespace().next())
        .map(|s| s.to_string())
        .ok_or(AppError::Device("No device found".into()))
}

이 내용이 도움이 되었다면, ❤️ 를 눌러 주세요. 생각보다 큰 힘이 됩니다 — 감사합니다!

HiyokoKit (scrcpy 기반 Android 원격 제어 포함) → https://hiyokomtp.lemonsqueezy.com/checkout/buy/2c94dd0f-e28a-4a17-8efc-7bd93087d46d
X → @hiyoyok

0 조회
Back to Blog

관련 글

더 보기 »

내 스킬

프로젝트를 위한 AI 지시문을 만들고, 설치하고, 관리하세요 — 코딩이 필요 없습니다. CREATE 이름을 정하고, 카테고리를 선택하고, 원하는 것을 설명하세요 — 마법사가 자동으로 구성합니다.