Android 101: Usar Google Analytics numa aplicação Android

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:

<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.

Nuno Freitas
Publicado por Nuno Freitas em 23 novembro, 2011

Artigos relacionados