네트워크 트래픽 도구로 네트워크 트래픽 데이터 수집

네트워크 트래픽 도구는 지원 중단되었습니다. Android 스튜디오 3.0 이상을 사용 중이라면 네트워크 프로파일러를 사용하여 앱에서 네트워크를 통해 데이터를 전송하는 방식과 시점을 확인해야 합니다.

앱에서 생성하는 네트워크 트래픽은 앱이 실행되는 기기의 배터리 수명에 큰 영향을 미칠 수 있습니다. 트래픽을 최적화하려면 트래픽을 측정할 뿐 아니라 트래픽의 소스도 파악해야 합니다. 네트워크 요청은 사용자 작업, 자체 앱 코드의 요청 또는 앱과 통신하는 서버에서 직접 발생할 수 있습니다.

DDMS 도구의 일부인 네트워크 트래픽 도구를 사용하면 앱이 네트워크를 통해 데이터를 전송하는 방식과 시점을 확인할 수 있습니다.

이 강의에서는 소스 코드를 태그하여 네트워크 요청을 측정하고 분류하는 방법과 앱의 네트워크 트래픽을 배포, 테스트 및 시각화하는 방법을 안내합니다.

네트워크 요청 태그하기

앱에서는 여러 가지 이유로 기기의 네트워킹 하드웨어를 사용합니다. 앱의 네트워킹 리소스 사용을 제대로 최적화하려면 앱에서 네트워크를 어떤 이유로, 얼마나 자주 사용하는지 파악해야 합니다. 성능 분석을 위해 네트워크 하드웨어 사용을 다음 카테고리로 분류해야 합니다.

  • 사용자가 시작한 네트워크 요청 - 뉴스 앱의 업데이트된 기사 목록과 같이 사용자가 시작한 요청을 말합니다.
  • 앱에서 시작한 네트워크 요청 - Android 앱 코드 내에서 시작한 요청(예: 뉴스 앱에서 읽지 않은 기사의 텍스트를 캐시하라는 앱 요청)으로, 사용자 작업을 즉시 충족하는 데 사용되지 않습니다.
  • 서버에서 시작한 네트워크 요청 - 서버에서 앱에 전달한 요청(예: 뉴스 앱에서 새로 제공된 기사에 관한 알림)으로, 사용자 작업을 즉시 충족하는 데 사용되지 않습니다.

이 절차에서는 앱의 소스 코드를 상수로 태그하여 트래픽을 이 세 가지 요청 유형 중 하나로 분류하는 방법을 보여줍니다. 네트워크 트래픽 도구에서는 트래픽 유형을 각기 다른 색상으로 표시하므로 트래픽 스트림을 개별적으로 시각화하고 최적화할 수 있습니다. 여기서 설명하는 기법에서는 개발자가 사용자, 앱 또는 서버 소스로 식별하는 앱의 스레드 실행에 따라 네트워크 트래픽을 보고합니다.

  1. 앱의 개발 프로젝트에서 다양한 유형의 네트워크 사용을 나타내는 세 개의 상수를 정의합니다.

    Kotlin

        const val USER_INITIATED: Int = 0x1000
        const val APP_INITIATED: Int = 0x2000
        const val SERVER_INITIATED: Int = 0x3000
        

    자바

        public static final int USER_INITIATED = 0x1000;
        public static final int APP_INITIATED = 0x2000;
        public static final int SERVER_INITIATED =0x3000;
        
  2. 이 목적으로 사용되는 가장 일반적인 클래스를 검색하여 앱에서 네트워킹 코드를 찾습니다.
    1. Android 스튜디오에서 Edit > Find > Find in Path를 선택합니다.
    2. 다음 문자열을 Text to find 필드에 붙여넣습니다.
      extends GcmTaskService|extends JobService|extends AbstractThreadedSyncAdapter|HttpUrlConnection|Volley|Glide|HttpClient
    3. Regular expression을 선택합니다.
    4. File mask(s)를 선택하고 *.java를 입력합니다.
    5. Find 버튼을 클릭합니다.
  3. 다음 코드 예에서와 같이 네트워크 리소스를 사용하는 앱의 각 실행 스레드에 setThreadStatsTag(int) 메서드를 추가하여 이전 단계의 검색 결과에 따라 앱의 네트워크 트래픽 사용을 태그합니다.

    Kotlin

        if (BuildConfig.NETWORK_TEST && Build.VERSION.SDK_INT >= 14) {
            try {
                TrafficStats.setThreadStatsTag(USER_INITIATED)
                // make network request using HttpClient.execute()
            } finally {
                TrafficStats.clearThreadStatsTag()
            }
        }
        

    자바

        if (BuildConfig.NETWORK_TEST && Build.VERSION.SDK_INT >= 14) {
            try {
                TrafficStats.setThreadStatsTag(USER_INITIATED);
                // make network request using HttpClient.execute()
            } finally {
                TrafficStats.clearThreadStatsTag();
            }
        }
        

    참고: APK 생성에 사용된 빌드 유형에 따라 이 코드를 조건부로 포함하여 태그 작업이 프로덕션 코드에 포함되지 않도록 하세요. 위 예에서 BuildConfig.NETWORK_TEST 필드는 이 APK를 테스트 버전으로 인식합니다.

