標籤:

repo鏡像管理本地開發代碼

對AOSP有初步了解的都知道AOSP代碼並非以單一git倉庫管理,而是非常多的獨立git倉庫來組織,同時通過一個manifests倉庫中的manifest.xml來管理不同AOSP版本所對應的各獨立git倉庫的代碼版本。對於這麼龐大的代碼樹,Google提供了一個名為repo的python腳本來管理。在source.android.com的頁面里寫著如何使用repo下載AOSP代碼,如何使用本地鏡像來加速下載等,但是對於android固件開發人員來講,在修改本地代碼的同時,保持和upstream代碼的同步的需求還是存在的。

在給GitHub上的項目貢獻代碼時,一般我們會先fork一份代碼到自己的名下,例如fork github.com/Bilibili/ijk 代碼到自己名下github.com/yuazhen/ijkp,然後clone自己名下的代碼倉庫到本地,然後修改代碼,然後再push到自己名下的代碼倉庫里,然後再發起一個PR。對於clone到本地的代碼,我們會設置兩個remote,一個用來follow upstream,一個用來follow自己名下的倉庫。同理,在開發android固件時,也可以使用兩個remote來達到定製固件代碼的同時,跟upstream代碼也能保持同步。

由於android代碼的管理和普通的git倉庫管理有區別,但其核心仍然是藉助git來管理代碼,所以仍然可以借用上述方式來達到目的。

創建本地伺服器

首先,可以參考清華AOSP站的說明將原始代碼鏡像到本地伺服器上。在repo init時增加—mirror參數,然後再sync:

$ repo init -u https://aosp.tuna.tsinghua.edu.cn/mirror/manifest --mirror$ repo sync

即可將清華AOSP鏡像網站上的代碼下載下來。如果repo mirror時提示git-repo無法下載,需要在--mirror之前加上--repo-url=https://github.com/yuazhen/git-repo.git,不從google下載完整的repo即可。

$ repo init -u https://aosp.tuna.tsinghua.edu.cn/mirror/manifest --repo-url=https://github.com/yuazhen/git-repo.git --mirror$ repo sync

鏡像同步完成後還可以按照清華AOSP的方法將該目錄export出來便於其他客戶端訪問,可以使用--detach參數將git-daemon放在後台運行。

鏡像下來的代碼和正常下載的代碼目錄結構不太一樣,鏡像下來的代碼文件的組織結構為如下:

accessories assets brillo devicegit-repo.git kernel mirror platformproduct third-party-review.git toolchain tools trusty

然後,用repo從本地鏡像伺服器下載代碼。在客戶端上運行如下命令等待下載完成即可:

$ repo init -u git://ip.to.mirror/platform/manifest.git --repo-url=git://ip.to.mirror/git-repo.git -b android-7.1.1_r28$ repo sync

下載下來的代碼目錄結構如下:

Android.bp bionic cts devicehardware packages repo toolsMakefile bootable dalvik docslibcore pdk sdk abibootstrap.bash developers external libnativehelperplatform_testing system art builddevelopment frameworks ndk prebuiltstoolchain

代碼目錄結構和正常下載的是一樣的,但是查看.repo/manifest.xml可以看到remote節點fetch屬性的值是「..」,和正常的不一樣。如同正常下載的代碼一樣,manifest.xml中remote只有一個aosp,但是這個remote是指向本地鏡像伺服器的。

<?xml version="1.0" encoding="UTF-8"?><manifest> <remote name="aosp" fetch=".." /> <default revision="refs/tags/android-7.1.1_r28" remote="aosp" sync-j="4" /> <project path="build" name="platform/build" groups="pdk,tradefed" >

添加遠程伺服器

如果需要本地鏡像伺服器始終與遠程伺服器的代碼保持一致,則只需在本地鏡像伺服器上運行repo sync即可同步到遠程伺服器一致的代碼。而如果本地鏡像伺服器將作為本地開發用的伺服器,會保存一些定製修改,但是又要與遠程伺服器代碼保持同步,則可以參考上述設置兩個remote的方法來達到follow upstream的目的,需要做的僅僅在於在.repo/manifest.xml中增加一個remote節點,remote name區別於aosp即可(如upstream),fetch地址需要填上遠程伺服器的地址(可以在正常從遠程伺服器上下載的代碼中獲取到),通過修改default節點中的remote來使用aosp(本地鏡像伺服器)或者遠程伺服器(如upstream),然後執行repo sync。

修改.repo/manifest.xml:

<?xml version="1.0" encoding="UTF-8"?><manifest> <remote name="aosp" fetch=".." /> <remote name="upstream" fetch="https://android.googlesource.com" /> <default revision="refs/tags/android-7.1.1_r28" remote="aosp" sync-j="4" /> <project path="build" name="platform/build" groups="pdk,tradefed" >

上述仍然是與aosp即本地鏡像伺服器進行同步,而修改如下,即可與upstream即遠程伺服器進行同步。

<?xml version="1.0" encoding="UTF-8"?><manifest> <remote name="aosp" fetch=".." /> <remote name="upstream" fetch="https://android.googlesource.com" /> <default revision="refs/tags/android-7.1.1_r28" remote="upstream" sync-j="4" /> <project path="build" name="platform/build" groups="pdk,tradefed" >

雖然可以切換不同的remote進行repo sync,將兩個伺服器的代碼下載下來,但是仍然是分開(兩個不同的branch)存放的。要達到將遠程伺服器上的修改與本地的修改合併保存在本地鏡像伺服器的話,還需要在用upstream進行repo sync後,再用aosp進行repo sync,此時會提示哪個project目錄discard了幾個commit,針對這些project做merge即可:

$ sed -i s/remote=.*/remote="aosp" .repo/manifest.xml$ repo sync...frameworks/av: discarding 1 commit;$ sed -i s/remote=.*/remote="upstream" .repo/manifest.xml$ repo sync...frameworks/av: discarding 1 commit;$ cd frameowork/av$ git checkout -b master$ git pull upstream master$ git push aosp master

因為AOSP代碼sync下來後,每個project都是detached的,為了合併代碼,才需要用checkout一個branch的方式重新follow一個branch才能合併代碼。通常AOSP代碼sync時每個project都是detached from m/master,而m/master通常指向aosp/master。

推薦閱讀:

如何刷原生AOSP系統,網上搜到的多是指CM,能否直接刷AOSP,需要自己編譯嗎,還是哪裡可以下載?
極端原生粉、MD 粉是否妨礙了 Android 開放性的發展?
mac編譯aosp的配置需求?
理解Android Bitmap

TAG:AOSP | 镜像 |