• android update_engine分析二


    1. UPDATE ENGINE中的特殊源文件

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

    1. update_metadata-protos (STATIC_LIBRARIES)
    2. --> update_metadata.proto <注意:这里是.proto文件>
    3. ...
    4. libupdate_engine_android (STATIC_LIBRARIES)
    5. --> binder_bindings/android/os/IUpdateEngine.aidl <注意:这里是.aidl文件>
    6. binder_bindings/android/os/IUpdateEngineCallback.aidl <注意:这里是.aidl文件>
    7. binder_service_android.cc
    8. boot_control_android.cc
    9. ...
    10. update_engine_client (EXECUTABLES)
    11. --> binder_bindings/android/os/IUpdateEngine.aidl <注意:这里是.aidl文件>
    12. binder_bindings/android/os/IUpdateEngineCallback.aidl <注意:这里是.aidl文件>
    13. common/error_code_utils.cc
    14. update_engine_client_android.cc
    15. update_status_utils.cc
    16. ...

    可见,
    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是做什么用的)

    1. Extent
    2. Signatures
    3. PartitionInfo
    4. ImageInfo
    5. InstallOperation
    6. PartitionUpdate
    7. DeltaArchiveManifest

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

    1. src$ tree out/target/product/bcm7252ssffdr4/obj/STATIC_LIBRARIES/update_metadata-protos_intermediates/
    2. out/target/product/bcm7252ssffdr4/obj/ST
  • 相关阅读:
    linux学习心得范文
    PMP备考大全:经典题库(敏捷管理第9期)
    Python经典习题(二)
    大数据MapReduce是什么
    JavaFx学习问题2--音频、视频播放失败情况
    YOLOv8改进AFPN:改进用于目标检测的渐近特征金字塔网络AsymptoticFPN,加强非相邻层的直接交互,YOLO系列高效涨点
    数字后端概念——ILM
    【算法100天 | 17】手撕堆,使插入、删除任意元素的时间复杂度为O(logn)(Java实现)
    RabbitMQ 一文读懂
    UMA 2 - Unity Multipurpose Avatar☀️八.UMA内置实用Recipes插件
  • 原文地址:https://blog.csdn.net/longtian635241/article/details/134504325