참고: 이처럼 앱에서 네트워크 트래픽을 태그하는 기법은 사용 중인 API가 네트워크 소켓에 액세스하는 방법과 네트워크 소켓을 관리하는 방법에 따라 달라집니다. TrafficStats 유틸리티가 앱에서 시작하는 트래픽을 태그하는 것을 허용하지 않는 네트워킹 라이브러리가 있을 수 있습니다.

네트워크 트래픽 도구로 네트워크 트래픽을 태그하고 추적하는 방법에 관한 자세한 내용은 DDMS의 세부적인 네트워크 사용을 참조하세요.

네트워크 테스트 빌드 유형 구성

성능 테스트를 실행할 때 APK는 프로덕션 빌드에 최대한 근접해야 합니다. 네트워크 테스트를 위해 이 요구사항을 충족하려면 debug 빌드 유형을 사용하는 대신 network-test 빌드 유형을 만드세요.

  1. Android 스튜디오에서 앱을 엽니다.
  2. 다음 코드 예에서와 같이 프로젝트의 build.gradle 파일을 수정하여 네트워크 테스트용 디버그 가능 빌드 유형을 만듭니다.
        android {
            ...
            buildTypes {
                debug {
                    // debuggable true is default for the debug buildType
                }
                network-test {
                    debuggable true
                }
            }
            ...
        }
        

네트워크 테스트 APK 배포

이전 절차에서 구성한 network-test 빌드 유형으로 생성된 APK를 배포하려면 다음 단계를 따르세요.

  1. 테스트 기기에서 개발자 옵션이 사용 설정되어 있는지 확인합니다. 이 옵션을 확인하고 사용하는 방법은 하드웨어 기기 사용을 참조하세요.
  2. USB 케이블을 사용해 테스트 기기를 개발 컴퓨터에 연결합니다.
  3. Android 스튜디오에서 창의 왼쪽 가장자리에 있는 Build Variants를 선택합니다.
  4. Sync Project with Gradle Files 버튼을 클릭하여 앱 모듈의 network-test로 빌드 변형 목록을 채웁니다.
  5. 목록에서 network-test를 선택합니다.
  6. Run > Debug를 선택하여 디버깅 가능한 버전의 앱을 기기에 배포합니다.

네트워크 트래픽 도구 실행

Android 스튜디오의 네트워크 트래픽 도구를 통해 앱 실행 중 앱의 네트워크 리소스 사용 현황을 실시간으로 볼 수 있습니다.

테스트가 불필요하게 반복되지 않게 하려면 앱 데이터를 삭제하여 앱의 알려진 초기 상태로 시작해야 합니다. 다음 절차에는 이전에 캐시된 데이터, 네트워킹 데이터 등 모든 앱 데이터를 삭제하는 방법을 안내하는 단계가 포함되어 있습니다. 이 단계에서는 이전에 캐시된 모든 데이터를 다시 캐시해야 하는 상태로 앱을 되돌립니다. 이 단계를 건너뛰지 마세요.

네트워크 트래픽 도구를 시작하고 네트워크 요청을 시각화하려면 다음 단계를 따르세요.

  1. Android 스튜디오 및 Android Device Monitor를 시작하여 네트워크 트래픽 도구를 실행합니다. 수신 네트워크 연결을 허용하라는 메시지가 표시되면 이를 수락합니다.
  2. Android Device Monitor 창에서 상단의 DDMS 버튼을 클릭하고 Network Statistics 탭을 선택합니다. 이 탭이 표시되지 않으면 창을 넓힌 다음 Window > Reset Perspective를 선택합니다.
  3. Devices 탭에 있는 기기의 디버깅 가능 앱 목록에서 디버깅할 앱을 선택한 다음 Network Statistics 탭에서 Start 버튼을 클릭합니다.

    참고: 기기에 USB 디버깅을 허용하시겠습니까?라는 메시지가 표시될 수 있습니다. 확인을 선택하여 디버깅이 계속 진행되도록 허용합니다.

  4. 다음 adb 명령어를 사용하여 앱 데이터를 삭제합니다.
        adb shell pm clear package.name.of.app
        
  5. 앱을 시작하고 앱의 기본 사용 사례를 실제 적용하는 테스트 계획을 실행합니다. 이 계획에서는 사용자가 앱과 상호작용하지 않는 앱 유휴 시간을 감안하여 앱 및 서버에서 시작한 네트워크 액세스를 허용해야 합니다.
  6. 앱 데이터를 삭제하고 테스트 계획을 다시 실행하여 테스트를 반복합니다. 성능 데이터의 반복성을 확인하려면 테스트를 몇 차례 반복해야 합니다.

네트워크 트래픽에 태그하기를 사용하면 그림 1과 같이 네트워크 트래픽 도구에서 각 네트워크 트래픽에 다른 색상을 산출하여 각 요청 카테고리를 시각적으로 구별할 수 있습니다.

그림 1. 세 가지 카테고리로 태그한 네트워크 트래픽