人生襍多

1) Android Build를 위한 준비단계 본문

안드로이드 빌드

1) Android Build를 위한 준비단계

이혁진 2015. 12. 21. 18:02

[안드로이드 빌드를 위한 준비 사항]

AOSP에서 나오는 것 참조 http://source.android.com/source/requirements.html

-. AOSP (Android Open Source Project)
  말그대로 임.... http://source.android.com 에 각종 안드로이드 소스/메뉴얼 자료 등이 있음 .
  비지니스용으로 google 계정하나 생성시킬 것......(소스 다운로드나, 커뮤니티 활동시 필요할 듯) 

-. 최신 버전의 Ubuntu LTS : in house에서 지속적으로 test 한다는 군요
  Ubuntu ( Linux 배포판 이름 )  
  안드로이드 빌드는 오직 Linux or Mac OS system에서만 됨
  AOSP에서 나온 시스템 권장 사양을 보면,
  at least 16GB of RAM/swap
  at least 100GB of free disk space ( 뭐 이것저것 작업하려면 200GB는 확보 하랍니당..~ )
  가능한 virtual machine는 사용치 말라네요
  64bit 로 설치할 것 ( Gingerbread 이상~ )
  스팩에는 안써있지만.....한글과 영어 로케일은 당연히 설치 

-. Python 2.6~2.7
  뭐 프로그램 언어 python.org
  Python 3.4는  명기가 안되있는걸로 봐서....안되나 봄

-. GNU Make 3.81~3.82
  소스컴파일을 위한 유틸리티(?) 프로그램임. gnu.org
  추억의 make구나...

-. JDK 7
  JAVA인데....
  JDK 6 for Gingerbread through KitKat
  JDK 5 for Cupcake through Froyo

-. Git 1.7 or newer
  소스코드를 효과적으로 관리하기 위해 개발된 '분산형 버전 관리 시스템'의 이름 ( git-scm.com )
  원래는 Linux 소스코드를 관리할 목적으로 개발되었고,
  안드로이드 소스를 다운 받으려면, Git 프로그램(?)을 설치해야 함



한번더 메뉴얼에는 나오는데, 아래 List에 원하는 안드로이드 버전을 고려 하란다....

http://source.android.com/source/build-numbers.html 

-. API Level : 음...명확히 설명은 안나오는데.....엔지니어가 고려해야 되는 framework 버전인듯 

-. Android 2.3.4 / 2.3.3 은 API Level 9로 빌드 엔지니어는 동일 framework 봐도 된다 라는 의미 


여기서 각 버전별 특징은 

안드로이드 4.3 ~ 4.3.1 / JellyBean / API Level 18 

-. Linux Kernel 3.4.0 

-. 기본스마트폰 : Nexus 7

-. 블루투스 LE 지원 

-. 와이파이 성능 및 사용시 편의성 개선


안드로이드 4.4 ~ 4.4.4 / Kitkat / API Level 19

-. Linux Kernel 3.4.0

-. 기본스마트폰 : Nexus 5

-. 512MB RAM을 사용하는 저사양 기기를 위한 메모리 최적화


안드로이드 5.0 ~ 5.0.2 / Lollipop / API Level 21

-. Linux Kernel 3.4.0 & 3.10.0

-. 기본스마트폰 : Nexus 6 & Nexus 9

-. 안드로이드 런타임(ART) 기본

-. 64 bit 지원

-. BLE 주변기기 모드

-. 멀티네트워킹


* ART

 Dalvik을 개선한 가상 머신이다. Dalvik은 장치에 맞추어서 응용프로그램 실행시 매번 재 컴파일을 하였으나,

 ART은 응용프로그램 설치시 미리 컴파일을 완료 한 뒤 저장하여 사용하는 형식


결론은 요즘 많이 쓰는 4.0버전(아이스크림 샌드위치) 이상의 안드로이드 빌드하여면 64bit 환경 및 이에 맞는 유틸을 설치해아 되니까 고려 하라는 얘기임 

젤라빈 이상으로 .... 롤리팝은 목표로.....해야 할 듯 



[실환경구축] 


1. 우분투 14.04 설치 

 윗 글에 해당하는 H/W 사양 

 설치 후 기본 O/S 최신버전 업데이트 apt-get으로 확인 

  -. apt-get : 리눅스명령어. APT Advanced Package Tool 로 사용법 숙지 필요 

 이 부분이 잘 안된다면.... apt repository url 재설정 .... ( apt-get 사용법 숙지 필요 --;;)  

 이하 작업 할때 원격 SSH로 할 것 
 $는 사용자계정 bash / #는 root계정 bash..... 
 사용자계정 아무거나 하나 만들어서 작업 하시길...


