1. 程式人生 > >protobuf抓包總結

protobuf抓包總結

charles工具看到的型別:

double64-bit
float32-bit
int32Varint
int64Varint
uint32Varint
uint64Varint
sint32Varint(值錯誤)
sint64Varint(值錯誤)
fixed3232-bit
fixed6464-bit
sfixed3232-bit
sfixed6464-bit
boolVarint(0,1) 
stringLength-delimited
bytes

傳送包

1.required欄位必須賦值,否則會崩潰。
1.int32,int64在傳送包層面結果是一樣的。
2.optional欄位在傳送包層面,是允許不存在的。


接送包

1.proto可以部分欄位還原,不影響解析
2.int32,int64不影響解析。
3.optional,required不影響解析。
4.可以增加optional欄位,不影響解析。
message ViewLayer{
optional int32 key = 1;
optional string name = 2;
optional int32 focus = 3;
optional string path = 4;
optional int32 pageType = 5;
optional int32 catPageKey = 6;
optional string addTest = 7;

optional string layerName = 127;
}
5.不可以增加required欄位,會崩潰。
message ViewLayer{
optional int32 key = 1;
optional string name = 2;
optional int32 focus = 3;
optional string path = 4;
optional int32 pageType = 5;
optional int32 catPageKey = 6;
required string addTest = 7;
optional string layerName = 127;
}
崩潰提示

com.google.protobuf.InvalidProtocolBufferException: Message missing required fields: module[0].viewLayer[0].addTest, module[1].viewLayer[0].addTest。。。

還原proto的經驗:

public final class Proto$Transfer$Entity extends GeneratedMessageLite implements MCSProto$Transfer$AppInfoEntityOrBuilder {
    public static final int APPPKGNAME_FIELD_NUMBER = 1;
    public static final int APPVERSIONCODE_FIELD_NUMBER = 2;
    public static final int APPVERSIONNAME_FIELD_NUMBER = 3;
    public static final int HASACTIVATED_FIELD_NUMBER = 5;
    public static final int ISHOSTAPP_FIELD_NUMBER = 6;
    public static final int SDKVERSION_FIELD_NUMBER = 4;
    private Object appPkgName_;
    private int appVersionCode_;
    private Object appVersionName_;
    private int bitField0_;
    private static final MCSProto$Transfer$AppInfoEntity defaultInstance;
    private boolean hasActivated_;
    private boolean isHostApp_;
    private byte memoizedIsInitialized;
    private int memoizedSerializedSize;
    private int sdkVersion_;

    private static final long serialVersionUID;

關鍵字:GeneratedMessageLite

類是Proto$Transfer$Entity,而不是Proto$Transfer$Entity$Builder

Object == string

boolean == bool

int == int32

long == int64