android update_engine分析二

1. UPDATE ENGINE中的特殊源文件

在上一篇《Android Update Engine分析(一)Makefile》的最后”3. 模块对Update Engine文件的依赖“一节时有提到3个特殊的.proto.aidl文件,如下:

update_metadata-protos (STATIC_LIBRARIES)
  --> update_metadata.proto <注意:这里是.proto文件>

...

libupdate_engine_android (STATIC_LIBRARIES)
  --> binder_bindings/android/os/IUpdateEngine.aidl         <注意:这里是.aidl文件>
      binder_bindings/android/os/IUpdateEngineCallback.aidl <注意:这里是.aidl文件>
      binder_service_android.cc
      boot_control_android.cc
...

update_engine_client (EXECUTABLES)
  --> binder_bindings/android/os/IUpdateEngine.aidl         <注意:这里是.aidl文件>
      binder_bindings/android/os/IUpdateEngineCallback.aidl <注意:这里是.aidl文件>
      common/error_code_utils.cc
      update_engine_client_android.cc
      update_status_utils.cc
...

可见,
update_metadata-protos静态库依赖update_metadata.proto文件
libupdate_engine_android静态库依赖IUpdateEngine.aidlIUpdateEngineCallback.aidl文件
update_engine_client可执行应用依赖IUpdateEngine.aidlIUpdateEngineCallback.aidl文件

这里的文件一类是.proto结尾,另外一类是.aidl结尾。

注:本文主要分析Update Engine相关代码中三个.proto.aidl文件内容和编译结果,并不是对Protobuf和AIDL格式协议或处理流程的分析。对于后者,如果想详细了解,可以借助于google的文档或搜索引擎。如果你此前对这两者没有深入了解,并不会影响本文的阅读。总体上大致需要知道这两类文件的作用就可以了,真的不需要深入,否则很容易就陷进代码的细节去了。看看自动生成的那些冗长的代码,实在让人头晕。

下面详细来分析下这两类文件。

2. PROTOBUF和AIDL文件分析

2.1 PROTOBUF 文件

打开update_metadata.proto文件一看,我去,这都是什么鬼?完全不明白啊。

在阅读update_engine代码前,我从来没有接触过Protobuf,所以如果你也刚好跟我一样没有接触过,那也不用担心,我们可以一起探索下到Protobuf底是什么东西。

搜索一下,网上介绍Protobuf原理和用途的文章很多,这里就不再赘述,这里找到一篇:
- Protobuf的简单介绍、使用和分析

以下是我读这篇文章得到的3个重点:

Protobuf是什么?

Protobuf(Google Protocol Buffers)是Google提供一个具有高效的协议数据交换格式工具库(类似Json),但相比于Json,Protobuf有更高的转化效率,时间效率和空间效率都是JSON的3-5倍。

Protobuf有什么?

  • 关键字message: 代表了实体结构,由多个消息字段(field)组成。
    • 消息字段(field): 包括数据类型、字段名、字段规则、字段唯一标识、默认值
  • 数据类型:常见的原子类型都支持
  • 字段规则
    • required:必须初始化字段,如果没有赋值,在数据序列化时会抛出异常
    • optional:可选字段,可以不必初始化。
    • repeated:数据可以重复(相当于java 中的Array或List)
    • 字段唯一标识:序列化和反序列化将会使用到。
  • 默认值:在定义消息字段时可以给出默认值。

Protobuf有什么用?

Protobuf和Xml、Json序列化的方式不同,采用了二进制字节的序列化方式,用字段索引和字段类型通过算法计算得到字段之前的关系映射,从而达到更高的时间效率和空间效率,特别适合对数据大小和传输速率比较敏感的场合使用。

到这里,对Protobuf的功能有了基本了解,继续回到我们的代码。

检查update_metadata.proto文件,主要定义了以下几个message:
(注意,这里我们只关心到底定义了哪些message,不要去关注每一个message的详细结构,因为这一阶段我们只关心update_metadata.proto是做什么用的)

Extent
Signatures
PartitionInfo
ImageInfo
InstallOperation
PartitionUpdate
DeltaArchiveManifest

我们再来看看围绕update_metadata.proto都生成了哪些文件,检查静态库update_metadata-protos的输出目录:

src$ tree out/target/product/bcm7252ssffdr4/obj/STATIC_LIBRARIES/update_metadata-protos_intermediates/
out/target/product/bcm7252ssffdr4/obj/ST

你可能感兴趣的:(android,OTA,update_engine)