콘솔로 이동

Android에서 Performance Monitoring 시작하기

시작하기 전에

아직 추가하지 않았다면 Android 프로젝트에 Firebase를 추가합니다.

1단계: 앱에 Performance Monitoring 추가

  1. 모듈(앱 수준) Gradle 파일(일반적으로 app/build.gradle)에서 다음을 수행합니다.

    • Performance Monitoring Gradle 플러그인을 추가합니다.
    • Performance Monitoring Android 라이브러리의 종속 항목을 추가합니다.
    apply plugin: 'com.android.application'
    // Apply the Performance Monitoring plugin to enable instrumentation
    apply plugin: 'com.google.firebase.firebase-perf'
    
    dependencies {
        // ...
    
        implementation 'com.google.firebase:firebase-core:16.0.9'
    
        // Add the dependency for the Performance Monitoring library
        implementation 'com.google.firebase:firebase-perf:17.0.0'
    }
    
  2. 루트 수준(프로젝트 수준) Gradle 파일(build.gradle)에서 Performance Monitoring 플러그인을 포함하는 규칙을 추가합니다.

    buildscript {
    
        repositories {
          // Add the following repositories:
          jcenter()  // Bintray's repository
          google()   // Google's Maven repository
        }
    
        dependencies {
          // ...
    
          classpath 'com.google.gms:google-services:4.2.0'  // Google Services plugin
    
          // Add the dependency for the Performance Monitoring plugin
          classpath 'com.google.firebase:perf-plugin:1.2.1'  // Performance Monitoring plugin
        }
    }
    
  3. 앱을 다시 컴파일합니다.

이제 Firebase는 자동 traceHTTP/S 네트워크 요청을 모니터링합니다.

2단계: Firebase Console에서 Performance Monitoring 결과 확인

  1. Android 스튜디오에서 앱을 빌드합니다.

  2. 다음 중 하나를 사용하여 앱을 테스트합니다.

    • 최근 이미지가 포함된 Android 에뮬레이터 및 Google Play 서비스 15.0.0 이상

    • Google Play 서비스 15.0.0 이상을 실행하는 테스트 기기

  3. Firebase Console에 Performance Monitoring 결과가 나타나는지 확인합니다.

    결과는 일반적으로 12시간 이내에 나타납니다.

3단계: (선택사항) 커스텀 trace 및 커스텀 측정항목 추가

맞춤 trace는 앱의 특정 코드에 연결된 성능 데이터 보고서입니다. 맞춤 trace에 관한 자세한 내용은 Performance Monitoring 개요를 참조하세요.

앱에 맞춤 trace가 여러 개 있을 수 있으며, 한 번에 둘 이상의 맞춤 trace를 실행할 수도 있습니다. 각 맞춤 추적에는 앱의 성능 관련 이벤트를 계수하는 하나 이상의 측정항목이 있을 수 있으며, 이러한 측정항목은 해당 측정항목을 생성한 추적과 연결됩니다.

커스텀 trace와 측정항목의 이름에는 선행 공백이나 후행 공백, 선행 밑줄(_)이 없어야 하며, 이름의 최대 길이는 32자(영문 기준)입니다.

  1. .java 또는 .kt 파일 맨 위에서 Performance Monitoring 클래스를 가져옵니다.

    import com.google.firebase.perf.FirebasePerformance;
    import com.google.firebase.perf.metrics.Trace;
    
  2. 커스텀 trace를 시작 및 중지하려면 trace를 생성할 코드를 다음과 유사한 코드 줄로 래핑해야 합니다. 이 예에서는 이름이 test_trace인 커스텀 trace를 사용합니다.

    자바

    Trace myTrace = FirebasePerformance.getInstance().newTrace("test_trace");
    myTrace.start();
    
    // code that you want to trace
    
    myTrace.stop();
    

    Kotlin

    val myTrace = FirebasePerformance.getInstance().newTrace("test_trace")
    myTrace.start()
    
    // code that you want to trace
    
    myTrace.stop()
    
  3. 커스텀 측정항목을 추가하려면 이벤트가 발생할 때마다 다음과 유사한 코드 줄을 추가합니다. 예를 들어 이 커스텀 측정항목은 앱에서 발생하는 캐시 적중 및 부적중과 같은 성능 관련 이벤트를 이름이 item_cache_hit, item_cache_miss이고 1씩 늘어나는 이벤트 예를 사용하여 계수합니다.

    자바

    Trace myTrace = FirebasePerformance.getInstance().newTrace("test_trace");
    myTrace.start();
    // code that you want to trace (and log custom metrics)
    Item item = cache.fetch("item");
    if (item != null) {
        myTrace.incrementMetric("item_cache_hit", 1);
    } else {
        myTrace.incrementMetric("item_cache_miss", 1);
    }
    
    myTrace.stop();
    

    Kotlin

    val myTrace = FirebasePerformance.getInstance().newTrace("test_trace")
    myTrace.start()
    // code that you want to trace (and log custom metrics)
    val item = cache.fetch("item")
    if (item != null) {
        myTrace.incrementMetric("item_cache_hit", 1)
    } else {
        myTrace.incrementMetric("item_cache_miss", 1)
    }
    
    myTrace.stop()
    

4단계: (선택사항) @AddTrace를 사용한 trace별 메소드

