从Firebase Analytics日志记录中排除测试设备

Sag*_*gar 11 testing android firebase firebase-analytics

我确信Firebase在其分析中也在计算我的所有开发工作.我每天打开我的应用程序一百次,在一些设备上进行调试和测试,这实际上是在歪曲我的读数.

我使用了一个函数来获取一个有点独特的ID来表示我的设备,并通过代码忽略了所有的分析.

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();
}
Run Code Online (Sandbox Code Playgroud)

但我发现它并不像我想象的那么独特.显然,我的ID与少数(极少数)用户相同.

这样做有一种万无一失的方法吗?

Bob*_*der 19

您可以控制分析收集利用与被定义的设置清单元数据manifestPlaceholder:

<application
    android:name="MyApplication"
    //... >
    <meta-data
        android:name="firebase_analytics_collection_deactivated"
        android:value="${analytics_deactivated}" />
    //...
 </application>
Run Code Online (Sandbox Code Playgroud)

然后在build.gradle文件的构建变量块中定义占位符值:

buildTypes {
    debug {
        manifestPlaceholders = [analytics_deactivated: "true"]
        //...
    }

    release {
        manifestPlaceholders = [analytics_deactivated: "false"]
        //...
    }
Run Code Online (Sandbox Code Playgroud)

  • 但是如果我不想记录来自特定设备的事件,即使它是从Play商店下载的APK?我们的团队经常对实时应用程序进行测试 (3认同)

Sag*_*gar 6

使用 ANDROID_ID 的解决方案

1) 获取所有测试设备的ANDROID_ID(这是用户第一次设置设备时生成的 64 位唯一 ID。此后保持不变。)

private static String getDeviceID(Context c) {
    return Settings.Secure.getString(c.getContentResolver(), Settings.Secure.ANDROID_ID);
}
Run Code Online (Sandbox Code Playgroud)

2) 将这些 ID 添加到数组中:

private static String testingDeviceIDs[] = {"8ab5946d3d65e893", "ada1247bfb6cfa5d", ...};
Run Code Online (Sandbox Code Playgroud)

3) 检查当前设备是否为测试设备之一。

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

4) 最后,仅当设备不是测试设备时才记录 Firebase 事件。

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

UPSIDE:与 Firebase 提供的控制分析收集不同,此方法也适用于发布版本/APK。