Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 556f656b authored by Salud Lemus's avatar Salud Lemus Committed by Android (Google) Code Review
Browse files

Merge "Revert "Revert "Add pulled atoms support for native clients in s...""

parents 51b226c1 0deb0e3d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ aidl_interface {
        "android/os/StatsDimensionsValueParcel.aidl",
        "android/util/StatsEventParcel.aidl",
    ],
    host_supported: true,
    backend: {
        java: {
            enabled: false, // framework-statsd and service-statsd use framework-statsd-aidl-sources
+7 −2
Original line number Diff line number Diff line
@@ -171,7 +171,8 @@ cc_library_static {
    export_generated_headers: ["statslog_statsdtest.h"],
    shared_libs: [
        "libstatssocket",
    ]
        "libstatspull",
    ],
}

cc_library_static {
@@ -185,7 +186,11 @@ cc_library_static {
    ],
    shared_libs: [
        "libstatssocket",
    ]
        "libstatspull",
    ],
    export_shared_lib_headers: [
        "libstatspull",
    ],
}

// =========
+18 −2
Original line number Diff line number Diff line
@@ -121,10 +121,26 @@ cc_library {
    ],
    target: {
        android: {
            shared_libs: ["libstatssocket"],
            shared_libs: [
                "libstatssocket",
                "libstatspull",
            ],
            export_shared_lib_headers: [
                 "libstatssocket",
                 "libstatspull",
            ],
        },
        host: {
            static_libs: ["libstatssocket"],
            static_libs: [
                "libstatssocket",
                "libstatspull",
                "statsd-aidl-ndk_platform",
            ],
            shared_libs: ["libbinder_ndk"],
            export_static_lib_headers: [
                "libstatssocket",
                "libstatspull",
            ],
        },
    },
}
+127 −63
Original line number Diff line number Diff line
@@ -82,134 +82,148 @@ static void write_annotations(FILE* out, int argIndex,
    }
}

