【Android】Manifest和Repo详解

Manifest是用于描述Android项目或库的文件。它包含有关项目的信息,如包名、权限要求和组件(如活动、服务和广播接收器)。

Repo是用于管理Git仓库的工具。它是由Google开发的,用于管理Android源代码库。Repo允许用户将多个Git仓库组合在一起,并在这些仓库之间进行协作。

1、git

git的详细使用方法这里不介绍,这里只要知道git服务器端建立git仓库的命令:

git init --bare [仓库名].git

而客户端创建工程、关联远程仓库、第一次提交的方法是:
创建工程:

git init

关联远程仓库:

git remote add origin [远程仓库地址]

第一次提交:

git push -u origin master

2、repo

repo的详细使用方法这里也不介绍,repo要用到的命令有:

repo init -u [manifest仓库地址] -b [branch]

初始化repo工程,会把manifest.git仓库拖下来。
我们搭建好自己的repo服务器后,也可以使用此命令拖下来自己的repo仓库。

repo sync

同步代码。
搭建好自己的服务器后,用此命令同步时将会从自己的repo仓库同步代码。

3、manifest.xml文件

这个文件要好好介绍一下,我们将会对这个文件进行解析,解析出各个git仓库的服务器地址、本地路径,并根据解析的结果创建和同步这些git仓库代码。

1、开头会定义remote

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote  name="aosp" fetch=".." review="https://android-review.googlesource.com/" />

可以设置多个remote地址,用后面的name区分。

后面可以选择使用哪一个remote地址。

2、指定默认参数

<default revision="master-kernel-build-2022" remote="aosp" sync-j="4" />

remote=”” 来指定使用哪一个remote地址。

revision 指定分支,从remote地址拖工程时指定拖哪个分支

sync -j 指定同步线程数

3、后面一大堆内容都是指定远程工程路径,以及拖下来的位置

  <project path="build/kernel" name="kernel/build" >
    <linkfile src="kleaf/bazel.sh" dest="tools/bazel" />
    <linkfile src="kleaf/bazel.WORKSPACE" dest="WORKSPACE" />
    <linkfile src="build.sh" dest="build/build.sh" />
    <linkfile src="build_abi.sh" dest="build/build_abi.sh" />
    <linkfile src="build_test.sh" dest="build/build_test.sh" />
    <linkfile src="build_utils.sh" dest="build/build_utils.sh" />
    <linkfile src="config.sh" dest="build/config.sh" />
    <linkfile src="envsetup.sh" dest="build/envsetup.sh" />
    <linkfile src="_setup_env.sh" dest="build/_setup_env.sh" />
    <linkfile src="multi-switcher.sh" dest="build/multi-switcher.sh" />
    <linkfile src="abi" dest="build/abi" />
    <linkfile src="static_analysis" dest="build/static_analysis" />
  </project>
  <project path="common" name="kernel/common" revision="android13-5.15" >
    <linkfile src="." dest=".source_date_epoch_dir" />
  </project>
  <project path="kernel/tests" name="kernel/tests" />
  <project path="kernel/configs" name="kernel/configs" />
  <project path="common-modules/virtual-device" name="kernel/common-modules/virtual-device" revision="android13-5.15" />
  <project path="prebuilts/clang/host/linux-x86" name="platform/prebuilts/clang/host/linux-x86" clone-depth="1" />
  <project path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8" clone-depth="1" />
  <project path="prebuilts/boot-artifacts" name="platform/prebuilts/boot-artifacts" />
  <project path="prebuilts/build-tools" name="platform/prebuilts/build-tools" clone-depth="1" />
  <project path="prebuilts/kernel-build-tools" name="kernel/prebuilts/build-tools" clone-depth="1" />
  <project path="tools/mkbootimg" name="platform/system/tools/mkbootimg" />

  <project path="prebuilts/bazel/linux-x86_64" name="platform/prebuilts/bazel/linux-x86_64" clone-depth="1" />
  <project path="prebuilts/jdk/jdk11" name="platform/prebuilts/jdk/jdk11" clone-depth="1" />
  <project path="prebuilts/ndk-r23" name="toolchain/prebuilts/ndk/r23" clone-depth="1" />

  <project path="external/bazel-skylib" name="platform/external/bazel-skylib" />
  <project path="build/bazel_common_rules" name="platform/build/bazel_common_rules" />
  <project path="external/stardoc" name="platform/external/stardoc" />
  <project path="external/python/absl-py" name="platform/external/python/absl-py" />
</manifest>

path:本地相对路径,可以不指定,不指定的话表示和name相同。

name:远程相对与remote地址的路径。

version:指的是此git sync下来的branch。

groups:指定了该git存储库所属的组

linkfile: 指定应从 common 目录中的文件创建一个名为 .source_date_epoch_dir 的目标文件的符号链接。

这里的每个name就代表一个git子工程,整个android工程有很多个git子工程组成,这里指定了各个子工程相对于remote的路径、版本、拖下来后的本地路径。

4、总结

remote元素

设置远程git服务器的属性,包括下面的属性:

  • name: 远程git服务器的名字,直接用于git fetch, git remote 等操作
  • alias: 远程git服务器的别名,如果指定了,则会覆盖name的设定。在一个manifest中, name不 能重名,但alias可以重名。
  • fetch: 所有projects的git URL 前缀
  • review: 指定Gerrit的服务器名,用于repo upload操作。如果没有指定,则repo upload没有效果。

一个manifest文件中可以配置多个remote元素,用于配置不同的project默认下载指向。

default元素

设定所有projects的默认属性值,如果在project元素里没有指定一个属性,则使用default元素的属性值。

  • remote: 之前定义的某一个remote元素中name属性值,用于指定使用哪一个远程git服务器。
  • revision: git分支的名字,例如master或者refs/heads/master
  • sync_j: 在repo sync中默认并行的数目。
  • sync_c: 如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容。
  • sync_s: 如果设置为true,则会同步git的子项目

Example:

<default revision="master-kernel-build-2022" remote="aosp" sync-j="4" />
project元素

指定一个需要clone的git仓库。

  • name: 唯一的名字标识project,同时也用于生成git仓库的URL。格式如下:
    r e m o t e f e t c h / {remote_fetch}/ remotefetch/{project_name}.git
  • path: 可选的路径。指定git clone出来的代码存放在本地的子目录。如果没有指定,则以name作为子目录名。
  • remote: 指定之前在某个remote元素中的name。
  • revision: 指定需要获取的git提交点,可以是master, refs/heads/master, tag或者SHA-1值。如果不设置的话,默认下载当前project,当前分支上的最新代码。
  • groups: 列出project所属的组,以空格或者逗号分隔多个组名。所有的project都自动属于"all"组。每一个project自动属于name:‘name’ 和path:'path’组。
    例如,它自动属于default, name:monkeys, and path:barrel-of组。如果一个project属于notdefault组,则,repo sync时不会下载。
    sync_c: 如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容。
  • sync_s: 如果设置为true,则会同步git的子项目。
  • upstream: 在哪个git分支可以找到一个SHA1。用于同步revision锁定的manifest(-c 模式)。该模式可以避免同步整个ref空间。
  • annotation: 可以有多个annotation,格式为name-value pair。在repo forall 命令中这些值会导入到环境变量中。
  • remove-project: 从内部的manifest表中删除指定的project。经常用于本地的manifest文件,用户可以替换一个project的定义。
  • 子元素

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