Android系统开发的第一步就是获取源码,这时就需要用到repo命令了:

repo init,用于初始化repo环境,一个XML格式的manifest.xml文件会生成在本地新建的.repo/中,
manifest.xml定义了本地代码的目录结构,以及从远程下载的代码路径。

repo sync,用于下载Android源码,这需要解析manifest.xml文件,按照指示下构建本地源码目录。

由此可见,repo基于manifest.xml完成对Android源码的管理,manifest.xml是描述源码结构的清单。

对于源码来讲,manifest.xml只是一个到.repo/manifests/default.xml的文件链接。
真正的清单文件是通过manifests这个git库托管起来的。
打开AOSP(Android Open Source Project)的manifests库,其中只包含一个default.xml文件,
这就是最基本的清单构成。

整个结构如下图所示:

在进行Android系统开发时,通常需要对清单文件进行定制,例如:
设备厂商会构建自己的manifest库,通常是基于AOSP的default.xml进行定制,比如:
去掉AOSP的一些git库、增加一些自有的git库。

要实现定制清单的目的,可以直接对default.xml文件内容进行修改,然而这种方式在一些场景下存在弊端,例如:
1、部分对default.xml的修改,不需要上传到代码服务器,于是定期同步最新的default.xml,就容易与本地的修改产生冲突;
2、设备厂商大都是在多分支的环境下开发,对不同default.xml修改的内容都往往是相同的,这就导致需要在多分支上重复提交相同的修改。

这个时候,就可以使用repo支持的另一种定制方式:Local Manifests。
在repo sync下载代码之前,会将.repo/manifests/default.xml、local_manifest.xml和.repo/local_manifests/目录下存在清单文件进行合并,再根据融合的清单文件进行代码同步。
这样一来,只需要将清单文件的修改项放到.repo/local_manifests/目录下, 就能够在不修改default.xml的前提下,完成对清单的文件的定制。
Local Manifests机制的原理图如下所示:

参考网上的资料,Local Manifests的隐含规则如下:
1、先解析local_manifest.xml,再解析local_manifests/目录下的清单文件;
2、local_manifests目录下的清单文件是没有命名限制的,但会按照字母序被解析,即字母序靠后的文件内容会覆盖之前的;
3、 所有清单文件的内容必须遵循repo定义的格式才能被正确解析。

了解了Local Manifests机制后,我们来看实际的例子。

假设default.xml的内容如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<manifest><remote name="origin" fetch=".." /><default revision="refs/heads/master" remote="origin" /><project path="A" name="Demo/project-A" revision="refs/heads/master"/><project path="B" name="Demo/project-B" revision="refs/heads/master"/>
</manifest>

此时,直接repo sync将得到project-A和Project-B的master分支代码。

如果我们在repo sync前,在.repo/目录下创建local_manifest.xml或local_manifests/1.xml,
那么Local Manifests机制就会启动。

假设local_manifest.xml的内容如下所示:

<manifest><!--default.xml中A、B不再有效--><remove-project name="Demo/project-A" /><remove-project name="Demo/project-B" /><project path="B" name="Demo/project-B" revision="527cdcb2b4dad3723bc4c3ae850da8ed187bde1d" /><project path="C" name="Demo/project-C" revision="refs/heads/master"/>
</manifest>

此时,再进行repo sync,将得到Project-B和Project-C,且Project-B的头节点为527cdcb2b4dad3723bc4c3ae850da8ed187bde1d。

