안드로이드 용 Firebase 성능 모니터링 관련 팁 1: 모든 활동에 대한 자동 추적 기능
2017년 8월 24일 목요일
<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 양찬석(Google)님이 참여해 주셨습니다.>
Firebase 성능 모니터링을 아직 사용해본 적이 없으신가요? 이 기능을 서비스 중인 iOS 또는 안드로이드 앱의 성능 특성을 파악할 수 있습니다. 다만, 자동으로 수집되는 정보 이상의 세부 정보를 얻으려면 결국 사용자설정 추적(Custom Trace) 및 카운터를 작성해야 합니다. 추적은 앱에서 별개의 기간 내에서 성능 데이터를 보고하는 기능이고, 카운터는 추적 중에 성능 관련 이벤트를 측정할 수 있는 기능입니다. 이 포스트에서는 지나치게 많은 양의 코드를 작성할 필요가 전혀 없이 안드로이드 앱에 훨씬 더 많은 추적을 추가할 수 있는 방법을 제안합니다.
안드로이드 앱은 일반적으로 작업 또는 데이터를 사용자에게 제공하는 엑티비티 모음으로 구성됩니다. 잠재적인 성능 문제를 찾아내기 위해서는, 앱에서 이루어지는 모든 엑티비티 각각에 대해 추적을 정의하는 것이 편리할 수 있습니다. 그 후 Firebase 콘솔에서 그 결과를 조사할 수 있습니다. 앱에 포함된 엑티비티가 많은 경우 이러한 모든 엑티비티에 대한 코드를 작성하는 것이 무척 힘든 과정일 수 있습니다. 대신, 자체적인 추적 기능을 이용해 모든 엑티비티을 계측하는 약간의 코드를 작성할 수 있습니다.
안드로이드 플랫폼은 앱 내의 모든 엑티비티의 생명 주기 변화를 확인 할 수 있는 방법을 제공합니다. 이 리스너는
그런 다음, 해당 클래스 내에서 각 엑티비티에 대한 사용자설정 추적을 관리하는 멤버를 추가하겠습니다.
엑티비티가 시작될 때 추적이 시작되고 중지될 때 해당 추적이 중지됩니다. 추적의 이름으로는 엑티비티 객체의 간단한 클래스 이름, 즉 전체 자바 패키지를 포함하지 않는 클래스 이름만 사용합니다. (참고: 클래스 이름만 사용할 경우 활동이 자바 패키지 전체에 걸쳐 분산되어 있다면 엑티비티 클래스 이름이 고유한지 확인하세요.)
지정된 엑티비티 객체에 대한 추적을 반환하는 메서드를 클래스에 하나 더 추가하겠습니다. 어떤 엑티비티에서든 이 메서드를 사용하여 현재 추적 정보를 유지함으로써 클래스에 카운터를 추가할 수 있습니다.
이 클래스는 엑티비티가 시작되기 전에 등록되어야 합니다. ContentProvider가 이를 수행하기 좋은 위치입니다. ContentProvider가 어떤 식으로 작동하는지 잘 모르는 경우 Firebase가 ContentProvider를 사용하여 초기화하는 방법을 읽어보시기 바랍니다.
앱 매니페스트에 ContentProvider를 추가하는 것을 잊지 마세요! 앱 매니페스트에 추가하면 앱에서 엑티비티가 생성되기 전에 ContentProvider가 생성됩니다.
이 ContentProvider가 제대로 추가되었으면 앱이 자동으로 모든 엑티비티에 대해 추적을 생성합니다. 엑티비티 중 하나에 카운터를 추가하려면 현재 엑티비티 객체를 사용하는 PerfLifecycleCallbacks 싱글톤에서
로그에 기록하려는 카운터에 대해 신중히 생각해야 합니다! 일반적으로 사용자 환경을 개선할 수 있는 방법을 찾는데 도움이 되는 정보가 중요합니다. 예를 들어, 캐시에 사용할 메모리 양을 조정하는 데 도움이 되도록 캐시의 누락에 대한 적중 비율을 기록할 수 있습니다. Twitter에서 Firebase를 팔로우하여 더 많은 Firebase 성능 모니터링 관련 팁을 확인하시기 바랍니다.
Firebase 성능 모니터링을 아직 사용해본 적이 없으신가요? 이 기능을 서비스 중인 iOS 또는 안드로이드 앱의 성능 특성을 파악할 수 있습니다. 다만, 자동으로 수집되는 정보 이상의 세부 정보를 얻으려면 결국 사용자설정 추적(Custom Trace) 및 카운터를 작성해야 합니다. 추적은 앱에서 별개의 기간 내에서 성능 데이터를 보고하는 기능이고, 카운터는 추적 중에 성능 관련 이벤트를 측정할 수 있는 기능입니다. 이 포스트에서는 지나치게 많은 양의 코드를 작성할 필요가 전혀 없이 안드로이드 앱에 훨씬 더 많은 추적을 추가할 수 있는 방법을 제안합니다.
안드로이드 앱은 일반적으로 작업 또는 데이터를 사용자에게 제공하는 엑티비티 모음으로 구성됩니다. 잠재적인 성능 문제를 찾아내기 위해서는, 앱에서 이루어지는 모든 엑티비티 각각에 대해 추적을 정의하는 것이 편리할 수 있습니다. 그 후 Firebase 콘솔에서 그 결과를 조사할 수 있습니다. 앱에 포함된 엑티비티가 많은 경우 이러한 모든 엑티비티에 대한 코드를 작성하는 것이 무척 힘든 과정일 수 있습니다. 대신, 자체적인 추적 기능을 이용해 모든 엑티비티을 계측하는 약간의 코드를 작성할 수 있습니다.
안드로이드 플랫폼은 앱 내의 모든 엑티비티의 생명 주기 변화를 확인 할 수 있는 방법을 제공합니다. 이 리스너는
ActivityLifecycleCallbacks
인터페이스를 구현하여 생성 할 수 있습니다. 그 후, Application.registerLifecycleCallbacks()
메서드로 리스너를 등록할 수 있습니다. 성능을 측정하기 위해 onStart()
및 onStop()
콜백 함 수 내부에 추적을 생성하면 좋습니다. 엑티비티가 '시작' 되어 화면에 보일 때와 엑티비티가 '중지'되어 더 이상 보이지 않을 때가 바로 엑티비티가 실제로 작업을 수행하는 동안 일어난 일들에 대해 추적하기 좋은 시점입니다. 다음은 각 엑티비티에 대한 추적을 유지하는 ActivityLifecycleCallbacks 구현의 시작 부분입니다. 먼저, 이를 싱글톤으로 만들어 어디서나 손쉽게 액세스할 수 있도록 하겠습니다. 또는 의존성 주입(Dependency Injection)의 형태를 사용할 수도 있습니다. public class PerfLifecycleCallbacks implements Application.ActivityLifecycleCallbacks { private static final PerfLifecycleCallbacks instance = new PerfLifecycleCallbacks(); private PerfLifecycleCallbacks() {} public static PerfLifecycleCallbacks getInstance() { return instance; } }
그런 다음, 해당 클래스 내에서 각 엑티비티에 대한 사용자설정 추적을 관리하는 멤버를 추가하겠습니다.
private final HashMap<Activity, Trace> traces = new HashMap<>(); @Override public void onActivityStarted(Activity activity) { String name = activity.getClass().getSimpleName(); Trace trace = FirebasePerformance.startTrace(name); traces.put(activity, trace); } @Override public void onActivityStopped(Activity activity) { Trace trace = traces.remove(activity); trace.stop(); } // ...empty implementations of other lifecycle methods...
엑티비티가 시작될 때 추적이 시작되고 중지될 때 해당 추적이 중지됩니다. 추적의 이름으로는 엑티비티 객체의 간단한 클래스 이름, 즉 전체 자바 패키지를 포함하지 않는 클래스 이름만 사용합니다. (참고: 클래스 이름만 사용할 경우 활동이 자바 패키지 전체에 걸쳐 분산되어 있다면 엑티비티 클래스 이름이 고유한지 확인하세요.)
지정된 엑티비티 객체에 대한 추적을 반환하는 메서드를 클래스에 하나 더 추가하겠습니다. 어떤 엑티비티에서든 이 메서드를 사용하여 현재 추적 정보를 유지함으로써 클래스에 카운터를 추가할 수 있습니다.
@Nullable public Trace getTrace(Activity activity) { return traces.get(activity); }
이 클래스는 엑티비티가 시작되기 전에 등록되어야 합니다. ContentProvider가 이를 수행하기 좋은 위치입니다. ContentProvider가 어떤 식으로 작동하는지 잘 모르는 경우 Firebase가 ContentProvider를 사용하여 초기화하는 방법을 읽어보시기 바랍니다.
public class PerfInitContentProvider extends ContentProvider { @Override public boolean onCreate() { context = getContext(); if (context != null) { Application app = (Application) context.getApplicationContext(); app.registerActivityLifecycleCallbacks( PerfLifecycleCallbacks.getInstance()); } } }
앱 매니페스트에 ContentProvider를 추가하는 것을 잊지 마세요! 앱 매니페스트에 추가하면 앱에서 엑티비티가 생성되기 전에 ContentProvider가 생성됩니다.
이 ContentProvider가 제대로 추가되었으면 앱이 자동으로 모든 엑티비티에 대해 추적을 생성합니다. 엑티비티 중 하나에 카운터를 추가하려면 현재 엑티비티 객체를 사용하는 PerfLifecycleCallbacks 싱글톤에서
getTrace()
메서드를 사용하면 됩니다. 예를 들면 다음과 같습니다. private Trace trace; @Override protected void onCreate(Bundle savedInstanceState) { trace = PerfLifecycleCallbacks.getInstance().getTrace(this); // use the trace to tally counters... }
로그에 기록하려는 카운터에 대해 신중히 생각해야 합니다! 일반적으로 사용자 환경을 개선할 수 있는 방법을 찾는데 도움이 되는 정보가 중요합니다. 예를 들어, 캐시에 사용할 메모리 양을 조정하는 데 도움이 되도록 캐시의 누락에 대한 적중 비율을 기록할 수 있습니다. Twitter에서 Firebase를 팔로우하여 더 많은 Firebase 성능 모니터링 관련 팁을 확인하시기 바랍니다.