MapleStory

Statsd In android 9(3)

前面已经介绍了statsd的接口以及调用流程,本篇介绍接口自动生成的代码。

###StatsLogInternal
framework/base/core仓中的StatsLogInternal.java会被编译到framework.jar中,因而会在编译该jar包前生成。
查看framework/base/Android.bp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
java_library {
name: "framework",
srcs: [
...
":framework-statslog-gen",
],
genrule {
name: "framework-statslog-gen",
tools: ["stats-log-api-gen"],
cmd: "$(location stats-log-api-gen) --java $(out)",
out: ["android/util/StatsLogInternal.java"],
}

可以理解为执行stats-log-api-gen这个工具,生成StatsLogInternal.java这个文件-
查看framework/base/tools/stats_log_api_gen/Android.bp
首先生成 stats-log-api-gen,再生成 statslog.h 以及 statslog.cpp,最后生成 libstatslog

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
name: "statslog.h",
tools: ["stats-log-api-gen"],
cmd: "$(location stats-log-api-gen) --header $(genDir)/statslog.h",
out: [
"statslog.h",
],
}
genrule {
name: "statslog.cpp",
tools: ["stats-log-api-gen"],
cmd: "$(location stats-log-api-gen) --cpp $(genDir)/statslog.cpp",
out: [
"statslog.cpp",
],
}

这里以java文件生成为例,查看代码的生成流程-

1
2
3
4
5
6
7
8
FILE* out = fopen(javaFilename.c_str(), "w");
if (out == NULL) {
fprintf(stderr, "Unable to open file for write: %s\n", javaFilename.c_str());
return 1;
}
errorCount = android::stats_log_api_gen::write_stats_log_java(
out, atoms, attributionDecl);
fclose(out);

0.解析proto文件中的定义的常量(atoms)以及方法的参数(attributionDecl, attributionSignature)
解析atoms的方法均在Collation.cpp中定义
1.写入公用的字段,如import 以及类名
2.写入atom的常量
3.写入atom枚举的常量
4.写入write以及write_non_chained代码

1
2
3
write_java_method(out, "write", atoms.signatures, attributionDecl);
write_java_method(out, "write_non_chained", atoms.non_chained_signatures, attributionDecl);
write_java_work_source_method(out, atoms.signatures);

整个过程很简单,这里值得借鉴的是动态根据配置批量生成接口的方法
具体来说可以参考bp文件中的genrule的定义以及使用-

Comments