안드로이드 애플리케이션 개발 과정에서 앱의 안정성을 확보하고 잠재적인 보안 위협을 탐색하는 일은 매우 중요합니다. 특히 배포 전 앱이 예상치 못한 입력에 어떻게 반응하는지 검증하는 무작위 입력 테스트(Fuzzing)나, 시스템 권한 설정을 통한 동적 테스트는 개발자의 필수 역량입니다. 안드로이드 프레임워크가 제공하는 ADB(Android Debug Bridge) 도구는 이러한 디버깅과 보안 점검을 터미널 명령 한 줄로 처리할 수 있는 강력한 인터페이스를 제공합니다. 이번 포스팅에서는 ADB의 monkey 도구를 활용한 스트레스 테스트 기법과 content 명령어를 통한 시스템 설정 조작법, 그리고 실무에서 보안 점검 시 유용한 로그 분석 및 권한 확인 방법을 정리해 보겠습니다.

핵심 요약
- adb shell monkey 명령어를 사용하면 앱에 수천 번의 무작위 입력을 주입하여 예기치 못한 크래시와 비정상 동작을 효율적으로 감지할 수 있습니다.
- adb shell content 명령어를 활용하면 터미널 환경에서 안드로이드 시스템 데이터베이스에 직접 접근하여 설정을 조회하거나 강제로 변경할 수 있습니다.
- dumpsys와 logcat을 조합하면 앱이 요구하는 권한 리스트를 확인하고 실시간 로그를 필터링하여 보안 취약점의 단서를 즉시 포착할 수 있습니다.
1. 앱 스트레스 테스트를 위한 Monkey 명령어 활용
monkey 도구는 앱에 무작위 사용자 이벤트를 주입하여 서비스의 회복 탄력성을 검증합니다.
| 이벤트 제어 옵션 | 명령어 예시 | 설명 |
| 기본 무작위 테스트 | adb shell monkey -p <패키지> 1000 | 지정한 앱에 1000회의 무작위 입력 이벤트를 수행합니다. |
| 터치 비율 조정 | --pct-touch 50 | 전체 이벤트 중 50%를 화면 터치로 할당합니다. |
| 모션 비율 조정 | --pct-motion 30 | 전체 이벤트 중 30%를 스와이프 등 모션으로 할당합니다. |
| 상세 로그 출력 | -v | 이벤트 수행 과정을 터미널에 상세하게 출력합니다. |
2. 시스템 설정 데이터베이스(Content Provider) 제어
기기의 설정 값(밝기, 네트워크 등)을 직접 조회하거나 수정하여 테스트 환경을 조성합니다.
| 작업 내용 | 실행 명령어 구조 | 설명 |
| 설정값 조회 | content query --uri content://settings/system --where "name='키값'" | 현재 시스템 설정 데이터베이스 내 특정 항목의 값을 읽어옵니다. |
| 설정값 변경 | content insert --uri content://settings/system --bind name:s:키값 --bind value:i:값 | 시스템 데이터베이스 내 항목을 강제로 수정하여 기기 상태를 변경합니다. |
3. 보안 점검을 위한 앱 권한 및 로그 분석
앱이 시스템 자원에 과도하게 접근하지 않는지, 내부적으로 중요한 정보가 로그에 남지 않는지 확인합니다.
| 보안 점검 항목 | 실행 명령어 | 점검 목적 |
| 앱 권한 확인 | dumpsys package <패키지> | grep permission | 앱이 설치 시 요구한 권한들이 필수적인지, 과도한지 검증합니다. |
| 로그 실시간 모니터링 | logcat -s <패키지> | 앱의 동작 중에 노출되는 보안 관련 로그나 디버그 정보를 확인합니다. |
개발을 위한 팁
- 좌표 기반 테스트의 한계: monkey는 화면 전체를 대상으로 무작위 입력을 넣기 때문에 특정 버튼만 반복적으로 눌러야 하는 시나리오에는 부적합합니다. 이럴 때는 adb shell input tap 명령어를 순차적으로 작성한 셸 스크립트를 사용하는 것이 훨씬 정확합니다.
- 권한 확인의 생활화: 배포용 빌드 앱을 점검할 때는 requested permissions 항목을 꼼꼼히 확인하십시오. ACCESS_FINE_LOCATION이나 CAMERA 권한이 앱의 기능과 무관하게 포함되어 있다면 보안 심사 과정에서 반려될 확률이 높습니다.
- 기기 재설정: content insert를 통해 시스템 설정을 강제로 변경했다면, 테스트 종료 후에는 반드시 초기값으로 되돌리거나 기기 설정을 초기화하여 테스트 데이터가 실사용 환경에 영향을 주지 않도록 관리해야 합니다.
흔히 하는 실수
- Monkey 종료 후에도 유지되는 이벤트: monkey 테스트는 수행 횟수가 다 끝날 때까지 멈추지 않습니다. 실수로 너무 큰 숫자를 넣었다면 당황하지 말고 adb shell ps | grep monkey로 프로세스 ID를 확인한 뒤 adb shell kill <PID>로 강제 종료해야 합니다.
- Content 명령의 URI 오타: content 명령어는 경로(URI)가 조금만 틀려도 아무런 응답을 하지 않거나 에러를 발생시킵니다. 시스템 설정은 안드로이드 버전에 따라 저장 경로가 다를 수 있으므로, 반드시 해당 버전의 공식 문서에서 데이터베이스 경로를 먼저 확인하십시오.
- 로그 필터링 실수: logcat 실행 시 -s 옵션 뒤에 패키지 이름이 아닌 태그명을 넣는 경우가 있습니다. 특정 앱의 모든 로그를 보려면 단순히 -s만 쓰는 것보다는 adb logcat | grep <패키지명> 형태로 필터링하는 것이 더 안정적인 결과를 보여줍니다.
결론
ADB는 단순한 디버깅 도구를 넘어, 안드로이드 생태계에서 앱의 견고함을 증명하고 보안 취약점을 예방하는 핵심 도구입니다. monkey를 통한 스트레스 테스트와 content를 활용한 시스템 제어, 그리고 권한 점검은 실무에서 앱의 품질을 높이는 가장 정석적인 방법입니다. 본 가이드를 바탕으로 매일 수행하는 개발 프로세스에 자동화 테스트를 도입하여 보다 안전하고 안정적인 애플리케이션을 완성해 보시기 바랍니다.
'Android System & AOSP Engineering > Debug, ADB & System Tools' 카테고리의 다른 글
| 안드로이드 시스템 속성(Property) 제어: getprop 및 setprop 명령어 활용법 (0) | 2025.03.03 |
|---|---|
| 안드로이드 ADB 부트 애니메이션 변경 및 시스템 테마 설정 가이드 (0) | 2025.03.02 |
| 안드로이드 ADB 앱 제어: 강제 종료 및 실행 명령어 총정리 (0) | 2025.02.28 |
| 안드로이드 ADB 입력 자동화 가이드: keyevent 및 터치 스크립트 작성법 (0) | 2025.02.27 |
| 안드로이드 ADB GPS 위치 조작 가이드: 가짜 위치(Mock Location) 및 모드 변경법 (0) | 2025.02.26 |