A. 설정
$ mkdir lollipop $ cd lollipop
B. 개발자 version 혹은 release version으로 download하자
*develop version init
$ repo init -u https://android.googlesource.com/platform/manifest -b lollipop-dev
*release version init
$ repo init -u https://android.googlesource.com/platform/manifest -b android-5.1.0_r3
*download
$ repo sync -qc -j4
C. download 후 확인
$ ls abi bootable dalvik device frameworks libnativehelper packages sdk art build developers docs hardware Makefile pdk system bionic cts development external libcore ndk prebuilts tools
1.1 repo 설정
repo는 git를 관리는 하는 linux tool로 아래에서 간단히 사용방법을 숙지하자.
처음 사용한다면, 아래의 사이트를 참조하여, download를 받고 기본설정하자.
* https://ahyuo79.blogspot.com/search/label/SCM-GIT
1.2 repo와 git 기본사용법
android source를 수정을 한 후, repo status를 보면 아래와 같이 수정 및 새로추가한 것을 알수있다.
-m : 수정
- : new file
$ repo status project build/ (*** NO BRANCH ***) -m envsetup.sh project hardware/libhardware/ (*** NO BRANCH ***) -m include/hardware/gralloc.h project hardware/libhardware_legacy/ (*** NO BRANCH ***) -- audio/audio_hw_hal.kitkat.cpp -- audio/audio_hw_hal.lollipop.cpp
세세한 download 혹은 상태를 보고 싶다면 git status를 사용하자.
아래와 같이 File 삭제 새로 추가 및 수정 했다면 아래와 같이
git status로 보면 확인하고, 다른명령으로 복구하자.
- 삭제: deleted:
- 수정: modified:
- 새로추가: Untracked files:
$ git status # Not currently on any branch. # Changes not staged for commit: # (use "git add/rm file..." to update what will be committed) # (use "git checkout -- file..." to discard changes in working directory) # # deleted: Android.mk // 지워진 파일 # # Untracked files: # (use "git add file..." to include in what will be committed) # # audio_hw_hal.kitkat.cpp // 새로 추가한 파일 # audio_hw_hal.lollipop.cpp // 새로 추가한 파일git checkout으로 Android.mk 복구
$ git checkout Android.mk // Android.mk 삭제되어있기에, 이를 복구 $ git status // 복구 후 상태확인 # Not currently on any branch. # Untracked files: # (use "git add file..." to include in what will be committed) # # audio_hw_hal.kitkat.cpp # audio_hw_hal.lollipop.cpp
*아래사이트에서 위의 branch 주소가 변경이 될 수 있으므로 확인하자.
How to download source
http://source.android.com/source/downloading.html ( how to download )
https://android.googlesource.com/platform/manifest/+refs ( how to check branch ,tags)
http://source.android.com/source/build-numbers.html#source-code-tags-and-builds
(* how to check branch, tags)
2. 기존 odroid 분석
odroid에서 제공하는 shell을 분석하여 Build 구성을 파악.
2.1 odroid build shell 분석
$ vi build_android.sh
odroidx2) . build/envsetup.sh // source build/envsetup.sh lunch odroidx2-eng // lunch 설정 build_android // build android platform copy_root_2_system // filesystem 수정 및 만들기 make_update_zip // image 작업 if [[ $2 = "otapackage" ]] then ./build_otapackage.sh fi ;;
기본구성은 다음과 같다.
1. source build/envsetup.sh을 하고 나면 device의 내의 vendor를 include 함.
2. lunch로 등록된 이 부분을 설정을 시도를 한다.
3. platform을 빌드를 시작
이부분은 다른 Android에도 동일
* lunch 관련부분 설명
http://chlrbgh0.tistory.com/207
* envsetup.sh 설명
http://www.kaisyu.com/notes/google-android/android-envsetupsh
http://itmir.tistory.com/450
* 기본 Build 방법
http://source.android.com/source/building-running.html
http://elinux.org/Android_Build_System
2.2 How To build Android
$ . build/envsetup.sh or $ source build/envsetup.sh $ lunch odroidx2-eng $ make -j4
ref. http://ahyuo79.blogspot.com/2014/01/blog-post_7416.html
2.3 odroid 의 포팅된 부분 파악
$ find . -name '*.mk' -o -name 'Makefile' | xargs grep odroid
아래의 결과물로 쉽게 관련 Makefile들을 찾을 수 있다.
쉽게 결과물을 얻으며, 포팅된 부분은 device와 hardware 두 directory 부분
3. android-5.1.0_r3 구조파악 및 적용
- device와 hardware의 hardkernel을 복사 ( Hard Kernel에서 Porting 부분)
- device의 rockchip 부분도 복사 ( Dummy Ril)
- hardware/samsung_slsi/exynos4 부분도 복사 ( Exynos4 관련 library )
필요한 부분만 고쳐서 적용하기로 함.
* 수정된 부분 ├─ abi ├─ bootable ├─ dalvik ├─ device │ ├─hardkernel :기존에 있던 hardkernel 존재하던 부분 복사 - 2 │ │ ├─ odroidx2 : odroid-x2 설정 │ │ │ │ │ │ │ ├─ BoardConfig.mk : BoardConfig.mk 와 동일 ( on/off 제어) │ │ │ ├─ device.mk : │ │ │ ├─ AndroidProducts.mk : odroidx2.mk wrapping Makefile │ │ │ ├─ odroidx2.mk : PRODUCT 정보, product_config.mk 와 동일 │ │ │ └─ vendorsetup.sh : lunch 등록 shell │ │ │ │ │ ├─ ... : 기타 다른보드설정 │ │ │ │ │ └─ proprietary : 공통사항 , uboot 및 library 보관 (자산, library로 보관 중) │ │ │ │ │ ├─ rockchip │ │ └─ common : 전부 rockchip 부분을 복사-4 │ │ └─ phone │ │ │ ├─ common : 수정안함 │ ... │ │ ├─ frameworks ├─ libnativehelper ├─ packages ├─ sdk ├─ art ├─ build │ ├─ buildspec.mk.default │ ├─ CleanSpec.mk │ ├─ core │ ├─ envsetup.sh │ ├─ libs │ ├─ target │ └─ tools │ │ ├─ developers ├─ docs ├─ hardware │ ├─ hardkernel : 기존에 있던 hardkernel 존재하던 부분 복사-1 │ │ ├─ _Android.mk : Hal 관련 부분 │ │ ├─ libaudio : Audio Hal │ │ ├─ libcamera_mipi │ │ ├─ libcamera_webcame : Camera Hal │ │ └─ libodroid-gps │ │ │ │ │ ├─ samsung_slsi │ │ ├─ exynos4 : exynos4 부분이 존재하지 않아 복사-3 │ │ └─ exynos5 │ ... │ ├─ Makefile ├─ pdk ├─ system ├─ bionic ├─ cts ├─ development ├─ external ├─ libcore ├─ ndk ├─ prebuilts └─ tools
Ref. http://ahyuo79.blogspot.com/2014/01/blog-post.html?zx=1016342afcd2910e
4. Build 도중 발생 하는 문제
Build를 하다보면, Java version 문제 , oracle version 문제 등 문제가 발생할 경우
java version을 변경해 보자.
현재 나의 java를 보니, openjdk가 없음으로, 이를 설치
$ java -version $ echo $JAVA_HOME /usr/lib/jvm/java-7-oracle $ ls /usr/lib/jvm/ java-6-oracle/ .java-6-oracle.jinfo java-7-oracle/ .java-7-oracle.jinfo java-8-oracle/ .java-8-oracle.jinfo
http://source.android.com/source/initializing.html
* kikat은 oracle 6을 lolipop은 openjdk 7이 필요 한다고 한다.
* version 이 정확이 맞이 않으면 에러가 발생.
아래와 같이 사용
$ . ./jdk_switch.sh jdk7 $ . ./jdk_switch.sh jdk6
jdk_swich.sh
vi jdk_switch.sh // shell script 작성 #!/bin/bash case $1 in jdk6) export JAVA_HOME=/usr/lib/jvm/java-6-oracle/ ;; jdk7) export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ ;; *) export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ ;; esac export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib java -version
* Java 관련부분 error
http://stackoverflow.com/questions/27955851/android-5-0-build-errors-with-java-version-issue