这篇文章上次修改于 541 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

首先祭出官方源代码地址 => https://github.com/protocolbuffers/protobuf

背景

43099-pch45cvpiq.png

如图所示

forceHost_FORCE_HOST_FIELD_NUMBER是相对应的

为了能够批量将apk内的代码转换回proto文件,必须知道其中的映射关系

(不像com.squareup.wire是直接在字段的注解上的)

源代码分析

  • src/google/protobuf/compiler/java/java_helpers.cc
  • src/google/protobuf/compiler/java/java_message.cc
  • src/google/protobuf/compiler/java/java_message_lite.cc
  • ...

有关Java的转换,可以定位到UnderscoresToCamelCaseToCamelCase比较关键

至此,可以知道有以下转换

  • 原字段名进行翻转,遇到下划线则去掉,并将下划线的上一位大写,遍历直到结束
  • lower_first会控制最后一位不会被大写,默认是true
  • 最终结果会加上下划线

根据上面的信息,可以得出forceHost_原本是force_host

另外一个函数FieldConstantName

std::string FieldConstantName(const FieldDescriptor* field) {
  std::string name = field->name() + "_FIELD_NUMBER";
  ToUpper(&name);
  return name;
}

基于此可以知道字段的tag的字段名会加上_FIELD_NUMBER

基于以上信息可以将XXX_FIELD_NUMBERXXX关联,这样就可以利用脚本直接还原proto了