Este artigo faz parte de um Guia de Desenvolvimento para Android. O guia fala de vários temas necessários para construir uma aplicação simples na sua totalidade, abordando várias funcionalidades introduzidas no Honeycomb e que ainda são válidas para o Ice Cream Sandwich. Usamos um cliente do Google Buzz chamado Honeybuzz como exemplo para cada tópico. Na introdução encontra-se uma listagem completa de todos os artigos.
Análise e estatísticas ajudam a perceber que partes de uma aplicação são as mais populares ou quais são as mais problemáticas para os utilizadores. O Google Analytics não é só para websites, também pode ser usado em aplicações Android.
Instalar o Google Analytics num projecto Android
Para adicionar o Google Analytics a uma aplicação Android é necessário:
- Fazer o download do SDK do Google Analytics para Android.
- Adicionar a biblioteca libGoogleAnalytics.jar ao projecto. Para saber como fazer isto vejam o artigo Ambiente de desenvolvimento e criação do projecto (a parte sobre como adicionar bibliotecas externas).
- Adicionar as permissões necessárias ao manifesto Android.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- Ir à conta do Google Analytics e criar um perfil como se fosse para um website. Escolham um URL descritivo (embora não tenha de ser verdadeiro).
- É necessário informar os utilizadores, algures na aplicação ou nos termos de serviço, que estes estão a ser monitorizados anonimamente.
Monitorizar as fontes de instalação da aplicação
Uma parte importante da análise de uma aplicação é saber a fonte da instalação da mesma (caso estejam a usar publicidade, por exemplo, ou se têm links de instalação em vários sites).
Para poder saber isso é necessário usar um link no seguinte formato:
- http://market.android.com/search?q=pname:<package>&referrer=<referral>
- <package> é o nome do package da aplicação.
- <referral> é informação específica de uma campanha.
- Podem gerar URLs usando a ferramenta Android Market Campaign Tracking.
<application>
<!-- Used for install referrer tracking (analytics) -->
<receiver android:name="com.google.android.apps.analytics.AnalyticsReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
</application>
Fazer monitorização nas Activities
Pode-se usar o GoogleAnalyticsTracker para monitorizar page views ou eventos numa aplicação. Por exemplo:
GoogleAnalyticsTracker tracker = GoogleAnalyticsTracker.getInstance();
tracker.start("your analytics tracking ID", 20, this);
tracker.trackPageView("/welcome");
this.tracker.trackEvent("Category", "Action", "Label", "Value");
tracker.setCustomVar(1, "Name", "Value"); // first parameter is the slot (1 to 5)
Para poupar bateria, esta informação só é enviada passado um intervalo de tempo (20 segundos no exemplo acima), mas também é possível enviar a informação manualmente usando o método tracker.dispatch().
Para tornar esta tarefa mais simples, em vez de adicionar este código manualmente a todas as Activites, criei uma classe a partir da qual todas as Activities são feitas, que não só monitoriza cada Activity, como também tem métodos úteis para fazer a monitorização de eventos e de variáveis personalizadas.
package com.quasibit.honeybuzz;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import com.google.android.apps.analytics.GoogleAnalyticsTracker;
public class TrackedActivity extends Activity {
private static final String TRACKER_ID = "your analytics tracking ID ";
private static final boolean DISPATCH_MANUAL = false;
private static final int DISPATCH_INTERVAL = 20;
private static final boolean DEBUG = false; // If true stores analytics requests in the log cat
private static final boolean DRY_RUN = false; // If true only stores data locally (doesn't send data to analytics)
@SuppressWarnings("unused")
private static final int SCOPE_VISITOR = 1; // Call the first time your application is run on a device. Useful for anything that won't change during the lifetime of the installation of the application (app version, lite vs full, type of phone).
@SuppressWarnings("unused")
private static final int SCOPE_SESSION = 2; // Call at the beginning of an Activity. Applies to all pageviews and events for the lifecycle of the activity.
@SuppressWarnings("unused")
private static final int SCOPE_PAGE = 3; // Call before trackEvent or trackPageView that the custom variable should apply to.
@SuppressWarnings("unused")
private static final int SLOT_1 = 1;
@SuppressWarnings("unused")
private static final int SLOT_2 = 2;
@SuppressWarnings("unused")
private static final int SLOT_3 = 3;
@SuppressWarnings("unused")
private static final int SLOT_4 = 4;
@SuppressWarnings("unused")
private static final int SLOT_5 = 5;
private GoogleAnalyticsTracker tracker;
private String pageId;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.pageId = getClass().getSimpleName();
this.tracker = GoogleAnalyticsTracker.getInstance();
if (DISPATCH_MANUAL) {
this.tracker.start(TRACKER_ID, this);
} else {
this.tracker.start(TRACKER_ID, DISPATCH_INTERVAL, getApplicationContext());
}
this.tracker.setDebug(DEBUG);
this.tracker.setDryRun(DRY_RUN);
}
@Override
protected void onResume() {
super.onResume();
this.tracker.trackPageView("/" + this.pageId);
}
@Override
protected void onDestroy() {
super.onDestroy();
this.tracker.dispatch();
this.tracker.stop();
}
public void dispatch() {
if (this.tracker != null) {
this.tracker.dispatch();
}
}
public static void dispatch(final Context baseContext) {
final GoogleAnalyticsTracker tracker = GoogleAnalyticsTracker.getInstance();
tracker.start(TRACKER_ID, baseContext);
tracker.dispatch();
tracker.stop();
}
protected void trackPage(final String page) {
this.tracker.trackPageView(page);
}
protected void trackEvent(final String category, final String action, final String label, final int value) {
this.tracker.trackEvent(category, action, label, value);
}
protected void trackEvent(final String category, final String action, final String label) {
trackEvent(category, action, label, 0);
}
protected void trackEvent(final String action, final String label, final int value) {
this.tracker.trackEvent(this.pageId, action, label, value);
}
protected void trackEvent(final String action, final String label) {
trackEvent(this.pageId, action, label, 0);
}
protected void setCustomVar(final int slot, final String name, final String value, final int scope) {
this.tracker.setCustomVar(slot, name, value, scope);
}
protected void setCustomVar(final int slot, final String name, final String value) {
this.tracker.setCustomVar(slot, name, value);
}
}
Como vamos usar fragmentos, a classe TrackedFragment também foi construída.
package com.quasibit.honeybuzz;
import com.google.android.apps.analytics.GoogleAnalyticsTracker;
import android.app.Fragment;
import android.os.Bundle;
public class TrackedFragment extends Fragment {
private GoogleAnalyticsTracker tracker;
private String activityId;
private String fragmentId;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.tracker = GoogleAnalyticsTracker.getInstance();
this.fragmentId = getClass().getSimpleName();
this.activityId = getActivity().getClass().getSimpleName();
}
@Override
public void onResume() {
super.onResume();
this.tracker.trackPageView("/" + this.activityId + "/" + this.fragmentId);
}
}
Para mais informação sobre como usar o Google Analytics no Android vejam a sessão da Google I/O Optimizing Android Apps with Google Analytics. Outro bom recurso é o artigo Analytics for Android Apps que foi publicado no blog Android Developer.