搭建android源码本地服务器
之前下载的android原码直接在上边简单修改调试,但是考虑到后边扔到服务器(本地)上多人调试时的不方便,这几天搞了一下,作为记录。参考:https://blog.csdn.net/xiezhi123456/article/details/80030593...
之前下载的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 仓库:
-
#创建 git 仓库 project_1
#mkdir project_1 && cd project_1 #git init; #touch p1.txt; #git add . #git commit –m "initial commit" #cd..
-
#创建一个 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 仓库:
-
#创建 manifest 仓库
#mkdir manifest && cd manifest #git init; #touch default.xml;
在 default.xml
加入以下内容
-
<?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>
- 然后 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 部分修改
更多推荐
所有评论(0)