为了解析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启用。但是,我仍然不确定这是否是正确的方法。