Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android源碼倉庫和Repo工具使用

Android源碼倉庫和Repo工具使用

編輯:關於Android編程

前言

好久沒有雙休一個周末了,唉,閒話不多說了,不管任何時候都要多學習充實自己。ROM Porting的工作是很繁瑣的,涉及的知識點很多,這裡介紹一下ROM Porting經常聽到的名詞和Repo工具的使用。

AOSP、AOKP、CM

相信很多Android發燒友對這幾個單詞都是耳熟能詳了,這裡還是給新入門的朋友們普及一下這幾個單詞背後的含義。 AOSP是“Android Open-Source Project”的縮寫,中文名稱為Android開放源代碼項目。大家都知道Android是開源操作系統,所以Google每發布一個Android版本,都會給開源社區發放對應版本的源代碼,也就是我們所說的AOSP ROM,這可以稱得上是最為純淨的Android系統。可以用類比來讓大家更清楚一些,例如國內多數盜版的Windows系統,幾乎都是基於微軟的MSDN制作,AOSP ROM即等相當於微軟MSDN母盤的角色。 AOKP是“Android Open-Source Kang Project”,比AOSP多了一個“Kang”。在Android社區中,Kang表示這是一個被別人定制過的ROM,是一個來自民間的ROM。 CM是CyanogenMod的簡稱,Cyanogen團隊是全球最大的第三方ROM編譯團隊,覆蓋機型范圍特別廣,國內知名的ROM例如MIUI、錘子ROM都是基於CM實現的。嚴格意義上來說,CM ROM屬於AOKP的范疇。CM ROM雖然一直遵從原生Android,但只有Google官方的才算真正的AOSP。

為什麼使用Repo

上文介紹的AOSP是由許許多多有Git管理的項目組成的,例如,在Android4.2中,就包含了329個項目,每一個項目都是一個獨立的Git倉庫。這意味著,如果我們要創建一個AOSP分支來做新的feature開發,那麼就需要到每一個子項目去創建對應的分支。這顯然不能手動地到每一個子項目裡面去創建分支,必須要采用一種自動化的方式來處理。這些自動化處理工作就是由Repo工具來完成的。當然,Repo工具所負責的自動化工作不只是創建分支那麼簡單,查看分支狀態、提交代碼、更新代碼等基礎的Git操作都可以用Repo來替代完成。

Reopo

Repo工具是由一系列的Python腳本組成的,這些Python腳本通過調用Git命令來完成自己的功能。比較有意思的是,組成Repo工具的那些Python腳本本身也是一個Git倉庫,這個Git倉庫在AOSP裡面就稱為Repo倉庫,我們每次執行Repo命令的時候,Repo倉庫都會對自己進行一次更新。 上面我們討論的是Repo倉庫,但是實際上我們執行Repo命令想操作的是AOSP。這就要求Repo命令要知道AOSP都包含有哪些子項目,並且要知道這些子項目的名稱、倉庫地址是什麼。換句話說,就是Repo命令要知道AOSP所有子項目的Git倉庫元信息。因為AOSP也是不斷地進行迭代的,每一個版本所包含的子項目可能都是不一樣的。這意味著需要通過另外一個Git倉庫來管理AOSP所有的子項目的Git倉庫元信息。這個Git倉庫在AOSP裡面就稱為Manifest倉庫。 到目前為止,我們提到了三種類型的Git倉庫,分別是Repo倉庫,Manifest倉庫和AOSP子項目倉庫。Repo倉庫通過Manifest倉庫可以獲得所有AOSP子項目倉庫的元信息。有了這些元信息之後,我們就可以通過Repo倉庫裡面的Python腳本來操作AOSP的子項目。那麼,Repo倉庫和Manifest倉庫又是怎麼來的呢?答案是通過一個獨立的Repo腳本來獲取,這個Repo腳本位於AOSP的一個官方網站上,我們可以通過HTTP協議來下載。 現在,我們就通過一個圖來勾勒一下整個AOSP的Picture,它由Repo腳本、Repo倉庫、Manifest倉庫和AOSP子項目倉庫組成,如圖1所示: vcWxvqO6CjxwcmUgY2xhc3M9"brush:java;">$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo

Repo命令

repo init -u  [OPTIONS]
在當前目錄下初始化repo,會在當前目錄下生成一個.repo目錄,就像Git Project目錄的.git一樣。 -u:指定一個URL,從這個URL中取得repository的manifest文件。獲取的manifest文件放在.repo目錄中,命名為manifest.xml,這個文件的內容其實就是所有被git管理的倉庫列表。 [OPTIONS] -m:選擇獲取repository中的某一個特定的manifest文件,如果不具體指定,那麼表示為默認的manifest文件(default.xml)。 [OPTIONS] -b:指定某個manifest分支。如果不指定-b參數,那麼默認會使用master分支。
repo sync [project-list]
同步代碼,下載最新的本地工作文件,更新成功,則本地文件和repository中的代碼是一致的。可以指定需要更新的project,如果不指定任何參數,會同步Manifest文件中的所有git項目。 如果是第一次運行repo sync,則這個命令相當於git clone,會把repository中的所有內容都拷貝到本地。如果不是第一次運行repo sync,則相當於運行git remote update && git rebase original/branch
repo update [project-list]
上傳修改的代碼,如果你本地的代碼有所修改,那麼運行repo sync的時候,會提示你上傳修改的代碼,所有修改的代碼分支會上傳到Gerrit(基於web的代碼review系統)。Gerrit接收上傳的代碼,會轉換為一個個變更,從而可以讓其它人來對比並且review修改提交的代碼。
repo diff [project-list]
顯示當前Project修改的代碼和當前工作代碼之間的差異。
repo start new_branch_name [specified-project]
在指定的Project上創建一個新的分支。
repo branch
查看所有分支
repo abandon 
刪除指定分支,無論是否merged。
repo forall [project-list] -c COMMAND
對指定的Project列表或者所有Project執行COMMAND命令。
repo status
顯示Repo倉庫中每個Project的狀態。
repo download target revision
下載特定的修改版本到本地。

我的理解

由於AOSP項目由很多Git倉庫構成,如果一個一個的git clone太過於浪費時間,因此需要使用Repo工具將Git倉庫集合一口氣下載到本地來。一旦Project下載到本地後,針對單個Project,均可以直接用Git命令去操作。因為我對Git命令更熟悉一些,所以我根本不需要去死記硬背Repo除了Repo init外的其他命令,直接使用對應的Git命令即可。







  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved