之前下载的android原码直接在上边简单修改调试,但是考虑到后边扔到服务器(本地)上多人调试时的不方便,这几天搞了一下,作为记录。

1、repo理解

repo管理多个git仓库,用来同步,拉取代码,repo中的manifest/default.xml中配置了所要管理的git仓库。执行repo sync指令后,会根据这个xml文件执行代码同步的操作。

安装Repo

#mkdir ~/bin
#PATH=~/bin:$PATH
#curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/
#chmod a+x ~/bin/repo

 或者

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod +x repo

直接把 git-repo中的repo.py 复制到 /user/bin 中;

认识 manifest/default.xml 文件

Android 源码里有上百个 git 项目,不同版本的源码项目各不相同,Repo 指令如何知道具体有哪些项目呢,答案就在 manifest/default.xml 。 default.xml 记录了这些 git 项目的名称、路径等信息,通过它, Repo 就有迹可循。

了解 manifest/default.xml 最好的办法,就是从零搭建一个 Repo 服务器。

随便找台 Linux 操作系统计算机,新建一个目录模拟 Repo 服务器

#mkdir /tmp/repo-server
#cd /tmp/repo-server

在 /tmp/repo-server 目录创建若干个 git 仓库:

  1. #创建 git 仓库 project_1

    #mkdir project_1 && cd project_1
    #git init;
    #touch p1.txt;
    #git add .
    #git commit –m "initial commit"
    #cd..

  2. #创建一个 git 仓库 project_2

    #mkdir project_2 && cd project_2
    #git init
    #touch p2.txt
    #git add .
    #git commit –m "initial commit"

在 /tmp/repo-server 创建 manifest 仓库:

  1. #创建 manifest 仓库

    #mkdir manifest && cd manifest
    #git init;
    #touch default.xml;

在 default.xml 加入以下内容

  1. <?xml version="1.0" encoding="UTF-8"?>
    <manifest>
    <remote name="test"
    fetch="." />
    <default revision="master"
    remote="test"
    sync-j="4" />
    <project path="project_1" name="project_1" />
    <project path="project_2" name="project_2" />
    </manifest>

  2. 然后 commit 代码

    #git add .
    #git commit –m "initial manifest"

这样,模拟 Repo 服务器就搭建完成了。

接着再建一个新的目录/tmp/repo-client/,模拟 Repo 客户端。在客户端目录里:

#repo init –u /tmp/repo-server/manifest

如果一切正常,将会收到成功提示信息。这时候去查看该目录下的 .repo,就会发现有一个 manifest.xml,内容是克隆服务器的 default.xml 文件。

如果报错,有可能是版本不对;

#cd .repo/repo 
#git checkout v1.13.7.1
#cd ..
#cd ..

返回/tmp/repo-client,使用 Repo 指令将多个 git 项目的代码一次性同步到客户端上:

#repo sync

仔细揣摩 default.xml 文件的内容,你应该能理解这个 xml 文件的作用。

搭建服务器

 repo理解差不多了,我们就可以管理android源码了,我下载的源码中已经有.git文件了(如果没有的话,后边再说),那我只要把他们添加到 repo的配置文件中就可以了。

(1)罗列出所有的git仓库备用 git_projects.txt

#find /home/android-5.1.1_r1/ -type d -name '.git' > git_projects.txt

出来是这个样子的

/home/android-5.1.1_r1/bootable/bootloader/legacy/.git
/home/android-5.1.1_r1/bootable/recovery/.git
/home/android-5.1.1_r1/device/common/.git
/home/android-5.1.1_r1/device/asus/tilapia/.git
/home/android-5.1.1_r1/device/asus/deb/.git

(2)掐头去尾 path.txt (24 是头部长度,根据实际情况修改)path.txt

#cat git_projects.txt | cut -c 24- | sed 's/.....$//' >path.txt

结果:

path.txt文件内容

bootable/bootloader/legacy
bootable/recovery
device/common
device/asus/tilapia
device/asus/deb
device/asus/fugu-kernel

(3)生成repo 的default.xml 文件   脚本:gen_xml.sh

