Merge "Generate compile-time Q-compatible StatsLog"

This commit is contained in:
Muhammad Qureshi
2020-01-30 06:01:03 +00:00
committed by Gerrit Code Review
3 changed files with 70 additions and 51 deletions

View File

@@ -361,6 +361,50 @@ void write_java_helpers_for_q_schema_methods(
}
}
// This method is called in main.cpp to generate StatsLog for modules that's compatible with
// Q at compile-time.
int write_stats_log_java_q_for_module(FILE* out, const Atoms& atoms,
const AtomDecl &attributionDecl, const string& moduleName,
const string& javaClass, const string& javaPackage,
const bool supportWorkSource) {
// Print prelude
fprintf(out, "// This file is autogenerated\n");
fprintf(out, "\n");
fprintf(out, "package %s;\n", javaPackage.c_str());
fprintf(out, "\n");
fprintf(out, "import static java.nio.charset.StandardCharsets.UTF_8;\n");
fprintf(out, "\n");
fprintf(out, "import android.util.StatsLog;\n");
fprintf(out, "import android.os.SystemClock;\n");
fprintf(out, "\n");
fprintf(out, "\n");
fprintf(out, "/**\n");
fprintf(out, " * Utility class for logging statistics events.\n");
fprintf(out, " */\n");
fprintf(out, "public class %s {\n", javaClass.c_str());
write_java_q_logging_constants(out, " ");
write_java_atom_codes(out, atoms, moduleName);
write_java_enum_values(out, atoms, moduleName);
int errors = 0;
// Print write methods
fprintf(out, " // Write methods\n");
errors += write_java_methods_q_schema(out, atoms.signatures_to_modules, attributionDecl,
moduleName, " ");
errors += write_java_non_chained_methods(out, atoms.non_chained_signatures_to_modules,
moduleName);
if (supportWorkSource) {
errors += write_java_work_source_methods(out, atoms.signatures_to_modules, moduleName);
}
fprintf(out, "}\n");
return errors;
}
#if defined(STATS_SCHEMA_LEGACY)
static void write_java_method(
FILE* out,
@@ -423,48 +467,6 @@ int write_stats_log_java_q(FILE* out, const Atoms& atoms, const AtomDecl &attrib
return 0;
}
int write_stats_log_java_q_for_module(FILE* out, const Atoms& atoms,
const AtomDecl &attributionDecl, const string& moduleName,
const string& javaClass, const string& javaPackage,
const bool supportWorkSource) {
// Print prelude
fprintf(out, "// This file is autogenerated\n");
fprintf(out, "\n");
fprintf(out, "package %s;\n", javaPackage.c_str());
fprintf(out, "\n");
fprintf(out, "import static java.nio.charset.StandardCharsets.UTF_8;\n");
fprintf(out, "\n");
fprintf(out, "import android.util.StatsLog;\n");
fprintf(out, "import android.os.SystemClock;\n");
fprintf(out, "\n");
fprintf(out, "\n");
fprintf(out, "/**\n");
fprintf(out, " * Utility class for logging statistics events.\n");
fprintf(out, " */\n");
fprintf(out, "public class %s {\n", javaClass.c_str());
write_java_q_logging_constants(out, " ");
write_java_atom_codes(out, atoms, moduleName);
write_java_enum_values(out, atoms, moduleName);
int errors = 0;
// Print write methods
fprintf(out, " // Write methods\n");
errors += write_java_methods_q_schema(out, atoms.signatures_to_modules, attributionDecl,
moduleName, " ");
errors += write_java_non_chained_methods(out, atoms.non_chained_signatures_to_modules,
moduleName);
if (supportWorkSource) {
errors += write_java_work_source_methods(out, atoms.signatures_to_modules, moduleName);
}
fprintf(out, "}\n");
return errors;
}
#endif
} // namespace stats_log_api_gen

View File

@@ -45,13 +45,13 @@ void write_java_helpers_for_q_schema_methods(
const int requiredHelpers,
const string& indent);
#if defined(STATS_SCHEMA_LEGACY)
int write_stats_log_java_q(FILE* out, const Atoms& atoms, const AtomDecl &attributionDecl,
const bool supportWorkSource);
int write_stats_log_java_q_for_module(FILE* out, const Atoms& atoms,
const AtomDecl &attributionDecl, const string& moduleName, const string& javaClass,
const string& javaPackage, const bool supportWorkSource);
#if defined(STATS_SCHEMA_LEGACY)
int write_stats_log_java_q(FILE* out, const Atoms& atoms, const AtomDecl &attributionDecl,
const bool supportWorkSource);
#endif
} // namespace stats_log_api_gen
} // namespace android

View File

@@ -511,8 +511,10 @@ print_usage()
fprintf(stderr, " --javaClass CLASS the class name of the java class.\n");
fprintf(stderr, " Optional for Java with module.\n");
fprintf(stderr, " Default is \"StatsLogInternal\"\n");
fprintf(stderr, " --supportQ Include support for Android Q.\n");
fprintf(stderr, " --supportQ Include runtime support for Android Q.\n");
fprintf(stderr, " --worksource Include support for logging WorkSource objects.\n");
fprintf(stderr, " --compileQ Include compile-time support for Android Q "
"(Java only).\n");
}
/**
@@ -536,6 +538,7 @@ run(int argc, char const*const* argv)
string javaClass = DEFAULT_JAVA_CLASS;
bool supportQ = false;
bool supportWorkSource = false;
bool compileQ = false;
int index = 1;
while (index < argc) {
@@ -630,6 +633,8 @@ run(int argc, char const*const* argv)
supportQ = true;
} else if (0 == strcmp("--worksource", argv[index])) {
supportWorkSource = true;
} else if (0 == strcmp("--compileQ", argv[index])) {
compileQ = true;
}
index++;
@@ -645,12 +650,18 @@ run(int argc, char const*const* argv)
return 1;
}
if (DEFAULT_MODULE_NAME == moduleName && supportQ) {
if (DEFAULT_MODULE_NAME == moduleName && (supportQ || compileQ)) {
// Support for Q schema is not needed for default module.
fprintf(stderr, "%s cannot support Q schema\n", moduleName.c_str());
return 1;
}
if (supportQ && compileQ) {
// Runtime Q support is redundant if compile-time Q support is required.
fprintf(stderr, "Cannot specify compileQ and supportQ simultaneously.\n");
return 1;
}
// Collate the parameters
Atoms atoms;
int errorCount = collate_atoms(Atom::descriptor(), &atoms);
@@ -748,9 +759,15 @@ run(int argc, char const*const* argv)
javaClass = "StatsLogInternal";
javaPackage = "android.util";
}
errorCount = android::stats_log_api_gen::write_stats_log_java(
out, atoms, attributionDecl, moduleName, javaClass, javaPackage, supportQ,
supportWorkSource);
if (compileQ) {
errorCount = android::stats_log_api_gen::write_stats_log_java_q_for_module(
out, atoms, attributionDecl, moduleName, javaClass, javaPackage,
supportWorkSource);
} else {
errorCount = android::stats_log_api_gen::write_stats_log_java(
out, atoms, attributionDecl, moduleName, javaClass, javaPackage, supportQ,
supportWorkSource);
}
#endif
fclose(out);