Android System & AOSP Engineering/Debug, ADB & System Tools

안드로이드 ADB GPS 위치 조작 가이드: 가짜 위치(Mock Location) 및 모드 변경법

임베디드 친구 2025. 2. 26. 13:35
반응형

배달 앱, 내비게이션, 소셜 미디어 등 위치 기반 서비스(LBS)를 탑재한 안드로이드 애플리케이션을 개발하고 검증할 때는 다양한 좌표계에서의 동작을 확인해야 합니다. 특정 지역에서만 발동하는 지오펜싱(가상 울타리) 기능을 테스트하거나 해외 특정 국가에서의 GPS 수신 시나리오를 검증하기 위해 매번 디바이스를 들고 현장으로 나갈 수는 없는 노릇입니다. 안드로이드 스튜디오의 에뮬레이터 확장 컨트롤 UI를 사용하는 방법도 있지만, 대량의 물리 단말기를 연동하여 테스트를 자동화하거나 연속적인 이동 경로를 스크립트로 묘사해야 할 때는 ADB(Android Debug Bridge) 명령어가 유일한 대안이 됩니다. 이번 포스팅에서는 ADB 셸을 이용해 시스템의 GPS 기능을 끄고 켜는 제어 기법과 특정 테스트 애플리케이션에 가짜 위치 주입 권한을 강제로 부여하고 회수하는 구체적인 명령 체계를 살펴보겠습니다.

Generated by Gemini AI.

핵심 요약

  • 안드로이드 시스템 내부의 secure 데이터베이스와 location 인텐트를 조합하면 하드웨어 터치 없이도 GPS 프로바이더의 활성화 상태를 제어할 수 있습니다.
  • appops 도구를 활용하면 앱 내부 소스 코드를 수정하지 않고도 터미널 콘솔 명령만으로 가짜 위치(Mock Location) 권한을 특정 패키지에 주입할 수 있습니다.
  • 액티비티 매니저(am start) 프레임워크 인터페이스에 지오 스킴(geo) 인텐트 페이로드를 바인딩하여 송출하면 지정한 위경도 좌표의 맵 인스턴스를 즉각 호출할 수 있습니다.

1. ADB 위치 서비스 제어 및 권한 관리 명령어 요약

안드로이드 단말기의 GPS 모듈 상태를 바꾸고 애플리케이션별 가짜 위치 접근 권한을 제어하는 핵심 명령어 세트입니다.

기능 분류 터미널 실행 명령어 구조 동작 메커니즘 및 판독 가치
위치 서비스 모드 변경 adb shell settings put global location_mode <값> 최신 안드로이드 OS 빌드에서 기기의 전반적인 위치 정보 수신 모드(종료/네트워크/GPS 등)를 정수 코드로 일괄 조작
구형 GPS 활성화 플래그 adb shell settings put secure location_providers_allowed +gps 안드로이드 9 미만 버전 장비에서 보안 테이블 레이어의 gps 제공자 플래그를 수동으로 활성화
구형 GPS 비활성화 플래그 adb shell settings put secure location_providers_allowed -gps 시스템 테이블 내 가용 위치 프로바이더 목록에서 gps 매핑 지분을 강제 삭제
위치 공급 상태 조회 adb shell settings get secure location_providers_allowed 현재 디바이스 커널에 등록되어 상주 중인 하드웨어 위치 공급자 리스트 확인
가짜 위치 권한 부여 adb shell appops set <package_name> android:mock_location allow 타깃 애플리케이션에 샌드박스를 우회하는 가짜 위치 데이터 주입 연산 플래그 적용
가짜 위치 권한 확인 adb shell appops get <package_name> android:mock_location 지정한 패키지가 가상 GPS 좌표 데이터를 수신할 수 있는 런타임 상태인지 검증
가짜 위치 권한 박탈 adb shell appops set <package_name> android:mock_location deny 인위적인 위치 변조 플래그를 차단하고 실제 GPS 칩셋 데이터만 바라보도록 원복

2. 작업 시나리오별 실무 활용 가이드

인텐트 기반 구글 지도 특정 좌표 연동

기기 내부에 설치된 구글 지도나 시스템 맵 뷰어를 호출하여 위도 37.7749, 경도 -122.4194인 샌프란시스코 지역의 지형 구조를 런타임에 띄우는 명령 구조입니다.

Bash
 
# 기본 줌 맵 뷰어 액티비티 호출
adb shell am start -a android.intent.action.VIEW -d "geo:37.7749,-122.4194"

# 줌 레벨을 15단계로 정밀 설정하여 기하학적 인스턴스 오픈
adb shell am start -a android.intent.action.VIEW -d "geo:37.7749,-122.4194?z=15"

테스트 전용 앱에 가짜 위치 권한 주입 및 검증 파이프라인

위치 변조 오픈소스 라이브러리나 자체 개발한 가상 좌표 송출용 테스트 패키지(com.example.testapp)를 기기에 설치한 뒤, 시스템 설정 메뉴를 거치지 않고 다이렉트로 가짜 위치 권한을 바인딩하는 과정입니다.

Bash
 
# 단계 1: 해당 패키지에 런타임 가짜 위치 연산 바인딩 설정
adb shell appops set com.example.testapp android:mock_location allow

# 단계 2: 주입된 보안 플래그 속성이 올바르게 반영되었는지 데이터베이스 매핑 상태 확인
adb shell appops get com.example.testapp android:mock_location

