레이블이 Android-SCM인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Android-SCM인 게시물을 표시합니다. 모든 게시물 표시

8/02/2014

repo 내부의 manifest.xml 구성 및 분석

1. manifest.xml 이란? 

repo를 이용하여 repo init하여 설정할 경우, .repo 구조가 생성이되면서 안에  manifest.xml이 안에 존재하는데, 이 xml 기반으로 소스를 가져온다.
이는 repo의 한 구성이며 이를 기반으로 git를 사용하기에 사용방법을 정확히 인지해야한다.


1.1 manifest.xml 기본구조

manifest.xml은 기본적으로 default.xml로 링크되어 있으며, 기본구성은 XML형태의 구조이며,
아래와 같이 XML이 구성이 되므로, 각 구조의 의미를 알아야한다.

  • manifest.xml 전체기본구조
   
 <!DOCTYPE manifest [

/*
        * ELEMENT : XML 내부의 각 element로 이런식으로 구성 <element >
        * ATTLIST : 각 ELEMENT의 속성리스트로 ELEMENT 내에 설정값 
        * REQUIRED : 필수로 들어가야 하는 값 
        * IMPLIED : 옵션이라고 생각하면 되겠음.
*/

/*
 <manifest > 로 시작한 후 아래의 element들로 구성되며 그 속성설정을 이해하자.
  세부내용은 각 ELEMENT에서 설명
*/

    <!ELEMENT manifest (notice?,
                        remote*,    
                        default?,   
                        manifest-server?,
                        remove-project*, 
                        project*,    
                        extend-project*,
                        repo-hooks?,
                        include*)> //다른 manifest.xml 포함가능하지만 .repo/local_manifests/*.xml`로 쉽게추가

    <!ELEMENT notice (#PCDATA)>

// <remote >  구성되며, 보통 Google의 AOSP와 더불어 다른 것들과 같이 구성 ATTLIST로 각 설정가능

    <!ELEMENT remote EMPTY>
    <!ATTLIST remote name       ID    #REQUIRED> //각 project의 .git/config remote 이름로 사용 (git fetch/push 가능)
    <!ATTLIST remote alias        CDATA #IMPLIED>
    <!ATTLIST remote fetch      CDATA #REQUIRED> // ./repo/projects or ./repo/project-object 안에 git로 구성됨 
    <!ATTLIST remote pushurl      CDATA #IMPLIED>   //remote "push" 가능 
    <!ATTLIST remote review      CDATA #IMPLIED>   // review 으로 Gerrit server 설정시 'repo upload' 가능 
    <!ATTLIST remote revision    CDATA #IMPLIED>   // Git 의 tag 와 branch name 

// <default >  거의 1개만 구성되며, ATTLIST 중 remote 와 revision은 각 default 값 설정

    <!ELEMENT default EMPTY> 
    <!ATTLIST default remote      IDREF #IMPLIED> // 상위 remote element 의 name 중 1개 적용(보통 Google)
    <!ATTLIST default revision    CDATA #IMPLIED> // Git branch/tag , 이 값은 모든 project elelement의 기본값설정
    <!ATTLIST default dest-branch CDATA #IMPLIED> // Name of a Git branch (e.g. `master`), 설정하지 않으면, revision과 동일주소
    <!ATTLIST default upstream    CDATA #IMPLIED>
    <!ATTLIST default sync-j      CDATA #IMPLIED> // 보통 병렬작업을 하기 위해 Job 갯수 
    <!ATTLIST default sync-c      CDATA #IMPLIED> // 받은 Git Branch Sync 설정 true  (revision 속성)
    <!ATTLIST default sync-s      CDATA #IMPLIED> // Sub Project Sync 설정 true
    <!ATTLIST default sync-tags   CDATA #IMPLIED> // 받은 Git Branch Sync 설정 false (revision 속성)

    <!ELEMENT manifest-server EMPTY>
    <!ATTLIST manifest-server url CDATA #REQUIRED>

// 상위의 remote 안에 존재하는 모든 project git을 download 후 < project >  구성되며, ATTLIST 설정가능  

    <!ELEMENT project (annotation*,   
                       project*,                 
                       copyfile*,
                       linkfile*)>
    <!ATTLIST project name        CDATA #REQUIRED> // 실제 상위 remote 중  Git 의 project name이며 unique 해야함                                                         
    <!ATTLIST project path        CDATA #IMPLIED>  // 상위 Git Project을 download 하면 실제 Local PATH 
    <!ATTLIST project remote     IDREF #IMPLIED> // 상위 remote element 의 name에 적용
    <!ATTLIST project revision    CDATA #IMPLIED> // 설정이 없다면 상위 default element 값
    <!ATTLIST project dest-branch  CDATA #IMPLIED>
    <!ATTLIST project groups       CDATA #IMPLIED> // Project가 속한 그룹 , 설정을 안하면, name과 동일
    <!ATTLIST project sync-c       CDATA #IMPLIED> // Number of parallel jobs (git sync)
    <!ATTLIST project sync-s       CDATA #IMPLIED> // Sub Project Sync 설정 true
    <!ATTLIST default sync-tags    CDATA #IMPLIED>
    <!ATTLIST project upstream     CDATA #IMPLIED>
    <!ATTLIST project clone-depth  CDATA #IMPLIED>
    <!ATTLIST project force-path   CDATA #IMPLIED>

/*
< project > 의 Sub 작업으로 동작하며 각 Git Project를 세부 Control 작업 
       < annotation >     
       < copyfile >       파일복사
       < linkfile >       링크파일생성
       < extend-project >     확장
*/

      <!ELEMENT annotation EMPTY> 
      <!ATTLIST annotation name  CDATA #REQUIRED>
      <!ATTLIST annotation value CDATA #REQUIRED>
      <!ATTLIST annotation keep  CDATA "true">

      <!ELEMENT copyfile EMPTY> 
      <!ATTLIST copyfile src  CDATA #REQUIRED>
      <!ATTLIST copyfile dest CDATA #REQUIRED>

      <!ELEMENT linkfile EMPTY>  
      <!ATTLIST linkfile src CDATA #REQUIRED>
      <!ATTLIST linkfile dest CDATA #REQUIRED>

      <!ELEMENT extend-project EMPTY>
      <!ATTLIST extend-project name CDATA #REQUIRED>
      <!ATTLIST extend-project path CDATA #IMPLIED>
      <!ATTLIST extend-project groups CDATA #IMPLIED>
      <!ATTLIST extend-project revision CDATA #IMPLIED>

/*
       ELEMENT-project 제거기능으로 
        - 이름이 중복될때 사용될경우 필요 할 것 같음
        - 불필요한 project 제거할 것 같음 (remote에서 전체 project를 받기때문에 필요 없는 것은제거)
*/

    <!ELEMENT remove-project EMPTY> 
    <!ATTLIST remove-project name  CDATA #REQUIRED>

    <!ELEMENT repo-hooks EMPTY>
    <!ATTLIST repo-hooks in-project CDATA #REQUIRED>
    <!ATTLIST repo-hooks enabled-list CDATA #REQUIRED>

/* 
  다른 manifest.xml을 include가능하여 확장기능 
  이외 localmanifest 도 존재
 */ 

    <!ELEMENT include EMPTY> 
    <!ATTLIST include name CDATA #REQUIRED>
  ]>


  • manifest.xml 에 local_manifests.xml 추가방법
`$TOP_DIR/.repo/local_manifests/*.xml`  추가적으로 element project 와 remote를 확장하기 위해서 local_manifest.xml를 별도로 확장

// element remote 와 project 관련 사항만 가능한것 같음 (remove-project도 확인) 
$ ls .repo/manifests  //다양한 manifests.xml로 구성  
....xml

$ ls .repo/manifests.xml   //manifests.xml (MAIN) include 사용하여 .repo/manifests 중 선택가능 

$ ls .repo/local_manifests
local_manifest.xml         // 2nd 추가됨 (알파벳 순서)  
another_local_manifest.xml // 1st 추가됨 (알파벳 순서)  

$ cat .repo/local_manifests/local_manifest.xml // local_manifest.xml 예제 (remote or project를 추가) 
  <?xml version="1.0" encoding="UTF-8"?>
  <manifest>
    <project path="manifest"
             name="tools/manifest" />
    <project path="platform-manifest"
             name="platform/manifest" />
  </manifest>

더이상 $TOP_DIR/.repo/local_manifest.xml 는 미지원한다고 한다. 

        name   : remote의  unique한 ID설정, 다른곳에서 이 ID를 참조하여 적용
        fetch     : source를  받아올 주소 (git fetch )
        review   : review site로 이전 odroid version에는 존재했음. (repo upload 가능)
        revision  : git branch/tag 의 이름  (e.g. master , 'refs/heads/master')
        push     : git push 

     일단 Git 기반으로 하는 것이며, ./repo 안에 download를 하면, name으로 검색가능 

        remote:   이전에 선언된 remote name 중 설정 (기본값 설정)
        revision:  git branch or tag로 element project의 revision의 기본설정값 
        syn-j:  repo sync시 동시에 여러 작업있는 갯수 설정.
        syn-c:  true 이면, 오직 전체를 sync하는 것이 아니라, git branch만 sync 한다고한다.
                 효율적면에서 사용하는것 같다.
        syn-s: true이면 sub-project와 sync를 한다고 한다.

   *element default는 project의 attribute가 remote가 선언이 되지 않았다면, default사용 

  • element project
  • path:  repo sync후 Local의 PATH 구성 
    name:  unique한 이름, remote의 fetch의 Git repository name 
    remote: remote의 설정하며, 만약없다면, element default 정보사용.
    group: group의 list를 말하며, 선언이 되어 있지 않다면 "notdefault" 설정
        모든 project 선언시는  "all"  각 개별 project group 선택시에는 "pdk" or "pdk,linux"
        repo sync -g로 sync 여부를 결정가능하다.
    revision:  sync가 된후, git의 branch 이름,만약없다면, element default 정보사용.
    기본적으로 repo로 download되어 있으면, local path 기반    


Google의 Repo 관련 세부 Manual 
  https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md


  • Google의 remote 기본구조
기본 remote Google의 AOSP 는 https://android.googlesource.com 구성은 다음과 같이 구성이 되어지며, 각 슬래시로 구분되어진다.
이는 repo sync를 할 경우 ,  ./repo/projects or ./repo/project-object 로 가는데 거의 ./repo/projects 로 안에 존재한다.

일반 Github일 경우는 그냥 project name으로만 찾으면된다. 

{remote_fetch}/${project_name}.git 

아래의 설정이 특히해서 링크 
  https://stackoverflow.com/questions/18251358/repo-manifest-xml-what-does-the-fetch-mean

ODROID manifest.xml 분석


7/31/2014

repo 기본 사용법

1. repo란? 

Android에서 Build를 전체하고자 한다면, PDK(Plaform Development Kit) 알아야 할 기본 Tool이 repo이다.
repo는 python program으로 XML의 기반의 manifest를 이용하여 git project를 묶어서 하나의 project로 관리하고 있다.

repo를 정확히 이해하기 위해서 다음과 같은사항을 알아두자.

  1. manifest.xml의 규칙
  2. git 명령

1.1 Repo 설치 및 설정

처음 repo 가 설치가 되어있지 않았다면, 반드시 download하고 환경설정해야 사용하기가 편한다.
그리고 더불어 python은 설치가 되어야 있어야 한다.
  • repo download 

$ sudo apt-get install curl
$ mkdir ~/bin
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
or
$ curl https://android.git.kernel.org/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

  • repo 환경설정 

$ vi ~/.bashrc or vi ~/.bash_profile or vi ~/.profile  // 가능하면 .profile or .bash_profile 
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

or
$ export PATH=~/bin:${PATH}

  • repo 구성 및 version 확인
repo의 python script를 보고 싶다면, 간단히 vi ~/bin/repo 로 확인.

$ vi ~/bin/repo
....
VERSION = (1, 22)
....

기본설치가 되었다면, repo는 내부적으로 git을 이용하기 때문에 이제 git 설정을 해야한다.

  • Google의 repo 설치 및 Git 기본설정사항
구글 매뉴얼이 볼때마다 업그레이드 되므로, 나중에 이것을 보면 될 것 같다.
  http://source.android.com/source/downloading.html


1.2 Git 기본개념

repo는 위에서 설명했듯이 여러 git를 관리해주는 python script로 기본적으로 정확한 동작을 이해하려면 git의 기본명령을 알아야 하겠다.

GIT의 기본개념 
  https://ahyuo79.blogspot.com/2014/07/git-for-window_20.html

GIT의 기본명령어 
   https://ahyuo79.blogspot.com/2014/07/git.html?zx=2a45dd959990440a

  • Pro-Git 책으로 Git에 관련된 세부사항 
Git에 대해 세부적으로 좀 더 알고 싶다면, 각 사용법을 보자.
  https://git-scm.com/book/en/v2
  https://git-scm.com/docs
  https://git-scm.com/docs/git-fetch


1.3 Gerrit (Git Review) 개념

web-based code를 GIT를 사용하는 system이라고 하며, Google Web Toolkit 이라고 한다. 
GIT의  review 하기위한 tool이라고 하며, Gerrit/Git Review는 GIT의 사용을 집중화시켜준다고 하는데,정확한 용도파악 되지 않았다.

아래의 개념을 보면, remote repository에게 update가 가능한걸로 보여지면, 이것을 어떻게 사용하는지는 정확히 파악을 못하겠다.
GIT의 Remote Repository를  Web base 로 보여주고 이를 관리하는 것으로 보이며, 일단 넘어가자.
Gerrit은 추후 다시 보강 

Github에서 .gitreview 사용법예제 

Git review 사용시 필요한 Package
  http://www.mediawiki.org/wiki/Gerrit/git-review


1.4 Repo 이용한 개발방법 

아래의 기본설명은 repo와 git를 이용한 소스관리방법으로 android에서 소개한 자료이며,
만약 download (git pull) 만 진행을 할 것이면 이부분 까지는 이해 할 필요는 없을 것 같다.



Command Description
repo init Initializes a new client.
repo sync Syncs client to repositories.
repo start Starts a new branch.
repo status Shows status of current branch.
repo upload Uploads changes to the review server.
git add Stages files.
git commit Commits staged files.
git branch Shows current branches.
git branch [branch] Creates new topic branch.
git checkout [branch] Switches HEAD to specified branch
git merge [branch] Merges [branch] into current branch.
git diff Shows diff of unstaged changes.
git diff --cached Shows diff of staged changes.
git log Shows history of current branch.
git log m/[codeline].. Shows commits that are not pushed.

구글메뉴얼 설치 및 개발

구글메뉴얼 repo 사용법
  https://source.android.com/setup/develop/repo


2. Repo의 기본활용 


2.1 Repo 사용방법

Repo프로젝트를 만들기 위해서는 manifest.xml이 필요하다.
하지만, 기존에 있는 존재하던 project의 manifest.xml 있다면, 그 위치로 설정을 하고,
초기화를 진행을 한다.

먼저 사용법을 잘 모를 경우, repo --help or repo init --help 치면 자세한 사용법이
나오며, 각 명령어 마다 --help를 이용하면 된다.

  • repo init     
처음 반드시 실행하여 설정하며, 설정시 .repo 디렉토리 안에 모든 기본구성파일 설정된다.
XML for manifest

repo init -u url [options] 
repo init --help 확인가능

Manifest options Description
-u URL, --manifest-url=URL manifest repository location
-m NAME.xml, --manifest-name=NAME.xml initial manifest file 다른 manifest.xml 지정가능 ( 기본: default.xml)
-b REVISION, --manifest-branch=REVISION manifest branch or revision
  • repo sync
repo init을 한 후 , repo 파일들이 생성된 후 , project 파일들을 받기위해서 각 Server sync 작업을 하는 명령어
처음 실행시에는 git clone과 동일하고,
두번째 실행시에는 아래의 git 명령처럼 remote git repository가 update한 상태를 적용 

$ git remote update
$ git rebase origin/BRANCH

BRANCH 는 현재 checkout 된 local branch 이며 local branch가 remote branch를 tracking 하고 있지 않을 경우 sync 가 이루어지지 않는다.
repo sync 중 git rebase command 에서 conflict 가 발생할 경우 개별적으로 conflict 를 해결하고
git rebase --continue 명령을 실행해야 한다

옵션
-j 작업속도, 동시에 작업을 진행을 한다 (default 4)

  • repo start
소스는 branch와 tag를 만들게 되는데, 이때, 특정 branch 에서 시작할 수 있게 도와준다.

  • repo forall 
소스를 다운받기 위해서 사용한다고 하는데, 정확한 사용용도는 아직파악 못함.
         
repo forall -c git reset --hard 4412_vx.x
     
-c    command도 그 뒤는 argument이다,
       위 실행은 특정 tag를 다운받기 위해서 사용이 되어진다고 한다.

repo download 명령도 있어, 아직 정확한 이해를 못했다.

Android Opensource
  https://android.googlesource.com/platform/
  https://android.googlesource.com/?format=HTML

Repo 사용법
  https://source.android.com/source/using-repo.html
  http://www.dreamy.pe.kr/zbxe/CodeClip/163418

Android Download
  http://source.android.com/source/downloading.html

Android Repo 설정 및 사용법888
  https://source.android.com/setup/build/downloading
  https://source.android.com/setup/develop/index.html


2.2 Repo 사용법 및 구조 

Odroid기반으로 Android 관련소스를 받기 위해서 아래와 같이 설정을 해보며 분석해본다.

// Github 의 GIT 주소 설정한 후 branch 설정하면, 해당 default.xml 로 진행  
$ repo init -u https://github.com/hardkernel/android.git -b 4412_4.4.4_master

//상위에서 설정된 manifest.xml 기반으로 remote 와 project 기반으로 download  
$ repo sync

//일반적으로 repo sync까지 만 사용하며, 이는 별도의 branch 를 생성하기 위해서 실행  
$ repo start 4412_4.4.4_master --all

2.3 repo init 분석  

  • ODROID의 default.xml 과 비교하면서 분석 (repo init 설정) 
아래의 default.xml 분석
<?xml version="1.0" encoding="UTF-8"?>
<manifest>

//구글에서 제공하는 remote AOSP로 다양한 project들이 존재하며, GIT fetch 가능
  <remote  name="aosp"
           fetch="https://android.googlesource.com" />

//Hard Kernel에서 제공하는 remote로 들이 존재하며, Git fetch/push 가능
  <remote  name="origin"
           fetch="https://github.com/codewalkerster"
           push="https://github.com/codewalkerster" />

//CyanogenMod로 Android Community 다양한 Android Project 제공 fetch/review 제공
  <remote  name="github"
           fetch="https://github.com/CyanogenMod"
           review="review.cyanogenmod.org" />

/*
      - 기본 remote를 aosp로 설정 
      - 기본 project들의 revision을  refs/tags/android-4.4.2_r2 설정적용 
      - 아래의 project들은 이 기본 값으로 설정됨
*/
  <default revision="refs/tags/android-4.4.2_r2"
           remote="aosp"
           sync-j="4" />

/*
    상위 remote fetch 내부의  Git project (*.git) 모두 download 함 
    아래의 project name과 동일한 것들을 이제 실제 project path와 함께 적용 (project name은 반드시 unique) 
    revision을 설정으로 추가 tag or branch를 설정가능하며 기본은 상위 default 값에 정의  
    
    1. Google의 경우 Git의 Project Name을 보면 platform/xx/xx  이런식으로 관리를 하므로 쉽게 구분이 가능. 
    2. CyanogenMod 의 경우 Github 이다보니 Google 같은 구성이 되지 않으며,   (e.g android_bionic )
    3. Hardkernel 의 경우 Github 이다보니  동일하게구성  (e.g android_hardware_amlogic_wifi) 
*/

  <project path="build" name="android_build" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" >
    <copyfile src="core/root.mk" dest="Makefile" />
  </project>
  <project path="abi/cpp" name="platform/abi/cpp" groups="pdk" />
  <project path="art" name="platform/art" />
  <project path="bionic" name="android_bionic" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="bootable/bootloader/legacy" name="platform/bootable/bootloader/legacy" />
  <project path="bootable/diskinstaller" name="platform/bootable/diskinstaller" />
  <project path="bootable/recovery" name="platform/bootable/recovery" groups="pdk" />
  <project path="cts" name="platform/cts" groups="cts" />
  <project path="dalvik" name="platform/dalvik" />
  <project path="developers/build" name="platform/developers/build" />
  <project path="developers/demos" name="platform/developers/demos" />
  <project path="developers/docs" name="platform/developers/docs" />
  <project path="developers/samples/android" name="platform/developers/samples/android" />
  <project path="development" name="platform/development" />
  <project path="device/asus/deb" name="device/asus/deb" groups="device,flo" />
  <project path="device/asus/flo" name="device/asus/flo" groups="device,flo" />
  <project path="device/asus/flo-kernel" name="device/asus/flo-kernel" groups="device,flo" />
  <project path="device/asus/grouper" name="device/asus/grouper" groups="device,grouper" />
  <project path="device/asus/tilapia" name="device/asus/tilapia" groups="device,grouper" />
  <project path="device/common" name="device/common" />
  <project path="device/generic/armv7-a-neon" name="device/generic/armv7-a-neon" groups="pdk" />
  <project path="device/generic/common" name="device/generic/common" groups="pdk" />
  <project path="device/generic/goldfish" name="device/generic/goldfish" groups="pdk" />
  <project path="device/generic/mips" name="device/generic/mips" groups="pdk" />
  <project path="device/generic/mini-emulator-armv7-a-neon" name="device/generic/mini-emulator-armv7-a-neon" groups="pdk" />
  <project path="device/generic/mini-emulator-mips" name="device/generic/mini-emulator-mips" groups="pdk" />
  <project path="device/generic/mini-emulator-x86" name="device/generic/mini-emulator-x86" groups="pdk" />
  <project path="device/generic/x86" name="device/generic/x86" groups="pdk" />
  <project path="device/google/accessory/arduino" name="device/google/accessory/arduino" groups="device" />
  <project path="device/google/accessory/demokit" name="device/google/accessory/demokit" groups="device" />
  <project path="device/lge/hammerhead" name="device/lge/hammerhead" groups="device,hammerhead" />
  <project path="device/lge/hammerhead-kernel" name="device/lge/hammerhead-kernel" groups="device,hammerhead" />
  <project path="device/lge/mako" name="device/lge/mako" groups="device,mako" />
  <project path="device/lge/mako-kernel" name="device/lge/mako-kernel" groups="device,mako" />
  <project path="device/sample" name="device/sample" groups="pdk" />
  <project path="device/samsung/manta" name="device/samsung/manta" groups="device,manta" />
  <project path="device/hardkernel/odroidu" name="android_device_hardkernel_odroidu" remote="origin" revision="refs/heads/odroid_4412_master" groups="device" />
  <project path="device/hardkernel/odroidx" name="android_device_hardkernel_odroidx" remote="origin" revision="refs/heads/odroid_4412_master" groups="device" />
  <project path="device/hardkernel/odroidx2" name="android_device_hardkernel_odroidx2" remote="origin" revision="refs/heads/odroid_4412_master" groups="device" />
  <project path="device/hardkernel/proprietary" name="android_device_hardkernel_proprietary" remote="origin" revision="refs/heads/odroid_4412_master" groups="device" >
    <copyfile src="build_android.sh" dest="build_android.sh" />
  </project>
  <project path="docs/source.android.com" name="platform/docs/source.android.com" />
  <project path="external/aac" name="platform/external/aac" groups="pdk" />
  <project path="external/android-clat" name="platform/external/android-clat" />
  <project path="external/android-mock" name="platform/external/android-mock" />
  <project path="external/ant-glob" name="platform/external/ant-glob" />
  <project path="external/antlr" name="platform/external/antlr" />
  <project path="external/apache-harmony" name="platform/external/apache-harmony" />
  <project path="external/apache-http" name="platform/external/apache-http" />
  <project path="external/apache-qp" name="platform/external/apache-qp" />
  <project path="external/apache-xml" name="platform/external/apache-xml" />
  <project path="external/arduino" name="platform/external/arduino" />
  <project path="external/bison" name="platform/external/bison" groups="pdk" />
  <project path="external/blktrace" name="platform/external/blktrace" />
  <project path="external/bluetooth/bluedroid" name="platform/external/bluetooth/bluedroid" groups="pdk" />
  <project path="external/bouncycastle" name="platform/external/bouncycastle" />
  <project path="external/bsdiff" name="platform/external/bsdiff" groups="pdk" />
  <project path="external/bzip2" name="platform/external/bzip2" groups="pdk" />
  <project path="external/busybox" name="android_external_busybox" remote="github" revision="refs/heads/stable/cm-11.0" />
  <project path="external/ceres-solver" name="platform/external/ceres-solver" />
  <project path="external/checkpolicy" name="platform/external/checkpolicy" groups="pdk" />
  <project path="external/chromium" name="platform/external/chromium" />
  <project path="external/chromium-libpac" name="platform/external/chromium-libpac" />
  <project path="external/chromium-trace" name="platform/external/chromium-trace" groups="pdk" />
  <project path="external/chromium_org" name="platform/external/chromium_org" />
  <project path="external/chromium_org/sdch/open-vcdiff" name="platform/external/chromium_org/sdch/open-vcdiff" />
  <project path="external/chromium_org/testing/gtest" name="platform/external/chromium_org/testing/gtest" />
  <project path="external/chromium_org/third_party/WebKit" name="platform/external/chromium_org/third_party/WebKit" />
  <project path="external/chromium_org/third_party/angle_dx11" name="platform/external/chromium_org/third_party/angle_dx11" />
  <project path="external/chromium_org/third_party/eyesfree/src/android/java/src/com/googlecode/eyesfree/braille" name="platform/external/chromium_org/third_party/eyesfree/src/android/java/src/com/googlecode/eyesfree/braille" />
  <project path="external/chromium_org/third_party/freetype" name="platform/external/chromium_org/third_party/freetype" />
  <project path="external/chromium_org/third_party/icu" name="platform/external/chromium_org/third_party/icu" />
  <project path="external/chromium_org/third_party/leveldatabase/src" name="platform/external/chromium_org/third_party/leveldatabase/src" />
  <project path="external/chromium_org/third_party/libjingle/source/talk" name="platform/external/chromium_org/third_party/libjingle/source/talk" />
  <project path="external/chromium_org/third_party/libphonenumber/src/phonenumbers" name="platform/external/chromium_org/third_party/libphonenumber/src/phonenumbers" />
  <project path="external/chromium_org/third_party/libphonenumber/src/resources" name="platform/external/chromium_org/third_party/libphonenumber/src/resources" />
  <project path="external/chromium_org/third_party/mesa/src" name="platform/external/chromium_org/third_party/mesa/src" />
  <project path="external/chromium_org/third_party/openssl" name="platform/external/chromium_org/third_party/openssl" />
  <project path="external/chromium_org/third_party/opus/src" name="platform/external/chromium_org/third_party/opus/src" />
  <project path="external/chromium_org/third_party/ots" name="platform/external/chromium_org/third_party/ots" />
  <project path="external/chromium_org/third_party/skia/gyp" name="platform/external/chromium_org/third_party/skia/gyp" />
  <project path="external/chromium_org/third_party/skia/include" name="platform/external/chromium_org/third_party/skia/include" />
  <project path="external/chromium_org/third_party/skia/src" name="platform/external/chromium_org/third_party/skia/src" />
  <project path="external/chromium_org/third_party/smhasher/src" name="platform/external/chromium_org/third_party/smhasher/src" />
  <project path="external/chromium_org/third_party/yasm/source/patched-yasm" name="platform/external/chromium_org/third_party/yasm/source/patched-yasm" />
  <project path="external/chromium_org/tools/grit" name="platform/external/chromium_org/tools/grit" />
  <project path="external/chromium_org/tools/gyp" name="platform/external/chromium_org/tools/gyp" />
  <project path="external/chromium_org/v8" name="platform/external/chromium_org/v8" />
  <project path="external/clang" name="platform/external/clang" groups="pdk" />
  <project path="external/compiler-rt" name="platform/external/compiler-rt" groups="pdk" />
  <project path="external/dexmaker" name="platform/external/dexmaker" />
  <project path="external/dhcpcd" name="platform/external/dhcpcd" />
  <project path="external/dnsmasq" name="platform/external/dnsmasq" groups="pdk" />
  <project path="external/doclava" name="platform/external/doclava" />
  <project path="external/dropbear" name="platform/external/dropbear" />
  <project path="external/droiddriver" name="platform/external/droiddriver" />
  <project path="external/e2fsprogs" name="android_external_e2fsprogs" groups="pdk" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/easymock" name="platform/external/easymock" />
  <project path="external/eclipse-basebuilder" name="platform/external/eclipse-basebuilder" />
  <project path="external/eclipse-windowbuilder" name="platform/external/eclipse-windowbuilder" />
  <project path="external/eigen" name="platform/external/eigen" />
  <project path="external/elfutils" name="platform/external/elfutils" />
  <project path="external/embunit" name="platform/external/embunit" />
  <project path="external/emma" name="platform/external/emma" />
  <project path="external/esd" name="platform/external/esd" />
  <project path="external/exfat" name="android_external_exfat" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/expat" name="platform/external/expat" groups="pdk" />
  <project path="external/eyes-free" name="platform/external/eyes-free" />
  <project path="external/fdlibm" name="platform/external/fdlibm" />
  <project path="external/flac" name="platform/external/flac" groups="pdk" />
  <project path="external/freetype" name="platform/external/freetype" groups="pdk" />
  <project path="external/fsck_msdos" name="android_external_fsck_msdos" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/fuse" name="android_external_fuse" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/ganymed-ssh2" name="platform/external/ganymed-ssh2" />
  <project path="external/gcc-demangle" name="platform/external/gcc-demangle" groups="pdk" />
  <project path="external/genext2fs" name="platform/external/genext2fs" />
  <project path="external/giflib" name="platform/external/giflib" />
  <project path="external/google-diff-match-patch" name="platform/external/google-diff-match-patch" />
  <project path="external/grub" name="platform/external/grub" />
  <project path="external/gtest" name="platform/external/gtest" groups="pdk" />
  <project path="external/guava" name="platform/external/guava" />
  <project path="external/hamcrest" name="platform/external/hamcrest" />
  <project path="external/harfbuzz" name="platform/external/harfbuzz" />
  <project path="external/harfbuzz_ng" name="platform/external/harfbuzz_ng" />
  <project path="external/hyphenation" name="platform/external/hyphenation" />
  <project path="external/icu4c" name="platform/external/icu4c" groups="pdk" />
  <project path="external/iproute2" name="platform/external/iproute2" groups="pdk" />
  <project path="external/ipsec-tools" name="platform/external/ipsec-tools" />
  <project path="external/iptables" name="platform/external/iptables" />
  <project path="external/iputils" name="platform/external/iputils" />
  <project path="external/jack" name="platform/external/jack" />
  <project path="external/javasqlite" name="platform/external/javasqlite" />
  <project path="external/javassist" name="platform/external/javassist" />
  <project path="external/jdiff" name="platform/external/jdiff" />
  <project path="external/jhead" name="platform/external/jhead" groups="pdk" />
  <project path="external/jmdns" name="platform/external/jmdns" />
  <project path="external/jmonkeyengine" name="platform/external/jmonkeyengine" />
  <project path="external/jpeg" name="platform/external/jpeg" groups="pdk" />
  <project path="external/jsilver" name="platform/external/jsilver" />
  <project path="external/jsr305" name="platform/external/jsr305" />
  <project path="external/junit" name="platform/external/junit" />
  <project path="external/kernel-headers" name="platform/external/kernel-headers" />
  <project path="external/koush/Superuser" name="Superuser" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="external/koush/Widgets" name="Widgets" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/libcap-ng" name="platform/external/libcap-ng" />
  <project path="external/libffi" name="platform/external/libffi" />
  <project path="external/libgsm" name="platform/external/libgsm" groups="pdk" />
  <project path="external/liblzf" name="platform/external/liblzf" groups="pdk" />
  <project path="external/libmtp" name="platform/external/libmtp" />
  <project path="external/libncurses" name="android_external_libncurses" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/libnfc-nci" name="platform/external/libnfc-nci" groups="pdk" />
  <project path="external/libnfc-nxp" name="platform/external/libnfc-nxp" groups="pdk" />
  <project path="external/libnl-headers" name="platform/external/libnl-headers" groups="pdk" />
  <project path="external/libogg" name="platform/external/libogg" />
  <project path="external/libpcap" name="platform/external/libpcap" />
  <project path="external/libphonenumber" name="platform/external/libphonenumber" />
  <project path="external/libpng" name="platform/external/libpng" groups="pdk" />
  <project path="external/libppp" name="platform/external/libppp" />
  <project path="external/libselinux" name="platform/external/libselinux" groups="pdk" />
  <project path="external/libsepol" name="platform/external/libsepol" groups="pdk" />
  <project path="external/libusb" name="platform/external/libusb" />
  <project path="external/libusb-compat" name="platform/external/libusb-compat" />
  <project path="external/libvorbis" name="platform/external/libvorbis" />
  <project path="external/libvpx" name="platform/external/libvpx" groups="pdk" />
  <project path="external/libxml2" name="platform/external/libxml2" />
  <project path="external/libxslt" name="platform/external/libxslt" />
  <project path="external/libyuv" name="platform/external/libyuv" groups="libyuv" />
  <project path="external/linux-tools-perf" name="platform/external/linux-tools-perf" />
  <project path="external/littlemock" name="platform/external/littlemock" />
  <project path="external/llvm" name="platform/external/llvm" groups="pdk" />
  <project path="external/lzma" name="platform/external/lzma" />
  <project path="external/marisa-trie" name="platform/external/marisa-trie" />
  <project path="external/markdown" name="platform/external/markdown" />
  <project path="external/mdnsresponder" name="platform/external/mdnsresponder" groups="pdk" />
  <project path="external/mesa3d" name="platform/external/mesa3d" />
  <project path="external/mksh" name="platform/external/mksh" groups="pdk" />
  <project path="external/mockito" name="platform/external/mockito" />
  <project path="external/mockwebserver" name="platform/external/mockwebserver" />
  <project path="external/mp4parser" name="platform/external/mp4parser" />
  <project path="external/mtpd" name="platform/external/mtpd" />
  <project path="external/naver-fonts" name="platform/external/naver-fonts" />
  <project path="external/netcat" name="platform/external/netcat" />
  <project path="external/netperf" name="platform/external/netperf" />
  <project path="external/neven" name="platform/external/neven" />
  <project path="external/nist-pkits" name="platform/external/nist-pkits" />
  <project path="external/nist-sip" name="platform/external/nist-sip" />
  <project path="external/noto-fonts" name="platform/external/noto-fonts" />
  <project path="external/ntfs-3g" name="android_external_ntfs-3g" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/oauth" name="platform/external/oauth" />
  <project path="external/objenesis" name="platform/external/objenesis" />
  <project path="external/okhttp" name="platform/external/okhttp" />
  <project path="external/open-vcdiff" name="platform/external/open-vcdiff" />
  <project path="external/opencv" name="platform/external/opencv" />
  <project path="external/openfst" name="platform/external/openfst" />
  <project path="external/openssh" name="platform/external/openssh" />
  <project path="external/openssl" name="platform/external/openssl" groups="pdk" />
  <project path="external/oprofile" name="platform/external/oprofile" />
  <project path="external/pixman" name="platform/external/pixman" />
  <project path="external/ppp" name="platform/external/ppp" />
  <project path="external/proguard" name="platform/external/proguard" groups="pdk-java" />
  <project path="external/protobuf" name="platform/external/protobuf" groups="pdk" />
  <project path="external/qemu" name="platform/external/qemu" />
  <project path="external/qemu-pc-bios" name="platform/external/qemu-pc-bios" />
  <project path="external/regex-re2" name="platform/external/regex-re2" />
  <project path="external/replicaisland" name="platform/external/replicaisland" />
  <project path="external/robolectric" name="platform/external/robolectric" />
  <project path="external/safe-iop" name="platform/external/safe-iop" groups="pdk" />
  <project path="external/scrypt" name="platform/external/scrypt" groups="pdk" />
  <project path="external/sepolicy" name="platform/external/sepolicy" groups="pdk" />
  <project path="external/sfntly" name="platform/external/sfntly" />
  <project path="external/sil-fonts" name="platform/external/sil-fonts" />
  <project path="external/skia" name="platform/external/skia" />
  <project path="external/smack" name="platform/external/smack" />
  <project path="external/smali" name="platform/external/smali" />
  <project path="external/sonivox" name="platform/external/sonivox" groups="pdk" />
  <project path="external/speex" name="platform/external/speex" groups="pdk" />
  <project path="external/sqlite" name="platform/external/sqlite" groups="pdk" />
  <project path="external/srec" name="platform/external/srec" />
  <project path="external/srtp" name="platform/external/srtp" />
  <project path="external/stlport" name="platform/external/stlport" groups="pdk" />
  <project path="external/strace" name="platform/external/strace" />
  <project path="external/stressapptest" name="platform/external/stressapptest" />
  <project path="external/svox" name="platform/external/svox" />
  <project path="external/tagsoup" name="platform/external/tagsoup" />
  <project path="external/tcpdump" name="platform/external/tcpdump" />
  <project path="external/timezonepicker-support" name="platform/external/timezonepicker-support" />
  <project path="external/tinyalsa" name="platform/external/tinyalsa" groups="pdk" />
  <project path="external/tinycompress" name="platform/external/tinycompress" groups="pdk" />
  <project path="external/tinyxml" name="platform/external/tinyxml" groups="pdk" />
  <project path="external/tinyxml2" name="platform/external/tinyxml2" groups="pdk" />
  <project path="external/tremolo" name="platform/external/tremolo" groups="pdk" />
  <project path="external/v8" name="platform/external/v8" />
  <project path="external/valgrind" name="platform/external/valgrind" groups="pdk" />
  <project path="external/vim" name="android_external_vim" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/webp" name="platform/external/webp" />
  <project path="external/webrtc" name="platform/external/webrtc" groups="pdk" />
  <project path="external/wpa_supplicant_8" name="android_external_wpa_supplicant_8" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="external/xmlwriter" name="platform/external/xmlwriter" />
  <project path="external/xmp_toolkit" name="platform/external/xmp_toolkit" />
  <project path="external/yaffs2" name="platform/external/yaffs2" groups="pdk" />
  <project path="external/zlib" name="platform/external/zlib" groups="pdk" />
  <project path="external/zxing" name="platform/external/zxing" />
  <project path="frameworks/av" name="android_frameworks_av" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="frameworks/base" name="android_frameworks_base" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="frameworks/compile/libbcc" name="platform/frameworks/compile/libbcc" groups="pdk" />
  <project path="frameworks/compile/mclinker" name="platform/frameworks/compile/mclinker" groups="pdk" />
  <project path="frameworks/compile/slang" name="platform/frameworks/compile/slang" groups="pdk" />
  <project path="frameworks/ex" name="platform/frameworks/ex" />
  <project path="frameworks/mff" name="platform/frameworks/mff" />
  <project path="frameworks/ml" name="platform/frameworks/ml" />
  <project path="frameworks/native" name="android_frameworks_native" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="frameworks/opt/calendar" name="platform/frameworks/opt/calendar" />
  <project path="frameworks/opt/carddav" name="platform/frameworks/opt/carddav" />
  <project path="frameworks/opt/colorpicker" name="platform/frameworks/opt/colorpicker" />
  <project path="frameworks/opt/datetimepicker" name="platform/frameworks/opt/datetimepicker" />
  <project path="frameworks/opt/emoji" name="platform/frameworks/opt/emoji" />
  <project path="frameworks/opt/inputmethodcommon" name="platform/frameworks/opt/inputmethodcommon" />
  <project path="frameworks/opt/mailcommon" name="platform/frameworks/opt/mailcommon" />
  <project path="frameworks/opt/mms" name="platform/frameworks/opt/mms" />
  <project path="frameworks/opt/net/voip" name="platform/frameworks/opt/net/voip" />
  <project path="frameworks/opt/photoviewer" name="platform/frameworks/opt/photoviewer" />
  <project path="frameworks/opt/timezonepicker" name="platform/frameworks/opt/timezonepicker" />
  <project path="frameworks/opt/telephony" name="platform/frameworks/opt/telephony" groups="pdk" />
  <project path="frameworks/opt/vcard" name="platform/frameworks/opt/vcard" />
  <project path="frameworks/rs" name="platform/frameworks/rs" groups="pdk" />
  <project path="frameworks/support" name="platform/frameworks/support" />
  <project path="frameworks/testing" name="platform/frameworks/testing" />
  <project path="frameworks/uiautomator" name="platform/frameworks/uiautomator" />
  <project path="frameworks/volley" name="platform/frameworks/volley" />
  <project path="frameworks/webview" name="platform/frameworks/webview" />
  <project path="frameworks/wilhelm" name="platform/frameworks/wilhelm" />
  <project path="hardware/akm" name="platform/hardware/akm" />
  <project path="hardware/broadcom/libbt" name="platform/hardware/broadcom/libbt" groups="pdk" />
  <project path="hardware/broadcom/wlan" name="platform/hardware/broadcom/wlan" groups="broadcom_wlan" />
  <project path="hardware/hardkernel" name="android_hardware_hardkernel" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="hardware/invensense" name="platform/hardware/invensense" groups="invensense" />
  <project path="hardware/libhardware" name="android_hardware_libhardware" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="hardware/libhardware_legacy" name="android_hardware_libhardware_legacy" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="hardware/qcom/audio" name="platform/hardware/qcom/audio" groups="qcom" />
  <project path="hardware/qcom/bt" name="platform/hardware/qcom/bt" groups="qcom" />
  <project path="hardware/qcom/camera" name="platform/hardware/qcom/camera" groups="qcom" />
  <project path="hardware/qcom/display" name="platform/hardware/qcom/display" groups="qcom" />
  <project path="hardware/qcom/keymaster" name="platform/hardware/qcom/keymaster" groups="qcom" />
  <project path="hardware/qcom/media" name="platform/hardware/qcom/media" groups="qcom" />
  <project path="hardware/qcom/msm8960" name="platform/hardware/qcom/msm8960" groups="qcom_msm8960" />
  <project path="hardware/qcom/msm8x74" name="platform/hardware/qcom/msm8x74" groups="qcom_msm8x74" />
  <project path="hardware/qcom/power" name="platform/hardware/qcom/power" groups="qcom" />
  <project path="hardware/qcom/sensors" name="platform/hardware/qcom/sensors" groups="qcom" />
  <project path="hardware/qcom/wlan" name="platform/hardware/qcom/wlan" groups="qcom_wlan" />
  <project path="hardware/realtek" name="android_hardware_realtek" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="hardware/ril" name="platform/hardware/ril" groups="pdk" />
  <project path="hardware/samsung_slsi/exynos4" name="android_hardware_samsung_slsi_exynos4" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="hardware/samsung_slsi/exynos5" name="platform/hardware/samsung_slsi/exynos5" groups="exynos5" />
  <project path="hardware/ti/omap3" name="platform/hardware/ti/omap3" />
  <project path="hardware/ti/omap4xxx" name="platform/hardware/ti/omap4xxx" groups="omap4" />
  <project path="hardware/ti/wlan" name="platform/hardware/ti/wlan" />
  <project path="hardware/ti/wpan" name="platform/hardware/ti/wpan" />
  <project path="libcore" name="platform/libcore" />
  <project path="libnativehelper" name="platform/libnativehelper" groups="pdk-java" />
  <project path="ndk" name="platform/ndk" />
  <project path="packages/apps/BasicSmsReceiver" name="platform/packages/apps/BasicSmsReceiver" />
  <project path="packages/apps/Bluetooth" name="platform/packages/apps/Bluetooth" />
  <project path="packages/apps/Browser" name="platform/packages/apps/Browser" />
  <project path="packages/apps/Calculator" name="platform/packages/apps/Calculator" />
  <project path="packages/apps/Calendar" name="platform/packages/apps/Calendar" />
  <project path="packages/apps/Camera" name="platform/packages/apps/Camera" />
  <project path="packages/apps/Camera2" name="platform/packages/apps/Camera2" />
  <project path="packages/apps/CellBroadcastReceiver" name="platform/packages/apps/CellBroadcastReceiver" />
  <project path="packages/apps/CertInstaller" name="platform/packages/apps/CertInstaller" />
  <project path="packages/apps/Contacts" name="platform/packages/apps/Contacts" />
  <project path="packages/apps/ContactsCommon" name="platform/packages/apps/ContactsCommon" />
  <project path="packages/apps/DeskClock" name="platform/packages/apps/DeskClock" />
  <project path="packages/apps/Dialer" name="platform/packages/apps/Dialer" />
  <project path="packages/apps/Email" name="platform/packages/apps/Email" />
  <project path="packages/apps/Exchange" name="platform/packages/apps/Exchange" />
  <project path="packages/apps/Gallery" name="platform/packages/apps/Gallery" />
  <project path="packages/apps/Gallery2" name="platform/packages/apps/Gallery2" />
  <project path="packages/apps/HTMLViewer" name="platform/packages/apps/HTMLViewer" />
  <project path="packages/apps/InCallUI" name="platform/packages/apps/InCallUI" />
  <project path="packages/apps/KeyChain" name="platform/packages/apps/KeyChain" />
  <project path="packages/apps/Launcher2" name="platform/packages/apps/Launcher2" />
  <project path="packages/apps/Launcher3" name="platform/packages/apps/Launcher3" />
  <project path="packages/apps/LegacyCamera" name="platform/packages/apps/LegacyCamera" />
  <project path="packages/apps/Mms" name="platform/packages/apps/Mms" />
  <project path="packages/apps/Music" name="platform/packages/apps/Music" />
  <project path="packages/apps/MusicFX" name="platform/packages/apps/MusicFX" />
  <project path="packages/apps/Nfc" name="platform/packages/apps/Nfc" />
  <project path="packages/apps/OdroidUpdater" name="android_packages_apps_OdroidUpdater" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="packages/apps/OneTimeInitializer" name="platform/packages/apps/OneTimeInitializer" />
  <project path="packages/apps/PackageInstaller" name="platform/packages/apps/PackageInstaller" />
  <project path="packages/apps/Phone" name="platform/packages/apps/Phone" />
  <project path="packages/apps/PhoneCommon" name="platform/packages/apps/PhoneCommon" />
  <project path="packages/apps/Protips" name="platform/packages/apps/Protips" />
  <project path="packages/apps/Provision" name="platform/packages/apps/Provision" />
  <project path="packages/apps/QuickSearchBox" name="platform/packages/apps/QuickSearchBox" />
  <project path="packages/apps/Settings" name="android_packages_apps_Settings" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="packages/apps/SmartCardService" name="platform/packages/apps/SmartCardService" />
  <project path="packages/apps/SoundRecorder" name="android_packages_apps_SoundRecorder" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="packages/apps/SpareParts" name="platform/packages/apps/SpareParts" />
  <project path="packages/apps/SpeechRecorder" name="platform/packages/apps/SpeechRecorder" />
  <project path="packages/apps/Stk" name="platform/packages/apps/Stk" />
  <project path="packages/apps/Tag" name="platform/packages/apps/Tag" />
  <project path="packages/apps/UnifiedEmail" name="platform/packages/apps/UnifiedEmail" />
  <project path="packages/apps/Utility" name="android_packages_apps_Utility" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="packages/apps/VideoEditor" name="platform/packages/apps/VideoEditor" />
  <project path="packages/apps/VoiceDialer" name="platform/packages/apps/VoiceDialer" />
  <project path="packages/experimental" name="platform/packages/experimental" />
  <project path="packages/inputmethods/LatinIME" name="platform/packages/inputmethods/LatinIME" />
  <project path="packages/inputmethods/OpenWnn" name="platform/packages/inputmethods/OpenWnn" />
  <project path="packages/inputmethods/PinyinIME" name="platform/packages/inputmethods/PinyinIME" />
  <project path="packages/providers/ApplicationsProvider" name="platform/packages/providers/ApplicationsProvider" />
  <project path="packages/providers/CalendarProvider" name="platform/packages/providers/CalendarProvider" />
  <project path="packages/providers/ContactsProvider" name="platform/packages/providers/ContactsProvider" />
  <project path="packages/providers/DownloadProvider" name="platform/packages/providers/DownloadProvider" />
  <project path="packages/providers/MediaProvider" name="platform/packages/providers/MediaProvider" />
  <project path="packages/providers/PartnerBookmarksProvider" name="platform/packages/providers/PartnerBookmarksProvider" />
  <project path="packages/providers/TelephonyProvider" name="platform/packages/providers/TelephonyProvider" />
  <project path="packages/providers/UserDictionaryProvider" name="platform/packages/providers/UserDictionaryProvider" />
  <project path="packages/screensavers/Basic" name="platform/packages/screensavers/Basic" />
  <project path="packages/screensavers/PhotoTable" name="platform/packages/screensavers/PhotoTable" />
  <project path="packages/screensavers/WebView" name="platform/packages/screensavers/WebView" />
  <project path="packages/services/Telephony" name="platform/packages/services/Telephony" />
  <project path="packages/wallpapers/Basic" name="platform/packages/wallpapers/Basic" />
  <project path="packages/wallpapers/Galaxy4" name="platform/packages/wallpapers/Galaxy4" />
  <project path="packages/wallpapers/HoloSpiral" name="platform/packages/wallpapers/HoloSpiral" />
  <project path="packages/wallpapers/LivePicker" name="platform/packages/wallpapers/LivePicker" />
  <project path="packages/wallpapers/MagicSmoke" name="platform/packages/wallpapers/MagicSmoke" />
  <project path="packages/wallpapers/MusicVisualization" name="platform/packages/wallpapers/MusicVisualization" />
  <project path="packages/wallpapers/NoiseField" name="platform/packages/wallpapers/NoiseField" />
  <project path="packages/wallpapers/PhaseBeam" name="platform/packages/wallpapers/PhaseBeam" />
  <project path="pdk" name="platform/pdk" groups="pdk" />
  <project path="prebuilts/clang/darwin-x86/3.1" name="platform/prebuilts/clang/darwin-x86/3.1" groups="pdk,darwin" />
  <project path="prebuilts/clang/darwin-x86/3.2" name="platform/prebuilts/clang/darwin-x86/3.2" groups="pdk,darwin" />
  <project path="prebuilts/clang/darwin-x86/arm/3.3" name="platform/prebuilts/clang/darwin-x86/arm/3.3" groups="darwin,arm" />
  <project path="prebuilts/clang/darwin-x86/host/3.3" name="platform/prebuilts/clang/darwin-x86/host/3.3" groups="darwin" />
  <project path="prebuilts/clang/darwin-x86/mips/3.3" name="platform/prebuilts/clang/darwin-x86/mips/3.3" groups="darwin,mips" />
  <project path="prebuilts/clang/darwin-x86/x86/3.3" name="platform/prebuilts/clang/darwin-x86/x86/3.3" groups="darwin,x86" />
  <project path="prebuilts/clang/linux-x86/3.1" name="platform/prebuilts/clang/linux-x86/3.1" groups="pdk,linux" />
  <project path="prebuilts/clang/linux-x86/3.2" name="platform/prebuilts/clang/linux-x86/3.2" groups="pdk,linux" />
  <project path="prebuilts/clang/linux-x86/arm/3.3" name="platform/prebuilts/clang/linux-x86/arm/3.3" groups="linux,arm" />
  <project path="prebuilts/clang/linux-x86/host/3.3" name="platform/prebuilts/clang/linux-x86/host/3.3" groups="linux" />
  <project path="prebuilts/clang/linux-x86/mips/3.3" name="platform/prebuilts/clang/linux-x86/mips/3.3" groups="linux,mips" />
  <project path="prebuilts/clang/linux-x86/x86/3.3" name="platform/prebuilts/clang/linux-x86/x86/3.3" groups="linux,x86" />
  <project path="prebuilts/devtools" name="platform/prebuilts/devtools" />
  <project path="prebuilts/eclipse" name="platform/prebuilts/eclipse" groups="pdk" />
  <project path="prebuilts/eclipse-build-deps" name="platform/prebuilts/eclipse-build-deps" groups="notdefault,eclipse" />
  <project path="prebuilts/eclipse-build-deps-sources" name="platform/prebuilts/eclipse-build-deps-sources" groups="notdefault,eclipse" />
  <project path="prebuilts/gcc/darwin-x86/arm/arm-eabi-4.6" name="platform/prebuilts/gcc/darwin-x86/arm/arm-eabi-4.6" groups="pdk,darwin,arm" />
  <project path="prebuilts/gcc/darwin-x86/arm/arm-eabi-4.7" name="platform/prebuilts/gcc/darwin-x86/arm/arm-eabi-4.7" groups="pdk,darwin,arm" />
  <project path="prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.6" name="platform/prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.6" groups="pdk,darwin,arm" />
  <project path="prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.7" name="platform/prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.7" groups="pdk,darwin,arm" />
  <project path="prebuilts/gcc/darwin-x86/host/headers" name="platform/prebuilts/gcc/darwin-x86/host/headers" groups="pdk,darwin" />
  <project path="prebuilts/gcc/darwin-x86/host/i686-apple-darwin-4.2.1" name="platform/prebuilts/gcc/darwin-x86/host/i686-apple-darwin-4.2.1" groups="pdk,darwin" />
  <project path="prebuilts/gcc/darwin-x86/mips/mipsel-linux-android-4.6" name="platform/prebuilts/gcc/darwin-x86/mips/mipsel-linux-android-4.6" groups="pdk,darwin,mips" />
  <project path="prebuilts/gcc/darwin-x86/mips/mipsel-linux-android-4.7" name="platform/prebuilts/gcc/darwin-x86/mips/mipsel-linux-android-4.7" groups="pdk,darwin,mips" />
  <project path="prebuilts/gcc/darwin-x86/x86/i686-linux-android-4.6" name="platform/prebuilts/gcc/darwin-x86/x86/i686-linux-android-4.6" groups="pdk,darwin,x86" />
  <project path="prebuilts/gcc/darwin-x86/x86/i686-linux-android-4.7" name="platform/prebuilts/gcc/darwin-x86/x86/i686-linux-android-4.7" groups="pdk,darwin,x86" />
  <project path="prebuilts/gcc/darwin-x86/x86/x86_64-linux-android-4.7" name="platform/prebuilts/gcc/darwin-x86/x86/x86_64-linux-android-4.7" groups="pdk,darwin,x86" />
  <project path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.6" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6" groups="pdk,linux,arm" />
  <project path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" groups="pdk,linux,arm" />
  <project path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6" groups="pdk,linux,arm" />
  <project path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" groups="pdk,linux,arm" />
  <project path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.4.3" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.4.3" groups="pdk,linux" />
  <project path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" groups="pdk,linux" />
  <project path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" groups="pdk,linux" />
  <project path="prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.6" name="platform/prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.6" groups="pdk,linux,mips" />
  <project path="prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.7" name="platform/prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.7" groups="pdk,linux,mips" />
  <project path="prebuilts/gcc/linux-x86/x86/i686-linux-android-4.6" name="platform/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.6" groups="pdk,linux,x86" />
  <project path="prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" name="platform/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" groups="pdk,linux,x86" />
  <project path="prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.7" name="platform/prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.7" groups="pdk,linux,x86" />
  <project path="prebuilts/misc" name="platform/prebuilts/misc" groups="pdk" />
  <project path="prebuilts/ndk" name="platform/prebuilts/ndk" groups="pdk" />
  <project path="prebuilts/python/darwin-x86/2.7.5" name="platform/prebuilts/python/darwin-x86/2.7.5" groups="darwin" />
  <project path="prebuilts/python/linux-x86/2.7.5" name="platform/prebuilts/python/linux-x86/2.7.5" groups="linux" />
  <project path="prebuilts/qemu-kernel" name="platform/prebuilts/qemu-kernel" groups="pdk" />
  <project path="prebuilts/runtime" name="platform/prebuilts/runtime" />
  <project path="prebuilts/sdk" name="platform/prebuilts/sdk" groups="pdk" />
  <project path="prebuilts/tools" name="platform/prebuilts/tools" groups="pdk,tools" />
  <project path="sdk" name="platform/sdk" />
  <project path="system/core" name="android_system_core" remote= "origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="system/extras" name="android_system_extras" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="system/media" name="platform/system/media" groups="pdk" />
  <project path="system/netd" name="platform/system/netd" groups="pdk" />
  <project path="system/security" name="platform/system/security" groups="pdk" />
  <project path="system/vold" name="android_system_vold" groups="pdk" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="tools/adt/eclipse" name="platform/tools/adt/eclipse" groups="notdefault,tools" />
  <project path="tools/adt/idea" name="platform/tools/adt/idea" groups="notdefault,tools" />
  <project path="tools/base" name="platform/tools/base" groups="notdefault,tools" />
  <project path="tools/build" name="platform/tools/build" groups="notdefault,tools" />
  <project path="tools/emulator" name="platform/tools/emulator" groups="notdefault,tools" />
  <project path="tools/external/fat32lib" name="platform/tools/external/fat32lib" groups="tools" />
  <project path="tools/external/gradle" name="platform/tools/external/gradle" groups="tools" />
  <project path="tools/idea" name="platform/tools/idea" groups="notdefault,tools" />
  <project path="tools/motodev" name="platform/tools/motodev" groups="notdefault,motodev" />
  <project path="tools/studio/cloud" name="platform/tools/studio/cloud" groups="notdefault,tools" />
  <project path="tools/swt" name="platform/tools/swt" groups="notdefault,tools" />
  <project path="vendor/ralink" name="android_vendor_ralink" remote="origin" revision="refs/heads/odroid_4412_master" />
</manifest>

관련소스 

  • repo init 설정 및 확인  
repo init -u  했을 경우, .repo 디렉토리 및 manifest.xml 생성된다. 
그리고, 정보 입력을 요구하는데 Name, E-Mail, Path  확인하자,
아래와 같이, branch 및 tag 정보 확인이 가능하다.

Get https://github.com/hardkernel/android.git  // default.xml로 동작 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
curl: (22) The requested URL returned error: 404
Server does not provide clone.bundle; ignoring.
remote: Counting objects: 1097, done.
remote: Compressing objects: 100% (456/456), done.
remote: Total 1097 (delta 446), reused 1097 (delta 446)
Receiving objects: 100% (1097/1097), 434.98 KiB | 181 KiB/s, done.
Resolving deltas: 100% (446/446), done.
From https://github.com/hardkernel/android
 * [new branch]      4412_4.1.2_master -> origin/4412_4.1.2_master
 * [new branch]      4412_4.4.3_master -> origin/4412_4.4.3_master
 * [new branch]      4412_4.4.4_master -> origin/4412_4.4.4_master
 * [new branch]      4412_L_master -> origin/4412_L_master
 * [new branch]      5410_4.2.2_master -> origin/5410_4.2.2_master
 * [new branch]      odroid_4412_master -> origin/odroid_4412_master
 * [new branch]      odroid_5410_master -> origin/odroid_5410_master 
...........

repo init을 한후 .repo를 보면 다음과 같이 구성 

$ tree .repo
.repo
├── manifest.xml -> manifests/default.xml
├── manifests
│   ├── default.xml
│   └── .git  // 아래의 manifests.git link로 구성
├── manifests.git        // 상위 default.xml GIT download 했기 때문에 Git 정보
│   ├── FETCH_HEAD
│   ├── HEAD
│   ├── branches
│   ├── config
│   ├── description
│   ├── hooks
│   │   ├── applypatch-msg.sample
│   │   ├── commit-msg -> ../../repo/hooks/commit-msg
│   │   ├── commit-msg.sample
│   │   ├── post-update.sample
│   │   ├── pre-applypatch.sample
│   │   ├── pre-auto-gc -> ../../repo/hooks/pre-auto-gc
│   │   ├── pre-commit.sample
│   │   ├── pre-rebase.sample
│   │   ├── prepare-commit-msg.sample
│   │   └── update.sample
│   ├── info
│   │   └── exclude
│   ├── logs
│   │   └── refs
│   │       └── remotes
│   │           └── origin
│   │               ├── 4412_4.1.2_master
│   │               ├── 4412_4.4.3_master
│   │               ├── 4412_4.4.4_master
│   │               ├── 4412_L_master
│   │               ├── 5410_4.2.2_master
│   │               ├── 5422_4.2.2_master
│   │               ├── 5422_4.4.2_master
│   │               ├── 5422_4.4.4_master
│   │               ├── odroid_4412_master
│   │               ├── odroid_5410_master
│   │               ├── s805_4.4.2_master
│   │               └── s905_5.1.1_master
│   ├── objects
│   │   ├── info
│   │   └── pack
│   │       ├── pack-156a343f25e111fb8e411eb1d779fe669997e79d.idx
│   │       └── pack-156a343f25e111fb8e411eb1d779fe669997e79d.pack
│   ├── packed-refs
│   ├── refs
│   │   ├── heads
│   │   │   └── default
│   │   ├── remotes
│   │   └── tags
│   ├── rr-cache
│   └── svn
└── repo           // repo 관련된 phython program 
    ├── COPYING
    ├── SUBMITTING_PATCHES
    ├── color.py
    ├── color.pyc
    ├── command.py
    ├── command.pyc
    ├── docs
    │   └── manifest-format.txt  // manifest-format.xml 문법설명 및 사용법 
    ├── editor.py
    ├── editor.pyc
    ├── error.py
    ├── error.pyc
    ├── git_command.py
    ├── git_command.pyc
    ├── git_config.py
    ├── git_config.pyc
    ├── git_refs.py
    ├── git_refs.pyc
    ├── git_ssh
    ├── gitc_utils.py
    ├── gitc_utils.pyc
    ├── hooks
    │   ├── commit-msg
    │   └── pre-auto-gc
    ├── main.py
    ├── manifest_xml.py
    ├── manifest_xml.pyc
    ├── pager.py
    ├── pager.pyc
    ├── progress.py
    ├── progress.pyc
    ├── project.py
    ├── project.pyc
    ├── pyversion.py
    ├── pyversion.pyc
    ├── repo
    ├── repoc
    ├── subcmds
    │   ├── __init__.py
    │   ├── __init__.pyc
    │   ├── abandon.py
    │   ├── abandon.pyc
    │   ├── branches.py
    │   ├── branches.pyc
    │   ├── checkout.py
    │   ├── checkout.pyc
    │   ├── cherry_pick.py
    │   ├── cherry_pick.pyc
    │   ├── diff.py
    │   ├── diff.pyc
    │   ├── diffmanifests.py
    │   ├── diffmanifests.pyc
    │   ├── download.py
    │   ├── download.pyc
    │   ├── forall.py
    │   ├── forall.pyc
    │   ├── gitc_delete.py
    │   ├── gitc_delete.pyc
    │   ├── gitc_init.py
    │   ├── gitc_init.pyc
    │   ├── grep.py
    │   ├── grep.pyc
    │   ├── help.py
    │   ├── help.pyc
    │   ├── info.py
    │   ├── info.pyc
    │   ├── init.py
    │   ├── init.pyc
    │   ├── list.py
    │   ├── list.pyc
    │   ├── manifest.py
    │   ├── manifest.pyc
    │   ├── overview.py
    │   ├── overview.pyc
    │   ├── prune.py
    │   ├── prune.pyc
    │   ├── rebase.py
    │   ├── rebase.pyc
    │   ├── selfupdate.py
    │   ├── selfupdate.pyc
    │   ├── smartsync.py
    │   ├── smartsync.pyc
    │   ├── stage.py
    │   ├── stage.pyc
    │   ├── start.py
    │   ├── start.pyc
    │   ├── status.py
    │   ├── status.pyc
    │   ├── sync.py
    │   ├── sync.pyc
    │   ├── upload.py
    │   ├── upload.pyc
    │   ├── version.py
    │   └── version.pyc
    ├── tests
    │   ├── fixtures
    │   │   ├── gitc_config
    │   │   └── test.gitconfig
    │   ├── test_git_config.py
    │   └── test_wrapper.py
    ├── trace.py
    ├── trace.pyc
    ├── wrapper.py
    └── wrapper.pyc

2.4 repo sync 분석  

  • repo sync 동작 후 구조파악     
project-object 와 project 그리고, project.list 기반으로 분석
  1. project-object : source를 미제공하며 *.so 로 제공 및 module로 제공 
  2. project: 소스형태로 제공  

상위 default.xml의 project에 존재하지 않는 것을 가지고 있는 것으로 보아 remote를 전체를 download 한 것으로 보인다. 
아래 상위 default.xml의 project name에 없는 것들은 주로 CyanogenMod 와 Hardkernel 검색가능

$ tree -t -L 2 --charset unicode .repo/  
.repo/
|-- repo // repo 관련된 phython program 이므로 sub는 삭제 
|
|-- manifests
|   `-- default.xml         
|-- manifest.xml    // -> manifests/default.xml (repo init -u 의 정보)  
|-- manifests.git   // 상위 default.xml 저장된 곳의 GIT 정보 
|   |-- branches
|   |-- description
|   |-- HEAD
|   |-- hooks
|   |-- info
|   |-- objects
|   |-- logs
|   |-- refs
|   |-- config
|   |-- packed-refs
|   |-- rr-cache
|   |-- svn
|   `-- FETCH_HEAD
|-- project-objects     // project의 name 기반으로 GIT 구성 (아래 다시세부분석)  
|   |-- android_hardware_libhardware.git
|   |-- android_hardware_backports.git   //project name 없음, HardKernel 존재 
|   |-- android_system_extras.git
|   |-- android_frameworks_native.git
|   |-- android_device_hardkernel_odroidu.git
|   |-- android_frameworks_av.git
|   |-- android_device_hardkernel_odroidx.git
|   |-- android_external_ntfs-3g.git
|   |-- android_packages_apps_SoundRecorder.git
|   |-- android_device_hardkernel_proprietary.git
|   |-- android_build.git
|   |-- android_hardware_hardkernel.git
|   |-- android_external_ppp.git     //project name 없음, CyanogenMod 존재 
|   |-- android_hardware_ril.git     //project name 없음, CyanogenMod 존재 
|   |-- android_hardware_wifi_realtek_drivers_8192cu.git  //project name 없음, HardKernel 존재 
|   |-- android_system_core.git
|   |-- android_external_wpa_supplicant_8.git
|   |-- android_hardware_libhardware_legacy.git
|   |-- android_external_exfat.git
|   |-- android_external_libusb.git  //project name 없음, CyanogenMod 존재
|   |-- android_device_rockchip.git  //project name 없음, HardKernel 존재
|   |-- android_external_vim.git
|   |-- android_frameworks_base.git
|   |-- android_packages_apps_OdroidUpdater.git
|   |-- android_bionic.git
|   |-- android_external_busybox.git
|   |-- device               // Git directory 
|   |-- Superuser.git
|   |-- android_external_fsck_msdos.git
|   |-- android_external_fuse.git
|   |-- android_hardware_amlogic_wifi.git   //project name 없음, CyanogenMod 존재 
|   |-- android_external_bluetooth_bluedroid.git //project name 없음, HardKernel 존재
|   |-- Widgets.git
|   |-- android_device_hardkernel_odroidx2.git
|   |-- android_hardware_broadcom_libbt.git  //project name 없음, HardKernel 존재
|   |-- android_external_libncurses.git
|   |-- android_packages_apps_Bluetooth.git  //project name 없음, HardKernel 존재
|   |-- android_packages_apps_Settings.git
|   |-- android_vendor_ralink.git
|   |-- android_frameworks_opt_vcard.git   //project name 없음, HardKernel 존재
|   |-- android_packages_apps_Utility.git
|   |-- linux.git                   //project name 없음, HardKernel 존재 
|   |-- android_dalvik.git          //project name 없음, HardKernel 존재 
|   |-- android_hardware_samsung_slsi_exynos4.git
|   |-- android_external_e2fsprogs.git
|   |-- android_system_vold.git
|   `-- platform                    // Git directory 
|-- projects   // project의 source 형태 
|   |-- tools
|   |-- docs
|   |-- device
|   |-- abi
|   |-- packages
|   |-- bootable
|   |-- vendor
|   |-- hardware
|   |-- developers
|   |-- frameworks
|   |-- prebuilts
|   |-- system
|   |-- external
|   |-- art.git
|   |-- bionic.git
|   |-- build.git
|   |-- cts.git
|   |-- dalvik.git
|   |-- development.git
|   |-- kernel.git
|   |-- libcore.git
|   |-- libnativehelper.git
|   |-- ndk.git
|   |-- pdk.git
|   `-- sdk.git
`-- project.list  // project의 name 의 list 확인가능