Search code examples
androidtestingfirebasefirebase-analytics

Exclude testing device from Firebase Analytics logging


I am sure that Firebase is counting all my development work too in its analytics. I open my app like hundred times a day to debug and test on a few devices, it's really skewing up my readings.

I have used a function to get me a somewhat unique ID to represent my devices and ignored all its analytics through code.

public static String getPsuedoID() {
    String m_szDevIDShort = "35" + (Build.BOARD.length() % 10)
    + (Build.BRAND.length() % 10) + (Build.VERSION.SDK_INT % 10)
    + (Build.DEVICE.length() % 10) + (Build.DISPLAY.length() % 10)
    + (Build.MODEL.length() % 10) + (Build.PRODUCT.length() % 10);

    String serial;
    try {
        serial = android.os.Build.class.getField("SERIAL").get(null).toString();
        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
    } catch (Exception exception) {
        serial = "getUniquePsuedoIDfailed";
    }
    return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}

But I just figured out it is not as unique as I assumed. Apparently, my ID was same as around a few (very few) users.

Is there a foolproof method to do just this?


Solution

  • A solution using the ANDROID_ID

    1) Get ANDROID_ID of all your testing devices (This is a 64-bit unique ID generated when the user first sets up the device. It remains constant thereafter.)

    private static String getDeviceID(Context c) {
        return Settings.Secure.getString(c.getContentResolver(), Settings.Secure.ANDROID_ID);
    }
    

    2) Add these IDs to an array:

    private static String testingDeviceIDs[] = {"8ab5946d3d65e893", "ada1247bfb6cfa5d", ...};
    

    3) Check if the current device is one of the testing devices.

    private static boolean isDeviceForTesting(Context c) {
        for (String testingID : testingDeviceIDs)
            if (getDeviceID(c).equals(testingID))
                return true;
        return false;
    }
    

    4) Finally, log Firebase events only if the device is not a testing device.

    static void logFirebaseEvent(Context c, String name) {
        if (!isDeviceForTesting(c))
            FirebaseAnalytics.getInstance(c).logEvent(name, null);
    }
    

    UPSIDE: Unlike Firebase's provision of controlling analytics collection, this method will also work on Release builds/APKs.