在上一篇《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.aidl和IUpdateEngineCallback.aidl文件
- update_engine_client可执行应用依赖IUpdateEngine.aidl和IUpdateEngineCallback.aidl文件
这里的文件一类是.proto结尾,另外一类是.aidl结尾。
注:本文主要分析Update Engine相关代码中三个
.proto和.aidl文件内容和编译结果,并不是对Protobuf和AIDL格式协议或处理流程的分析。对于后者,如果想详细了解,可以借助于google的文档或搜索引擎。如果你此前对这两者没有深入了解,并不会影响本文的阅读。总体上大致需要知道这两类文件的作用就可以了,真的不需要深入,否则很容易就陷进代码的细节去了。看看自动生成的那些冗长的代码,实在让人头晕。
下面详细来分析下这两类文件。
打开update_metadata.proto文件一看,我去,这都是什么鬼?完全不明白啊。
在阅读update_engine代码前,我从来没有接触过Protobuf,所以如果你也刚好跟我一样没有接触过,那也不用担心,我们可以一起探索下到Protobuf底是什么东西。
搜索一下,网上介绍Protobuf原理和用途的文章很多,这里就不再赘述,这里找到一篇:
- Protobuf的简单介绍、使用和分析
以下是我读这篇文章得到的3个重点:
Protobuf是什么?
Protobuf(Google Protocol Buffers)是Google提供一个具有高效的协议数据交换格式工具库(类似Json),但相比于Json,Protobuf有更高的转化效率,时间效率和空间效率都是JSON的3-5倍。
Protobuf有什么?
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