#!/bin/bash
echo -e "
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<manifest>
  <remote  name=\"aosp\"
           fetch=\".\"/>
  <default revision=\"master\"
           remote=\"aosp\"
           sync-j=\"4\" />" >>$1
 
while read line; do
    echo "<project path=\"$line\" name=\"$line\" />" >>$1
done
echo -e "\n</manifest>" >>$1

执行脚本: 

#cat path.txt | ./gen_xml.sh default.xml

得到的 default.xml 里, 示例如下

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote  name="aosp"
           fetch="." />
  <default revision="master"
           remote="aosp"
           sync-j="8" />
<project path="bootable/bootloader/legacy" name="bootable/bootloader/legacy"/>
<project path="bootable/recovery" name="bootable/recovery"/>
<project path="device/common" name="device/common"/>
<project path="device/asus/tilapia" name="device/asus/tilapia"/>
<project path="device/asus/deb" name="device/asus/deb"/>
<project path="device/asus/fugu-kernel" name="device/asus/fugu-kernel"/>
<project path="device/asus/fugu" name="device/asus/fugu"/>
...
</manifest>

新建管理服务器:

(1)选个位置建服务器

#mkdir AOSP && cd AOSP

(2)初始化所有的git仓库,几百个仓库,需要用脚本初始化 git_init.sh

#!/bin/bash
work_dir=$1
pwd=${PWD}
count=0
while read line; do
    echo $line
    workdir=$pwd/$line
    mkdir -p $workdir
    cd $workdir
    git init
    git config receive.denyCurrentBranch updateInstead 
    cd -
done

这里还要用到刚才掐头去尾生成的 path.txt文件

path.txt文件和这个脚本文件git_init.sh 放在AOSP文件下

#cat path.txt | ./git_init.sh

结果:所有的git仓库都被初始化。

(3)添加repo的管理文件 /manifest/default.xml

在AOSP文件下新建manifest文件 初始化仓库,提交default.xml

#mkdir manifest & cd manifest
#git init

然后把 刚才生成的 default.xml 粘贴过来,放到manifest 文件夹下

# git add .
#git commit -m "init default.xml"

至此,服务端的工作就做完了;只需要将源码中的git仓库同步到服务端就可以了,依旧是脚本提交

(4)将原码中的仓库 同步到服务器。

push_aodp.sh  

#!/bin/bash
work_dir=$1

pwd=${PWD}
count=0
 
while read line; do
    count=$((count+1))
    line1=${line%%/*}
   
    if [ -z "$line" ]; then
        echo $work_dir not exist !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1>&2
        continue
    fi
    if [ $(ls -A $pwd/$line | wc -l) -eq 0 ]; then
        echo $work_dir empty !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1>&2
        continue
    fi
    workdir=$pwd/$line
    cd $workdir
        rm -rf .git
        git init . 1>&2 
       {  git add . -f 1>&2 
          echo ----1--
            git commit -m "Initial commit" &&
            git push -f --set-upstream /home/AOSPServer/$line master
        } || {
    touch README
        git add .
        git commit -m "Initial commit" &&
        git push -f --set-upstream /home/AOSPServer/$line master
}
    echo -e "number:$count \n"
    cd -
done

执行脚本

#cat path.txt | ./push_aodp.sh

  这里对原文章略作修改:原文会在每个仓库下生成空文件,简单修改一下,只在空的仓库下生成文件,我不信邪,亲自尝试了一下,空文件不提交文件,在repo sync 时确实会报错。怀疑可能跟分支有关。初始化时没有分支,在此提交时有文件的都会在 master分支上,无文件的不能提交,同步收就会提示分支错误。

结束后,就可以正常同步代码了:

找个位置  #repo init -u  服务位置/manifest  

               #repo sync

记得检出 repo的版本。
 

android源码中没有.git文件

可以从网上找一份 dfault.xml,dfault.xml,初始化一下自己的源码,然后再按照上边的步骤做

可以参考:Gitolite + repo 搭建安卓源码开发环境_Berry的博客-CSDN博客_gitolite repo

没有验证

参考:https://blog.csdn.net/xiezhi123456/article/details/80030593 部分修改

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