Better release build reporting

The ResearchLogger reports whether a build is a release build or not
to avoid polluting data with IME debugging work by developers.
Previously this was done by checking a constant flag, which was also
serving the dual purpose of masking out debug code in release builds.

This change introduces a heuristic to determine whether a build was
created by a developer (using the package versionName), and annotating
the data sent to the server appropriately.

Change-Id: Icbad17c66b703cabf6d23d05e2c7c41bcceaae45
This commit is contained in:
Kurt Partridge 2013-03-26 16:46:58 -07:00
parent fb3e805722
commit dfa5628cd3

View File

@ -81,6 +81,7 @@ import java.nio.charset.Charset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.regex.Pattern;
/** /**
* Logs the use of the LatinIME keyboard. * Logs the use of the LatinIME keyboard.
@ -1065,7 +1066,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
new LogStatement("LatinImeOnStartInputViewInternal", false, false, "uuid", new LogStatement("LatinImeOnStartInputViewInternal", false, false, "uuid",
"packageName", "inputType", "imeOptions", "fieldId", "display", "model", "packageName", "inputType", "imeOptions", "fieldId", "display", "model",
"prefs", "versionCode", "versionName", "outputFormatVersion", "logEverything", "prefs", "versionCode", "versionName", "outputFormatVersion", "logEverything",
"isUsingDevelopmentOnlyDiagnosticsDebug"); "isDevTeamBuild");
public static void latinIME_onStartInputViewInternal(final EditorInfo editorInfo, public static void latinIME_onStartInputViewInternal(final EditorInfo editorInfo,
final SharedPreferences prefs) { final SharedPreferences prefs) {
final ResearchLogger researchLogger = getInstance(); final ResearchLogger researchLogger = getInstance();
@ -1087,13 +1088,29 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
Integer.toHexString(editorInfo.imeOptions), editorInfo.fieldId, Integer.toHexString(editorInfo.imeOptions), editorInfo.fieldId,
Build.DISPLAY, Build.MODEL, prefs, versionCode, versionName, Build.DISPLAY, Build.MODEL, prefs, versionCode, versionName,
OUTPUT_FORMAT_VERSION, IS_LOGGING_EVERYTHING, OUTPUT_FORMAT_VERSION, IS_LOGGING_EVERYTHING,
ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG); researchLogger.isDevTeamBuild());
} catch (NameNotFoundException e) { } catch (final NameNotFoundException e) {
e.printStackTrace(); Log.e(TAG, "NameNotFound", e);
} }
} }
} }
// TODO: Update this heuristic pattern to something more reliable. Developer builds tend to
// have the developer name and year embedded.
private static final Pattern developerBuildRegex = Pattern.compile("[A-Za-z]\\.20[1-9]");
private boolean isDevTeamBuild() {
try {
final PackageInfo packageInfo;
packageInfo = mLatinIME.getPackageManager().getPackageInfo(mLatinIME.getPackageName(),
0);
final String versionName = packageInfo.versionName;
return !(developerBuildRegex.matcher(versionName).find());
} catch (final NameNotFoundException e) {
Log.e(TAG, "Could not determine package name", e);
return false;
}
}
/** /**
* Log a change in preferences. * Log a change in preferences.
* *