*이 튜토리얼은 Nexus 5X, Android 6.0.1(MTC20K) 기준으로 Linux(Ubuntu 14.04)환경에서 작성되었습니다.

목차

  1. Download AOSP
  2. Extract vendor proprietary binary
  3. Build AOSP Bullhead ROM
  4. USB Debugging + Bootloader Unlock
  5. Flash built ROM
  6. Install GApps

1. Download AOSP

사실 여기는 공식홈에서 시키는대로 하면 된다.

$ export PATH=~/bin:$PATH
$ mkdir ~/bin
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
# 또는 wget -O ~/bin/repo https://storage.googleapis.com/git-repo-downloads/repo
$ cd ~
$ mkdir my_rom
$ cd my_rom
# git config를 한 번도 하지 않았을 경우에만----------
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
# ---------------------------------------------------
$ repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r67
$ repo sync -j16

여기서 android-6.0.1_r67과 같은 브랜치 이름은 여기에서 확인할 수 있다.

2. Extract vendor proprietary binary

$ sudo apt-get install fuseext2
# fuse-ext2를 설치한다.
$ git clone https://github.com/anestisb/android-prepare-vendor
$ cd android-prepare-vendor
$ git reset --hard '335cbc79fb6ade03947da63a2752bd1045a075f6'
$ sudo ./execute-all.sh -d bullhead -b MTC20K -o ./ -g -y --smaliex
# fuse-ext2의 설정을 조금 바꿔주면 sudo 없이도 할수 있다.
$ sudo chown -R $(whoami):$(whoami) bullhead
$ mv bullhead/vendor ~/my_rom

vendor.img를 빌드하기 위해서 기기에 따른 파일들(driver, …)을 팩토리 이미지에서 뽑아내야 한다(자세한 이유는 해당 리포지토리의 Introduction을 읽어보자).

3. Build AOSP Bullhead ROM

$ cd ~/my_rom
$ source build/envsetup.sh
$ lunch aosp_bullhead-userdebug
# userdebug: 기본적으로 USB debugging 옵션이 켜져있다.
$ make -j16
# CPU가 지원하는 쓰레드 개수만큼 써서 빠르게 빌드하자
$ cd out/target/product/bullhead/
$ zip my_rom.zip *

이렇게 my_rom.zip에 빌드한 롬을 저장할수 있다.

4. USB Debugging + Bootloader Unlock

Settings -> Developer options에서 OEM unlockingUSB debugging 옵션을 켠다.

개발자 메뉴가 보이지 않는 경우

우선 Settings -> About phone에 들어가서 맨 아래 Build number를 계속 터치한다. 터치를 하다보면 어느 순간 You're now a developer!라는 메시지가 보일텐데, 다시 설정으로 돌아가면 Developer options가 보일 것이다.

5. Flash built ROM

$ adb reboot bootloader
$ sudo $(which fastboot) update my_rom.zip -w

6.Install GApps

우선 GApps의 경우 Recovery에서 설치해야 하기 때문에 TWRP를 다운로드 및 플래시해야 한다.

$ sudo $(which fastboot) flash recovery twrp.img

그리고 리붓! 리붓하면서 볼륨업 키를 빠르게 눌러서 리커버리로 진입하거나, 아니면 그냥 정상부팅 이후 adb reboot recovery를 이용해서 리커버리에 진입하도록 하자.

이어서 OpenGApps에서 ARM64용 Android 6.0 GApps PICO를 다운로드 받고, 기기에 올려서 바로 설치하고, 설치 이후 wipe cache까지 하고 정상부팅을 하면 거의 끝.

Pico에 강조를 해둔 것은, 굳이 push도 오래걸리고 설치도 오래걸리는 Stock으로 실험하기보단 일단 Pico로 시행착오를 끝내길 바라는 의미입니다.

$ adb push gapps.zip /sdcard/
# recovery모드에서도 push가 가능하다
# 설치는 GUI에서 적당히 하면 된다(Install -> gapps.zip 선택).
# 설치가 끝나면 wipe cache 버튼이 있을테니 그것도 한번 눌러주고, 리붓하자

adb가 안된다면, 메인 메뉴 > mount > enable MTP를 눌러 MTP를 활성화시키면 됩니다.

하지만 이후 정상부팅이 끝나면 약 5초 간격으로 Unfortunately, Google Play Service has stopped. 라고 끈질기게 에러가 날텐데, 직접 Settings -> Apps -> Google Play Service -> Permissions에서 권한을 모두 켜주거나, 이 방법을 따라 쉘로 퍼미션을 주어도 된다(pm grant 커맨드가 상당히 느리므로 끝에 &를 붙여서 백그라운드에서 수행하기를 추천, 그리고 AOSP에는 기본적으로 bash가 없을테니 그냥 adb shell 'sh /sdcard/fix_open_gapps_permissions.sh'로 수행하면 된다).