static int write_native_stats_write_methods(FILE* out, const Atoms& atoms,
                                            const AtomDecl& attributionDecl, const bool supportQ) {
    fprintf(out, "\n");
    for (auto signatureInfoMapIt = atoms.signatureInfoMap.begin();
         signatureInfoMapIt != atoms.signatureInfoMap.end(); signatureInfoMapIt++) {
        vector<java_type_t> signature = signatureInfoMapIt->first;
        const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet = signatureInfoMapIt->second;
        // Key value pairs not supported in native.
        if (find(signature.begin(), signature.end(), JAVA_TYPE_KEY_VALUE_PAIR) != signature.end()) {
            continue;
        }
        write_native_method_signature(out, "int stats_write", signature, attributionDecl, " {");

static int write_native_method_body(FILE* out, vector<java_type_t>& signature,
                                    const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet,
                                    const AtomDecl& attributionDecl) {
    int argIndex = 1;
        if (supportQ) {
            fprintf(out, "    StatsEventCompat event;\n");
            fprintf(out, "    event.setAtomId(code);\n");
            write_annotations(out, ATOM_ID_FIELD_NUMBER, fieldNumberToAtomDeclSet, "event.", "");
    fprintf(out, "    AStatsEvent_setAtomId(event, code);\n");
    write_annotations(out, ATOM_ID_FIELD_NUMBER, fieldNumberToAtomDeclSet, "AStatsEvent_",
                      "event, ");
    for (vector<java_type_t>::const_iterator arg = signature.begin();
         arg != signature.end(); arg++) {
        switch (*arg) {
            case JAVA_TYPE_ATTRIBUTION_CHAIN: {
                const char* uidName = attributionDecl.fields.front().name.c_str();
                const char* tagName = attributionDecl.fields.back().name.c_str();
                        fprintf(out, "    event.writeAttributionChain(%s, %s_length, %s);\n",
                                uidName, uidName, tagName);
                fprintf(out,
                        "    AStatsEvent_writeAttributionChain(event, "
                        "reinterpret_cast<const uint32_t*>(%s), %s.data(), "
                        "static_cast<uint8_t>(%s_length));\n",
                        uidName, tagName, uidName);
                break;
            }
            case JAVA_TYPE_BYTE_ARRAY:
                        fprintf(out, "    event.writeByteArray(arg%d.arg, arg%d.arg_length);\n",
                fprintf(out,
                        "    AStatsEvent_writeByteArray(event, "
                        "reinterpret_cast<const uint8_t*>(arg%d.arg), "
                        "arg%d.arg_length);\n",
                        argIndex, argIndex);
                break;
            case JAVA_TYPE_BOOLEAN:
                        fprintf(out, "    event.writeBool(arg%d);\n", argIndex);
                fprintf(out, "    AStatsEvent_writeBool(event, arg%d);\n", argIndex);
                break;
            case JAVA_TYPE_INT:  // Fall through.
            case JAVA_TYPE_ENUM:
                        fprintf(out, "    event.writeInt32(arg%d);\n", argIndex);
                fprintf(out, "    AStatsEvent_writeInt32(event, arg%d);\n", argIndex);
                break;
            case JAVA_TYPE_FLOAT:
                        fprintf(out, "    event.writeFloat(arg%d);\n", argIndex);
                fprintf(out, "    AStatsEvent_writeFloat(event, arg%d);\n", argIndex);
                break;
            case JAVA_TYPE_LONG:
                        fprintf(out, "    event.writeInt64(arg%d);\n", argIndex);
                fprintf(out, "    AStatsEvent_writeInt64(event, arg%d);\n", argIndex);
                break;
            case JAVA_TYPE_STRING:
                        fprintf(out, "    event.writeString(arg%d);\n", argIndex);
                fprintf(out, "    AStatsEvent_writeString(event, arg%d);\n", argIndex);
                break;
            default:
                        // Unsupported types: OBJECT, DOUBLE, KEY_VALUE_PAIRS.
                // Unsupported types: OBJECT, DOUBLE, KEY_VALUE_PAIRS
                fprintf(stderr, "Encountered unsupported type.");
                return 1;
        }
                write_annotations(out, argIndex, fieldNumberToAtomDeclSet, "event.", "");
        write_annotations(out, argIndex, fieldNumberToAtomDeclSet, "AStatsEvent_",
                          "event, ");
        argIndex++;
    }
            fprintf(out, "    return event.writeToSocket();\n");
        } else {
            fprintf(out, "    AStatsEvent* event = AStatsEvent_obtain();\n");
            fprintf(out, "    AStatsEvent_setAtomId(event, code);\n");
            write_annotations(out, ATOM_ID_FIELD_NUMBER, fieldNumberToAtomDeclSet, "AStatsEvent_",
                              "event, ");
    return 0;
}

static int write_native_stats_write_methods(FILE* out, const SignatureInfoMap& signatureInfoMap,
                                            const AtomDecl& attributionDecl, const bool supportQ) {
    fprintf(out, "\n");
    for (auto signatureInfoMapIt = signatureInfoMap.begin();
         signatureInfoMapIt != signatureInfoMap.end(); signatureInfoMapIt++) {
        vector<java_type_t> signature = signatureInfoMapIt->first;
        const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet = signatureInfoMapIt->second;
        // Key value pairs not supported in native.
        if (find(signature.begin(), signature.end(), JAVA_TYPE_KEY_VALUE_PAIR) != signature.end()) {
            continue;
        }
        write_native_method_signature(out, "int stats_write(", signature, attributionDecl, " {");

        // Write method body.
        if (supportQ) {
            int argIndex = 1;
            fprintf(out, "    StatsEventCompat event;\n");
            fprintf(out, "    event.setAtomId(code);\n");
            write_annotations(out, ATOM_ID_FIELD_NUMBER, fieldNumberToAtomDeclSet, "event.", "");
            for (vector<java_type_t>::const_iterator arg = signature.begin();
                 arg != signature.end(); arg++) {
                switch (*arg) {
                    case JAVA_TYPE_ATTRIBUTION_CHAIN: {
                        const char* uidName = attributionDecl.fields.front().name.c_str();
                        const char* tagName = attributionDecl.fields.back().name.c_str();
                        fprintf(out,
                                "    AStatsEvent_writeAttributionChain(event, "
                                "reinterpret_cast<const uint32_t*>(%s), %s.data(), "
                                "static_cast<uint8_t>(%s_length));\n",
                                uidName, tagName, uidName);
                        fprintf(out, "    event.writeAttributionChain(%s, %s_length, %s);\n",
                                uidName, uidName, tagName);
                        break;
                    }
                    case JAVA_TYPE_BYTE_ARRAY:
                        fprintf(out,
                                "    AStatsEvent_writeByteArray(event, "
                                "reinterpret_cast<const uint8_t*>(arg%d.arg), "
                                "arg%d.arg_length);\n",
                        fprintf(out, "    event.writeByteArray(arg%d.arg, arg%d.arg_length);\n",
                                argIndex, argIndex);
                        break;
                    case JAVA_TYPE_BOOLEAN:
                        fprintf(out, "    AStatsEvent_writeBool(event, arg%d);\n", argIndex);
                        fprintf(out, "    event.writeBool(arg%d);\n", argIndex);
                        break;
                    case JAVA_TYPE_INT:  // Fall through.
                    case JAVA_TYPE_ENUM:
                        fprintf(out, "    AStatsEvent_writeInt32(event, arg%d);\n", argIndex);
                        fprintf(out, "    event.writeInt32(arg%d);\n", argIndex);
                        break;
                    case JAVA_TYPE_FLOAT:
                        fprintf(out, "    AStatsEvent_writeFloat(event, arg%d);\n", argIndex);
                        fprintf(out, "    event.writeFloat(arg%d);\n", argIndex);
                        break;
                    case JAVA_TYPE_LONG:
                        fprintf(out, "    AStatsEvent_writeInt64(event, arg%d);\n", argIndex);
                        fprintf(out, "    event.writeInt64(arg%d);\n", argIndex);
                        break;
                    case JAVA_TYPE_STRING:
                        fprintf(out, "    AStatsEvent_writeString(event, arg%d);\n", argIndex);
                        fprintf(out, "    event.writeString(arg%d);\n", argIndex);
                        break;
                    default:
                        // Unsupported types: OBJECT, DOUBLE, KEY_VALUE_PAIRS
                        // Unsupported types: OBJECT, DOUBLE, KEY_VALUE_PAIRS.
                        fprintf(stderr, "Encountered unsupported type.");
                        return 1;
                }
                write_annotations(out, argIndex, fieldNumberToAtomDeclSet, "AStatsEvent_",
                                  "event, ");
                write_annotations(out, argIndex, fieldNumberToAtomDeclSet, "event.", "");
                argIndex++;
            }
            fprintf(out, "    return event.writeToSocket();\n"); // end method body.
        } else {
            fprintf(out, "    AStatsEvent* event = AStatsEvent_obtain();\n");
            int ret = write_native_method_body(out, signature, fieldNumberToAtomDeclSet,
                                               attributionDecl);
            if (ret != 0) {
                return ret;
            }
            fprintf(out, "    const int ret = AStatsEvent_write(event);\n");
            fprintf(out, "    AStatsEvent_release(event);\n");
            fprintf(out, "    return ret;\n");
            fprintf(out, "    return ret;\n"); // end method body.
        }
        fprintf(out, "}\n\n");
        fprintf(out, "}\n\n"); // end method.
    }
    return 0;
}

static void write_native_stats_write_non_chained_methods(FILE* out, const Atoms& atoms,
static void write_native_stats_write_non_chained_methods(FILE* out,
                                                         const SignatureInfoMap& signatureInfoMap,
                                                         const AtomDecl& attributionDecl) {
    fprintf(out, "\n");
    for (auto signature_it = atoms.nonChainedSignatureInfoMap.begin();
         signature_it != atoms.nonChainedSignatureInfoMap.end(); signature_it++) {
    for (auto signature_it = signatureInfoMap.begin();
         signature_it != signatureInfoMap.end(); signature_it++) {
        vector<java_type_t> signature = signature_it->first;
        // Key value pairs not supported in native.
        if (find(signature.begin(), signature.end(), JAVA_TYPE_KEY_VALUE_PAIR) != signature.end()) {
            continue;
        }

        write_native_method_signature(out, "int stats_write_non_chained", signature,
        write_native_method_signature(out, "int stats_write_non_chained(", signature,
                                      attributionDecl, " {");

        vector<java_type_t> newSignature;
@@ -235,6 +249,34 @@ static void write_native_stats_write_non_chained_methods(FILE* out, const Atoms&
    }
}

static int write_native_build_stats_event_methods(FILE* out,
                                                  const SignatureInfoMap& signatureInfoMap,
                                                  const AtomDecl& attributionDecl) {
    fprintf(out, "\n");
    for (auto signatureInfoMapIt = signatureInfoMap.begin();
         signatureInfoMapIt != signatureInfoMap.end(); signatureInfoMapIt++) {
        vector<java_type_t> signature = signatureInfoMapIt->first;
        const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet = signatureInfoMapIt->second;
        // Key value pairs not supported in native.
        if (find(signature.begin(), signature.end(), JAVA_TYPE_KEY_VALUE_PAIR) != signature.end()) {
            continue;
        }
        write_native_method_signature(out, "void addAStatsEvent(AStatsEventList* pulled_data, ",
                                      signature, attributionDecl, " {");

        fprintf(out, "    AStatsEvent* event = AStatsEventList_addStatsEvent(pulled_data);\n");
        int ret = write_native_method_body(out, signature, fieldNumberToAtomDeclSet,
                                           attributionDecl);
        if (ret != 0) {
            return ret;
        }
        fprintf(out, "    AStatsEvent_build(event);\n"); // end method body.

        fprintf(out, "}\n\n"); // end method.
    }
    return 0;
}

static void write_native_method_header(FILE* out, const string& methodName,
                                       const SignatureInfoMap& signatureInfoMap,
                                       const AtomDecl& attributionDecl) {
@@ -262,13 +304,22 @@ int write_stats_log_cpp(FILE* out, const Atoms& atoms, const AtomDecl& attributi
        fprintf(out, "#include <StatsEventCompat.h>\n");
    } else {
        fprintf(out, "#include <stats_event.h>\n");

        if (!atoms.pulledAtomsSignatureInfoMap.empty()) {
            fprintf(out, "#include <stats_pull_atom_callback.h>\n");
        }
    }



    fprintf(out, "\n");
    write_namespace(out, cppNamespace);

    write_native_stats_write_methods(out, atoms, attributionDecl, supportQ);
    write_native_stats_write_non_chained_methods(out, atoms, attributionDecl);
    write_native_stats_write_methods(out, atoms.signatureInfoMap, attributionDecl, supportQ);
    write_native_stats_write_non_chained_methods(out, atoms.nonChainedSignatureInfoMap,
                                                 attributionDecl);
    write_native_build_stats_event_methods(out, atoms.pulledAtomsSignatureInfoMap,
                                           attributionDecl);

    // Print footer
    fprintf(out, "\n");
@@ -288,6 +339,9 @@ int write_stats_log_header(FILE* out, const Atoms& atoms, const AtomDecl& attrib
    fprintf(out, "#include <vector>\n");
    fprintf(out, "#include <map>\n");
    fprintf(out, "#include <set>\n");
    if (!atoms.pulledAtomsSignatureInfoMap.empty()) {
        fprintf(out, "#include <stats_pull_atom_callback.h>\n");
    }
    fprintf(out, "\n");

    write_namespace(out, cppNamespace);
@@ -337,12 +391,22 @@ int write_stats_log_header(FILE* out, const Atoms& atoms, const AtomDecl& attrib
    fprintf(out, "//\n");
    fprintf(out, "// Write methods\n");
    fprintf(out, "//\n");
    write_native_method_header(out, "int stats_write", atoms.signatureInfoMap, attributionDecl);
    write_native_method_header(out, "int stats_write(", atoms.signatureInfoMap, attributionDecl);
    fprintf(out, "\n");

    fprintf(out, "//\n");
    fprintf(out, "// Write flattened methods\n");
    fprintf(out, "//\n");
    write_native_method_header(out, "int stats_write_non_chained", atoms.nonChainedSignatureInfoMap,
    write_native_method_header(out, "int stats_write_non_chained(", atoms.nonChainedSignatureInfoMap,
                               attributionDecl);
    fprintf(out, "\n");

    // Print pulled atoms methods.
    fprintf(out, "//\n");
    fprintf(out, "// Add AStatsEvent methods\n");
    fprintf(out, "//\n");
    write_native_method_header(out, "void addAStatsEvent(AStatsEventList* pulled_data, ",
                               atoms.pulledAtomsSignatureInfoMap,
                               attributionDecl);

    fprintf(out, "\n");
+2 −2
Original line number Diff line number Diff line
@@ -182,10 +182,10 @@ void write_native_atom_constants(FILE* out, const Atoms& atoms, const AtomDecl&
    fprintf(out, "\n");
}

void write_native_method_signature(FILE* out, const string& methodName,
void write_native_method_signature(FILE* out, const string& signaturePrefix,
                                   const vector<java_type_t>& signature,
                                   const AtomDecl& attributionDecl, const string& closer) {
    fprintf(out, "%s(int32_t code", methodName.c_str());
    fprintf(out, "%sint32_t code", signaturePrefix.c_str());
    int argIndex = 1;
    for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end();
         arg++) {
Loading