一、 REPO仓库

在 Android 开源项目(AOSP)和其他大型项目中,repo 是一个管理多个 git 仓库的工具,它帮助开发者方便地管理、同步和构建多个代码仓库。repo 使用 manifest 文件来定义项目的仓库结构和版本关系。以下是 repo、manifest 文件、仓库及分支之间的关系及一些使用案例。
repo 工具的原理
repo 是 Google 开发的一个 Python 脚本,用于管理多个 git 仓库,尤其适用于管理拥有大量独立仓库的大型项目。其主要功能包括:
● 同步:可以从远程服务器拉取多个仓库的数据并同步到本地。
● 版本控制:通过 manifest 文件指定每个仓库的分支和提交版本。
● 更新管理:在 manifest 文件中定义不同版本,使项目组可以控制整个项目中各仓库的版本一致性。manifest 文件的作用
manifest 是一个 XML 文件,定义了项目中所有仓库的结构和版本。manifest 文件的主要内容包括:
● 项目列表:列出所有仓库的 URL、路径、分支和具体的提交版本。
● 分支设置:为每个仓库指定特定的分支,使 repo 可以检出指定分支的内容。
● 远程服务器:定义远程仓库的 URL,让 repo 知道从哪里拉取代码。
一个简单的 manifest.xml 例子如下:

在上面的例子中:
● 定义了一个远程仓库 aosp,从指定 URL 获取代码。
● 默认分支为 master。
● 项目 platform/frameworks/base 使用 android-14.0.0_r1 分支。
● 项目 platform/system/core 使用 master 分支。
● fetch 是 remote 标签中的一个属性,表示项目代码从哪里拉取,即 git 仓库的基本 URL。
设置 git 的远程地址:fetch 决定了 repo 如何在每个 project 标签中构建完整的 git 克隆地址。
相对路径配置:当 manifest.xml 文件中的 project 标签指定了一个仓库名时,它会被附加到 fetch URL 后构成完整的地址
仓库和分支的关系
● 仓库:仓库是项目中的一个单独的代码库。每个仓库可以有多个分支。
● 分支:不同的分支表示代码库的不同版本。repo 可以根据 manifest 文件为每个仓库选择合适的分支。-
使用案例
案例 1:克隆和同步代码
image.png
案例 2:切换到不同分支
<project name="platform/frameworks/base" path="frameworks/base" revision="android-12.0.0_r1" />
repo sync
案例 3:切换 manifest 版本
开发过程中可能需要在不同版本间切换,可以重新初始化并同步:

二 aosp版本选定
我们使用的源码是基于android 14.0.0_r45版本,r是发布修订版本编号
参考网站:
https://source.android.google.cn/docs/setup/about/build-numbers?hl=zh-cn
三 下载aosp源码及下载工具
3.1 一些必要的其它资源的安装工作:apt-get install xxxx
sudo apt-get update
sudo apt-get install git
sudo apt-get install curl
sudo apt-get install adb
sudo apt-get install repo
sudo apt-get install vim
sudo apt-get install -y git devscripts equivs config-package-dev debhelper-compat golang curl
3.2 git 配置
git config --global user.name "hello"
git config --global user.email "hello@126.com"
3.3 下载repo脚本工具
mkdir aosp
cd aosp
mkdir bin
//这个链接失效
//curl https://storage.googleapis.com/git-repo-downloads/repo> bin/repo
//用下面这个
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o bin/repo
chmod a+x bin/repo
3.4 aosp源码下载
指定manifest仓库
清华mirror:
export REPO_URL='https://mirrors.ustc.edu.cn/aosp/git-repo.git/'
bin/repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-14.0.0_r45
中科大mirror:
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/aosp/git-repo.git/'
bin/repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r45
开始同步:
bin/repo sync -j2 (建议不要超过2,否则可能会下载失败)
3.5 谷歌官网下载aosp方法(需要梯子)
参考谷歌官网:
https://source.android.google.cn/docs/setup/download/downloading?hl=zh-cn

四 系统aosp源码编译:
cd aosp
source build/envsetup.sh
lunch 选择编号
make -j18 //配置自己电脑配置选择线程数
关于编号的说明:
● user: 权限受限,适用于生产环境
● userdebug: 与user类似,但具有root权限与调试功能
● eng: 工程师版本,具有root权限,并且具有额外调试工具的开发配置
我们需要选择的是有手机界面的具有模拟器功能的版本:需要手动添加配置:
vim build/make/target/product/AndroidProducts.mk
在最后一行添加:sdk_phone_x86_64-eng
重新 执行上面的指令,会出现我们刚配置的新选项,选 择它的编号或者直接输入:lunch sdk_phone_x86_64-eng
五. 启动虚拟机
source build/envsetup.sh
lunch sdk_phone_x86_64-eng
emulator -verbose -writable-system
sudo groupadd -r kvm
sudo gpasswd -a $USER kvm
注意:报错的异常处理1:

报错的异常处理2:
emulator报错 This user doesn't have permissions to use KVM (/dev/kvm)
这个时候运行一下以下命令就可以了:
sudo chown hello -R /dev/kvm
可以将此命令设置到~/.bashrc中
五 git 提交代码
cd build/make/target/product/
新建本地分支:git checkout -b build_branch
git status:查看
git add "AndroidProduct.mk"
git commit -m "add sdk_phone_x86_64-eng lunch choice"
git log
六 编译生成android.iml和android.ipr
目的:使用生成的android.ipr导入android studio.方便阅读
- source build/envsetup.sh
- lunch sdk_phone_x86_64-eng
- make idegen -j4
- sudo development/tools/idegen/idegen.sh
生成的代码位于aosp根目录下。
导入方法:
- 修改android.iml: 删除所有的jar库、排除不需要的目录,使用exclude方法。
- 直接打开android studio, open后选择android.ipr这个文件即可
整个过程持续时间大约1小时左右,如果电脑配置低点的甚至更久。。
