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.aidl
和IUpdateEngineCallback.aidl
文件
- update_engine_client
可执行应用依赖IUpdateEngine.aidl
和IUpdateEngineCallback.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