앱의 메소드에 @AddTrace 주석을 추가하고 문자열을 제공하여 결과로 생성된 커스텀 trace를 식별합니다. 이렇게 하면 메소드 시작 부분에서 trace가 시작되고 메소드 완료 시 trace가 중지됩니다.

단, @AddTrace 주석으로 만든 커스텀 trace에는 커스텀 측정항목을 추가할 수 없습니다.

예를 들어 onCreate() 메소드 호출 시 실행되는 onCreateTrace라는 trace를 생성하려면 다음과 유사한 코드를 사용하세요.

자바

@Override
@AddTrace(name = "onCreateTrace", enabled = true /* optional */)
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

Kotlin

@AddTrace(name = "onCreateTrace", enabled = true /* optional */)
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
}

5단계: (선택사항) 특정 네트워크 요청의 모니터링 추가

Performance Monitoring에서는 네트워크 요청을 자동으로 수집합니다. 앱의 네트워크 요청이 대부분 포함되지만 일부는 보고되지 않을 수도 있습니다.

Performance Monitoring에 커스텀 네트워크 요청을 포함하려면 앱에 다음 코드를 추가합니다.

자바

HttpMetric metric =
        FirebasePerformance.getInstance().newHttpMetric("https://www.google.com",
                FirebasePerformance.HttpMethod.GET);
final URL url = new URL("https://www.google.com");
metric.start();
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json");
try {
    DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream());
    outputStream.write(data);
} catch (IOException ignored) {
}
metric.setRequestPayloadSize(data.length);
metric.setHttpResponseCode(conn.getResponseCode());
printStreamContent(conn.getInputStream());

conn.disconnect();
metric.stop();

Kotlin

val metric = FirebasePerformance.getInstance().newHttpMetric("https://www.google.com",
        FirebasePerformance.HttpMethod.GET)
val url = URL("https://www.google.com")
metric.start()
val conn = url.openConnection() as HttpURLConnection
conn.doOutput = true
conn.setRequestProperty("Content-Type", "application/json")
try {
    val outputStream = DataOutputStream(conn.outputStream)
    outputStream.write(data)
} catch (ignored: IOException) {
}

metric.setRequestPayloadSize(data.size.toLong())
metric.setHttpResponseCode(conn.responseCode)
printStreamContent(conn.inputStream)

conn.disconnect()
metric.stop()

이런 방식으로 특별히 캡처한 HTTP/S 네트워크 요청은 Performance Monitoring에서 자동으로 캡처한 네트워크 요청과 함께 Firebase Console에 표시됩니다.

6단계: 앱 배포 후 결과 확인

하나 이상의 테스트 기기를 사용하여 Performance Monitoring을 검증한 후 업데이트된 앱 버전을 사용자에게 배포할 수 있습니다.

Firebase Console에서 성능 데이터를 모니터링할 수 있습니다.

알려진 문제

  • Performance Monitoring Gradle 플러그인 v1.1.0에서 Guava 종속 항목의 불일치로 인해 다음과 같은 오류가 발생할 수 있습니다.

    Error:Execution failed for task ':app:packageInstantRunResourcesDebug'.
    > com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;

    이 오류가 표시되면 다음 중 하나를 수행하세요.

    • Performance Monitoring 플러그인을 v1.1.1 이상(최신 버전은 v1.2.1)으로 업그레이드합니다.

    • 루트 수준(프로젝트 수준) Gradle 파일(build.gradle)의 Performance Monitoring 플러그인 종속 항목 줄을 다음과 같이 바꿉니다.

      buildscript {
        // ...
      
        dependencies {
          // ...
      
          // Replace the standard Performance Monitoring plugin dependency line, as follows:
          classpath ('com.google.firebase:perf-plugin:1.1.0') {
                      exclude group: 'com.google.guava', module: 'guava-jdk5'
          }
        }
      }
      
  • Performance Monitoring은 OkHttp HTTP 클라이언트 v3.x.x를 사용하여 전송된 모니터링 HTTP/S 네트워크 요청만 지원합니다.

  • Performance Monitoring은 HTTP 콘텐츠 길이 헤더에 설정된 값을 기반으로 HTTP/S 네트워크 요청의 총 페이로드 크기를 보고합니다. 이 값은 정확하지 않을 수도 있습니다.

  • Performance Monitoring은 다중 프로세스 Android 앱의 메인 프로세스만 지원합니다.

  • Performance Monitoring Gradle 플러그인은 다음과 호환되지 않습니다.

    • DexGuard - 자동 trace 및 HTTP/S 네트워크 요청 모니터링을 사용 중지합니다. 단, 앱에서 DexGuard를 사용 중이면 Performance Monitoring SDK를 사용하여 추가한 맞춤 trace는 정상 작동합니다.

    • Jack - 지원 중단되었습니다.

통합 디버깅

<meta-data> 요소를 다음과 같이 앱의 AndroidManifest.xml 파일에 추가하여 빌드 시 Performance Monitoring의 디버그 로깅을 사용 설정할 수 있습니다.

<application>
    <meta-data
      android:name="firebase_performance_logcat_enabled"
      android:value="true" />
</application>

logcat 필터링을 사용하여 trace 및 HTTP/S 네트워크 요청 로깅을 볼 수 있습니다. Performance Monitoring 로그 메시지는 FirebasePerformance로 태그가 지정되므로 다음 명령어를 사용하여 필터링할 수 있습니다.

adb logcat -s FirebasePerformance

다음 단계