我是否需要下载Android框架源代码中的所有.proto文件以解析adb转储的proto消息? &g



为了解析proto消息,我需要有一个由模板(.proto)文件生成的python类文件。

但是在Android的情况下,我不得不下载framework/base,framework/proto_logging和可能更多的repos到import所有相关的配置文件。我在这张票的末尾附加了我的目标原型文件activitymanagerservice.proto

我的问题是:

  • 我应该找到并下载所有的原型文件来生成一个python类吗?
  • 如果是这样,我应该管理版本的原型文件?例如,Android9的转储和Android12的转储可能不同

这是我想知道这个的原因:

我目前正在收集meminfo和其他adb shell dumpsys提供的每秒钟的性能指标。

没有--proto,我不得不使用python的正则表达式,但我很快意识到我必须考虑的条件太多了。

因为他们提供--proto选项,我正在寻找协议缓冲区。

我使用的命令是:

adb shell dumpsys meminfo --local -s --proto com.android.chrome | protoc --decode_raw

结果如下:

1: 202730922
2: 268724137
4 {
1 {
1: 29432
2: "com.android.chrome"
9 {
1: 6128
2: 26032
3: 45932
4: 40
5: 44628
6: 5044
7: 29509
8: 461
}
}
}

由于这是模棱两可的,我找到了正确的原型文件,但它有许多导入:

https://cs.android.com/android/platform/superproject/+/主:框架/基地/核心/原型/android/服务器/activitymanagerservice.proto

syntax = "proto2";
package com.android.server.am;
import "frameworks/base/core/proto/android/app/activitymanager.proto";
import "frameworks/base/core/proto/android/app/appexitinfo.proto";
import "frameworks/base/core/proto/android/app/notification.proto";
import "frameworks/base/core/proto/android/app/profilerinfo.proto";
import "frameworks/base/core/proto/android/content/component_name.proto";
import "frameworks/base/core/proto/android/content/configuration.proto";
import "frameworks/base/core/proto/android/content/intent.proto";
import "frameworks/base/core/proto/android/content/package_item_info.proto";
import "frameworks/base/core/proto/android/internal/processstats.proto";
import "frameworks/base/core/proto/android/os/bundle.proto";
import "frameworks/base/core/proto/android/os/looper.proto";
import "frameworks/base/core/proto/android/os/powermanager.proto";
import "frameworks/base/core/proto/android/server/intentresolver.proto";
import "frameworks/base/core/proto/android/server/windowmanagerservice.proto";
import "frameworks/base/core/proto/android/util/common.proto";
import "frameworks/base/core/proto/android/privacy.proto";
import "frameworks/proto_logging/stats/enums/app/enums.proto";
...
message MemInfoDumpProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
optional int64 uptime_duration_ms = 1;
optional int64 elapsed_realtime_ms = 2;
message ProcessMemory {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
optional int32 pid = 1;
optional string process_name = 2;
message MemoryInfo {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
optional string name = 1;
// The proportional set size for the heap.
optional int32 total_pss_kb = 2;
// The proportional set size that is swappable for the heap.
optional int32 clean_pss_kb = 3;
// The private dirty pages used by the heap.
optional int32 shared_dirty_kb = 4;
// The shared dirty pages used by the heap.
optional int32 private_dirty_kb = 5;
// The shared clean pages used by the heap.
optional int32 shared_clean_kb = 6;
// The private clean pages used by the heap.
optional int32 private_clean_kb = 7;
oneof dirty_swap {
// The dirty the pages that have been swapped out.
int32 dirty_swap_kb = 8;
// The dirty the pages that have been swapped out, proportional.
int32 dirty_swap_pss_kb = 9;
}
// The rss set size for the heap.
optional int32 total_rss_kb = 10;
}
message HeapInfo {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
...
message StickyBroadcastProto {
...

作为activitymanagerservice。proto有很多导入文件,我下载了所有相关的文件

https://cs.android.com/android/platform/superproject/+/主:框架/基地https://cs.android.com/android/platform/superproject/+/主:框架/proto_logging

然后不仅编译了我的message类,还编译了所有其他的proto文件:

protoc --proto_path=proto --python_out=proto_out proto/**/*.proto

这是因为它们相互引用。

我终于可以读取dumpsys结果的proto启用。但是,我仍然不确定这是否是正确的方法。

最新更新