Android Local Manifests机制相关推荐

  1. Android异步消息机制

    2019独角兽企业重金招聘Python工程师标准>>> 目录介绍 1.Handler的常见的使用方式 2.如何在子线程中定义Handler 3.主线程如何自动调用Looper.pre ...

  2. Android的消息机制简单总结

    参考文章: http://gityuan.com/2015/12/26/handler-message-framework/#next 参考资料: Android Framework的源码: Mess ...

  3. Android 开发艺术探索——第十章 Android的消息机制

    Android 开发艺术探索--第十章 Android的消息机制读书笔记 Handler并不是专门用于更新UI的,只是常被用来更新UI 概述 Android的消息机制主要值得就是Handler的运行机 ...

  4. Android Binder IPC机制

    之前有很多人问过我TaintDroid的内容,所以一点点吧涉及的思路整理一下. 今天又看了一遍,确实需要很多的技术支持以及扎实的功底,不管是Java的还是Android,从系统底层一直到顶层,涉及的知 ...

  5. 通过源码分析Android 的消息处理机制

    2019独角兽企业重金招聘Python工程师标准>>> #通过源码分析Android 的消息处理机制 我们知道,Android应用是通过消息来驱动的,每一个进程被fork之后,都会在 ...

  6. Android的消息机制(2)

    上一节中,是主线程自己发了一个消息到自己的Message Queue中,并把消息从队列中提取出来.那么如何由别的线程发送消息给主线程的Message Queue中呢? 直接看代码~~ 1 2 3 4 ...

  7. Android事件分发机制详解

    2019独角兽企业重金招聘Python工程师标准>>> 之前在学习Android事件方法机制的时候,看过不少文章,但是大部分都讲的不是很清楚,我自己理解的也是云里雾里,也尝试过阅读源 ...

  8. android触摸事件分发,Android 事件分发机制

    Android 事件分发机制一直让人头痛,之前也是面向 GitHub 编程得过且过.今天下定决心了解一下,以便后面自己定制 View 效果.Android 触摸事件有三个基本类型:ACTION_DOW ...

  9. Android系统Surface机制的SurfaceFlinger服务的线程模型分析

    在前面两篇文章中,我们分析了SurfaceFlinger服务的启动过程以及SurfaceFlinger服务初始化硬件帧缓冲区的过程.从这两个过程可以知道,SurfaceFlinger服务在启动的过程中 ...

最新文章

  1. R使用dplyr包对变量、特征进行标准化(standardize)缩放操作
  2. VirtualBox 虚拟Ubuntu系统与主机互ping
  3. python到底可以做什么-编程小白必看!Python到底能做什么?
  4. glibc-2.23学习笔记(二)—— free部分源码分析
  5. c语言编程*字母图形,BIT网教c语言练习_编程复习1输出图形
  6. cstring判断是否包含子串_最长子串-滑动窗口
  7. NLP《语言模型(二)-- 神经网络NNLM语言模型》
  8. linux在哪里储存变量值,关于linux:在bash中,如何在变量中存储返回值?
  9. 实战:基于服务端开发和前后端分离开发区别
  10. MAC使用find命令的正确办法
  11. python总结与思考_学Python很久但是一直无法提升!你有思考过究竟是为什么吗?...
  12. Oracle ERP 模块
  13. 解决Not all parameters were used in the SQL statement问题
  14. 成功GET一款高大上又不显俗的Linux时间锁屏软件-GLUQLO
  15. python爬取哔哩哔哩视频_python爬取哔哩哔哩小视频
  16. 解决2021版本idea定位图标消失
  17. 湖北一考生将高考数学题上传小猿搜题事件网络舆情综合编报
  18. 核磁共振三维重建(视频)
  19. PE市盈率们之间的区别
  20. 【世界知识产权日】让区块链落地服务于网络知识产权

热门文章

  1. JavaWeb全套教程笔记_前端技术
  2. Deepin开发环境搭建
  3. LeetCode摆动序列
  4. Python爬虫:爬了7天的斗鱼,我们来看一下主播们的真实现状
  5. ibm java虚拟机_IBM J9 Java虚拟机正式开源,贡献给Eclipse基金会管理
  6. Python编程基础 第四章 编程练习 请定义一个Circle类,具体要求为:(1)每个Circle类对象可以存储圆心和半径信息;(2)具有设置圆心和半径的方法SetCenter和SetRadius
  7. 简图记录-正则表达式原理与应用基础
  8. 跨专业转行数据分析真的可行吗?
  9. 《Investigating Typed Syntactic Dependencies for TSC Using GAT》论文笔记
  10. 词根词缀 (一):前缀篇