2. JDK 7

 $ sudo apt-get update 

 $ sudo apt-get install openjdk-7-jdk 

  -. sudo : 리눅스명령어 root권한으로 프로세스를 실행시킴 

 $ sudo java -version : 설치 버전확인. 이게 정상적으로 안 나올 경우나...JDK 세팅이 꼬이는 경우

 

 설정 확인 완료 ( 그냥 해줘도 됨 ) 

 $ sudo update-alternatives --config java

 $ sudo update-alternatives --config javac 

  -. update-alternatives : http://egloos.zum.com/hwanud/v/3052369 참조 


3. 여러 유틸 및 라이브러리 

@ Ubuntu 14.04일 경우 

$ sudo apt-get install git-core gnupg flex bison gperf build-essential \

  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \

  lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \

  libgl1-mesa-dev libxml2-utils xsltproc unzip


@ Ubuntu 12.04일 경우 

$ sudo apt-get install git gnupg flex bison gperf build-essential \

  zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \

  libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \

  libgl1-mesa-dev g++-multilib mingw32 tofrodos \

  python-markdown libxml2-utils xsltproc zlib1g-dev:i386

$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so


위 구문은 asop에 나온 스크립트인데.....python하고 git가 없다.... 

apt-get으로 설치 여부 확인 후, 설치 재확인 하시길.... ( 우분트 정상설치 되었으면 상관 없음 )  

$ sudo apt-get install python 

$ sudo apt-get install git-core 




4. ADB 설치 및 USB가 연결될 수 있도록 Setting 

리눅스 시스템에서 (특히 우분투 시스템에서), 일반 사용자가 직접 기본적으로 USB 장치에 액세스 할 수 없슴 

나중에 ADB를 사용하기 위해 setting 필수 

-. ADB ; Android Debugging Bridge / 컴퓨터와 단말기를 연결(보통 USB)하여 단말기를 제어하는 콘솔 프로그램


$ wget -S -O - http://source.android.com/source/51-android.rules | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules

위 구문은 asop에 나온 스크립트인데..... 


구분해 보면....

$ wget -S -O - http://source.android.com/source/51-android.rules

-. wget : http통신프로트콜로 파일을 다운 받아주는 유틸 

-. 위 구분 실행하면, 51-android.rules 파일에 실행 시킨 디렉토리에 있을 것 임 


$ vi 51-android.rules 

편집하여... http://source.android.com/source/51-android.rules 외의 기타 USB 커넥션 정보 추가 


#KT Tech

SUBSYSTEM=="usb", ATTR{idVendor}=="2116", MODE="0666"

#Lenevo

SUBSYSTEM=="usb", ATTR{idVendor}=="17EF", MODE="0666"

#LG

SUBSYSTEM=="usb", ATTR{idVendor}=="1004", MODE="0666"

#Motorola

SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", MODE="0666"

#Pantech

SUBSYSTEM=="usb", ATTR{idVendor}=="10A9", MODE="0666"

#SK Telesys

SUBSYSTEM=="usb", ATTR{idVendor}=="1f53", MODE="0666"

#Samsung

SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", MODE="0666"

#Sony Ericsson

SUBSYSTEM=="usb", ATTR{idVendor}=="0fce", MODE="0666"

#Huawei 

SUBSYSTEM=="usb", ATTR{idVendor}=="12d1", MODE="0666"  


sudo cp 51-android.rules /etc/udev/rules.d/. 

파일 카피하고, 

sudo chmod a+r /etc/udev/rules.d/51-android.rules
퍼미션 권한 주면 끝 


ADB 설치하기 ( AOSP에는 아래 내용 없음....; )

$ sudo apt-get install android-tools-adb


$ adb devices

실행 시키면...몬가 열심히 찾다 실패.. ㅎㅎ 




5. 별도의 출력 디렉토리 값 세팅 : 안해 도 될꺼 같은데, 했음 


$ export OUT_DIR_COMMON_BASE=<path-to-your-out-directory>

<path-to-your-out-directory>에 /output : 당연히 mkdir /output 


소스 경로가 /source/master1 및 /source/master2 에 있고 

OUT_DIR_COMMON_BASE 로/output 설정되어 있다면, 

출력 디렉토리가 /output/master1, /output/master2 로 될 것 임 


6. repo 설치하기


마지막으로 소스를 다운로드 할때 소스의 위치를 찾기 위해서 사용하는 유틸 임   


$ mkdir ~/bin 

$ PATH=~/bin:$PATH 

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo 

$ chmod a+x ~/bin/repo


또는....


$ sudo apt-get install phablet-tools