# 단계 3: [테스트 완료 후] 다른 보안 시나리오 검증을 위해 권한 테이블 상태 원복
adb shell appops set com.example.testapp android:mock_location deny

개발을 위한 팁

  • 최신 안드로이드 버전을 위한 location_mode 스위칭: 안드로이드 9(API 28) 이상 시스템부터는 기존의 location_providers_allowed 테이블 방식이 감추어지고 global 영역의 location_mode 상수로 세팅을 제어하는 구조로 변경되었습니다. 최신 기기 환경에서 위치 서비스를 완벽히 제어하려면 아래 테이블 매핑 규칙에 따라 정수 값을 주입해 주어야 정상 구동됩니다.
설정 값 (Integer) 매핑되는 시스템 내부 위치 모드 명칭 세부 하드웨어 제어 특성
0 LOCATION_MODE_OFF 단말기의 모든 위치 서비스 및 GPS 센서 모듈을 완전히 비활성화합니다.
1 LOCATION_MODE_SENSORS_ONLY 와이파이나 기지국 정보를 배제하고 오직 물리 GPS 칩셋 센서만 활용합니다.
2 LOCATION_MODE_BATTERY_SAVING 배터리 소모를 줄이기 위해 GPS를 끄고 와이파이 및 모바일 네트워크 기지국 정보로만 측정합니다.
3 LOCATION_MODE_HIGH_ACCURACY GPS, 와이파이, 모바일 네트워크 센서를 총동원하여 가장 정밀한 위치를 산출합니다.
  • 가짜 위치 앱 개발 시 Manifest 선언 준수: adb shell appops 명령으로 권한을 강제 주입하더라도, 타깃 앱 프로젝트의 소스 코드 내부 AndroidManifest.xml 파일 안에 <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 권한 명세 플래그가 누락되어 있다면 안드로이드 가상 OS 커널 레벨에서 가짜 좌표 데이터 유입을 자체 차단하므로 주의해야 합니다.

흔히 하는 실수

  • 안드로이드 10 이상 버전에서의 location_providers_allowed 오동작: 최신 안드로이드 단말기 셸에서 adb shell settings put secure location_providers_allowed -gps 명령을 타이핑하면 하위 호환성 유지 메커니즘으로 인해 얼핏 명령어가 먹힌 것처럼 보이지만, 실제 시스템 UI 상에서는 GPS 아이콘이 꺼지지 않고 백그라운드 런타임 테이블이 꼬이는 현상이 발생합니다. 안드로이드 10 이상의 기기를 타겟팅하여 테스트 리그를 구축할 때는 앞서 언급한 global location_mode 변수를 활용하는 방식으로 셸 가상 코드를 마이그레이션해야 에러가 없습니다.
  • 단순 맵 링크 오픈과 실시간 Mock 위치 데이터 주입의 개념 혼동: adb shell am start -a android.intent.action.VIEW -d "geo:좌표" 명령어 세트는 단말기에 설치된 구글 지도 앱을 열어 해당 좌표의 카메라 뷰를 단순 시각화해 주는 뷰어 호출 인텐트일 뿐입니다. 기기 자체의 시스템 가상 GPS 주소 공간을 해당 좌표로 바꾸어 주는 것이 아니므로, 내가 개발 중인 일반 앱(예: 배달 커머스 앱) 내부의 현재 위치 확인 로직을 테스트하려면 이 명령이 아닌 appops 세팅 후 별도의 Mock 공급자 등록 앱을 통해 백그라운드에서 실시간으로 가상 좌표 데이터를 쏴주어야 합니다.
  • appops 초기화 누락으로 인한 실장 장비 GPS 오작동: 테스트 장비 리그에서 가짜 위치 테스트를 마치고 단말기를 일반 필드 테스트용으로 전환할 때 appops set <패키지명> android:mock_location deny 처리를 빼먹으면 시스템 내부 라우팅 테이블에 해당 가짜 위치 매핑 속성이 영구 보존됩니다. 이 경우 상용 빌드 상태에서 실제 하늘을 바라보고 GPS를 수신하려 해도 이전 가상 데이터 필터 블록과 충돌을 일으켜 실제 위치를 잡지 못하고 엉뚱한 이전 가상 좌표 주위에 멈춰있는 하드웨어 고정 현상이 발생할 수 있으므로 테스트 시나리오 마감 후에는 반드시 차단 상태로 환원해야 합니다.

결론

ADB 프레임워크 기반의 GPS 조작 및 가짜 위치 매핑 도구는 지리적 공간 제약이 걸려있는 복잡한 LBS 시스템 비즈니스 로직을 터미널 콘솔창 한 줄로 가상 모사할 수 있는 훌륭한 자동화 프로파일링 규격입니다. 각 안드로이드 운영체제 빌드 세대별로 변모해 온 위치 서비스 제어 데이터베이스 네임스페이스 테이블의 변동 내역과 인텐트 발행 메커니즘을 명확히 숙지해 두면 무거운 하드웨어 GPS 시뮬레이터 장비나 필드 출장 공수 없이도 빌드 파이프라인 내에서 정밀한 글로벌 위치 추적 방어 코드를 검증할 수 있습니다. 본 포스팅에서 안내해 드린 OS 버전별 제어 코드 세트와 가짜 위치 권한 관리 옵션을 적용하여 위치 기반 애플리케이션의 유효성 검증 프로세스를 효율화해 보시기 바랍니다.

반응형