기타. 최적화 (안해도됨) 


앞에서 '여러 유틸 및 라이브러리' 설치 시 ccache라는 놈을 깔았는데...

ccashe라는 놈은 재빌드를 빠르게 해준다고 함 

제안 된 캐시 크기는 50-100GB 정도로 세팅 


.bashrc 편집 

 export USE_CCACHE=1 


기본 cache저장소는 ~/.ccache 이나 지정가능 

export CCACHE_DIR=<path-to-your-cache-directory> 


prebuilts/misc/linux-x86/ccache/ccache -M 50G 


아이스크림 샌드위치 (4.0.x의) 이상

prebuilt/linux-x86/ccache/ccache -M 50G 



[소스 다운로드] 

여기서 브랜치가 하나 생기는데, 

asop의 순정안드로이드 소스와....누군가 커스텀한 커스컴안드로이드 소스가 있을 수 있음 

우선 순정으로....


7-1. 다운로드  


저장 디렉토리 만들고...

$ cd ~ 

$ mkdir Android 

$ mkdir Android/AOSP 

$ cd ~/Android/AOSP 


repo 세팅인데... 

$ repo init -u https://android.googlesource.com/platform/manifest -b android-5.0.2_r1


-b android-5.0.2_r1를 안 적으로면 무조건 최신 버전으로 다운....

branch 명은 아래 주소 참조... 

http://source.android.com/source/build-numbers.html#source-code-tags-and-builds


repo 세팅 시... 이름하고 이메일을 물어보면...

$ git config --global user.email "이메일주소" 

$ git config --global user.name "사용자이름"

으로...등록 완료 하고...다시 repo init 하시면 됨.


$ repo sync

실제 다운로드 함......


7-2. 예외처리...


다운로드 관련 에러 (방화벽, 해당머신IP를 구글에서 막은경우 등..) 와 속도 저하 이슈 ( 미러사이트 이용 등) 가 있는데...

발생하면, http://source.android.com/source/downloading.html 참조 


[소스 빌드] 


여기서 브랜치가 하나 더 생기는데, 

asop의 순정안드로이드 소스이기에...구글레퍼런스 H/W에 대한 정보가 이미 포함되어 있음...

H/W대한 정보가 없을 경우에는 toolchain을 H/W 제조사에서 받아서, 크로스 컴파일을 해야함...


또...Android 6.0이상 부터는.....구글레퍼런스H/W일지라도..

아래 적어둔 방법 말고...Compiling with Jack 방법으로 해야한다고 함..

우선....롤리팝까지 하는걸 목적으로...


8. 빌드환경 및 H/W 설정


$ cd ~/Android/AOSP 

$ . build/envsetup.sh

몬가 흘러 감.....각 소스파일이 정상적으로 있나, 환경변수는 있나 살펴 보는 듯 함 


$ lunch aosp_arm-eng 라고 하는데....

여기서 구글레퍼런스H/W의 기기종류와 빌드 타입을 설정 함 .


aosp_arm-eng => "기기종류"-"빌드타입"


빌드 타입은...

 -. user : 제한된 액세스, 생산에 적합. / 이말은....우리가 쓰는 rooting 안된 스마트폰 임... 

 -. userdebug : 사용자의 루트 액세스 및 디버깅 용 

 -. eng : 개발환경과 디버깅 도구가 추가된 상태  


기기종류명는...

"aosp_"에 "기기의 코드네임"을 합친 것

코드네임은 http://source.android.com/source/running.html 중간쯤 나와 있음 


$ lunch aosp_arm-eng 은...

arm 에뮬레이터용 빌드임...


$ lunch aosp_hammerhead-eng 이러면....넥서스 5 용.....

순정 H/W가 없기에... $ lunch aosp_arm-eng 로..;; 


9. 빌드


$ make -j4

"-j?"옵션은 사용할 CPU의 쓰레드 갯수


2CPU에....총 16core로 돌려도...1시간 정도....;;; 

내 경우에는 코어2듀오 1.8GHz에서 2RAM 돌리기다가...2시간만에 뻑남...


10. 설치하기


빌드가 완료된 파일은 /output/target/product/기기명 에 있음 

이 곳에서 빌드가 완료된 파일을 꺼내서 편한 위치로 옮긴 이후 "fastboot"를 이용하여 플래싱 


$ adb reboot bootloader

H/W를 adb를 통해서 부트로더로 진입 


$ fastboot flashall -w

플래싱...


-w 옵션은 wipes로....system, data, cache, Dalvik Cache 등의 영역을 초기화 시킴

처음에만 하고....두번째 부터는 안줘도 된다고 하는데....

























Comments