Nexus 5x bootloader unlock, TWRP recovery, decrypt, and Rooting


marshmallow android (6.0)이 업데이트 되면서 
Nexus 5x의 rooting이 이전들의 reference phone과 다르게 좀 새로운 것들이 포함된다.
이유는 SELinux의 전격 도입에 따른 문제 같다.
항상 Android는 Security 부분에서 많은 학계 논문들이 출간 되었는데 그동안 부분적으로 체택한 걱에 반해서 이번 버전에서는 전격적으로 모두 도입한것 같다. 따라서 여러번 해본 Rooting이지만 조금은 오랜만에 자세히 다뤄 본다.

현재까지 출시된 Nexus 5x version

bullhead" for Nexus 5X
6.0.0 (MDA89E)
6.0.0 (MDB08I)
6.0.0 (MDB08L
6.0.0 (MDB08M)
6.0.1 (MMB29K)
6.0.1 (MMB29P)

rooting 순서

Prerequisites

  1. Nexus 5x usb drives installation
  2. ADB and Fastboot installation
  3. USB debugging mode enable > Go to Settings > About device. Locate build no. and tap on it 7-8 times or until you get toast notification saying you’re now a developer’

Bootloader OEM Unlock

Enable OEM Unlock in developer options
go to Seetings > Developer Options -> Enable OEM Unlock

adb reboot bootloader

Bootloader로 reboot 된다. 그러면 아래의 두 메시지를 볼 수 있다.
SECURE BOOT - enabled
DEVICE STATE - locked

root@jemin-virtual-machine:~# fastboot oem unlock
...
OKAY [  8.031s]
finished. total time: 8.031s

DEVICE STATE - unlocked
boot loader unlcok을 하면, your softweare can't be checked for corruption. 이라는 메시지가 나오게 된다. unlock을 했으므로 보안에 취약한 것은 어쩔수 없다.

Flash modified bootloader image

이부분이 기존과 다른데 수정된 boot loader image를 올리지 않으면 루팅을 할 수 없게 된다.
자신의 build number에 맞춰서 다운 받는다.
boot image: http://forum.xda-developers.com/showpost.php?p=63781454&postcount=143

공식사이트: http://forum.xda-developers.com/apps/supersu/wip-android-6-0-marshmellow-t3219344

# fastboot flash boot boot.img 
target reported max download size of 536870912 bytes
sending 'boot' (11472 KB)...
OKAY [  1.506s]
writing 'boot'...
OKAY [  0.199s]
finished. total time: 1.705s

decrypt 확인
Setting -> Security -> Encrpt phon
팝업창으로 해당폰을 encrypt하라고 나온다면 정상적으로 decrypt된 것이다.
이제 SuperSU를 recovery 모드에서 찾을 수 있다.
이것이 안되면 Recovery mode에서 SuperSU.zip 파일이 보이지 않으니 반드시 이부분을 확인 해야 한다.

어째서 Modified boot.img를 flash 해야하는지에 대한 이유가 이 부분이다.

TWRP recovery mode 설치

공식사이트: https://twrp.me/devices/lgnexus5x.html
사용된 버전: twrp-2.8.7.0-bullhead.img

# adb reboot bootloader
# fastboot flash recovery twrp-2.8.7.0-bullhead.img
target reported max download size of 536870912 bytes
sending 'recovery' (16240 KB)...
OKAY [  2.084s]
writing 'recovery'...
OKAY [  0.264s]
finished. total time: 2.348s

WIPE
Wipe -> Format Data -> enter "yes" in the form
reboot -> do not install

swipe to factory reset의 경우 default 기능으로 user data from the phone, including your installed apps, cache, and dalvik cache를 초기화 한다. 하지만, This will not effect the internal or SD card storage area of your phone, meaning your documents, downloads, pictures, music, videos and other files will stay safe.
위에 언급한 부분까지 모두 wipe 하고 싶다면, Format Data를 사용 한다.

SuperSU

공식 사이트: http://forum.xda-developers.com/showthread.php?t=1538053
버전 변화 정보: http://forum.xda-developers.com/showpost.php?p=23427824&postcount=3
How-To SU: http://su.chainfire.eu/

SuperSU 2.66 beta 버전을 sdcard로 이동 시킴.
USB typeC 이므로 위에서 data transfer로 설정을 해줘야 SDCard가 인식 된다.

adb push BETA-SuperSU-v2.66-20160103015024.zip /sdcard/
975 KB/s (4272471 bytes in 4.275s)

결과

최종적으로 root checker basic app을 다운받아 확인해보면 아래와 같이 루팅이 성공한 것을 알 수 있다.

encrypt도 decrypt 되었으므로 성능 degradation 사라졌다.
Congratulations!

기타 자료

Recovery Mode

2014년만 해도 ClockworkMod (a.k.a CWM)이 거의 대부분 사용하는 custom recovery 모드 였다.

CWM recovery

최근, TeamWin Recovery Project(aka TWRP)에 의해서 완벽한 touch based custom recovery가 구현 되어졌다. 초반에는 단지 Nexus 계열의 장치만을 지원 하다가 최근에 들어서는 셀수 없이 많은 smartphone을 지원하기 시작 했다.

공식사이트: https://twrp.me/devices/lgnexus5x.html

TWRP recovery

Reference

YouTube: https://www.youtube.com/watch?v=mUq1xdJ-7-E#t=143
How to Root: http://forum.xda-developers.com/nexus-5x/general/guide-how-to-install-custom-recovery-t3231143
How To guide For Beginners: http://forum.xda-developers.com/nexus-5x/general/guides-how-to-guides-beginners-t3206930


Android app data backup and restore

데이터를 백업한다음 rooted phone에 올려서 구조를 분석 할때 좋다.

방법

adb backup [-f <file>] [-apk|-noapk] [-shared|-noshared] [-all] [-system|nosystem] [<packages...>]
# [-f <file>] 부분은 백업 데이터를 저장할 파일명입니다.
# [-apk|-noapk] 부분은 apk 파일, 즉 어플리케이션 설치 파일도 같이 백업할 것인가 설정하는 부분입니다.
# 설치 파일도 백업해놓으면 나중에 복원하면 해당 어플이 같이 설치가 됩니다.
# [-shared|-noshared] 는 sd 카드를 포함시킬 것인지 여부입니다.
# [<packages...>] 는 패키지의 이름입니다.

사용하는 명령어 구조

adb backup -apk -f backup.ad packageName

복원 방법

adb restore backup.ad


넥서스5 리눅스 환경에서 루팅하기 (Nexus 5 Rooting(루팅) in Ubuntu)


Unlock Bootloader

adb reboot bootloader
fastboot oem unlock

Flash Root

download: CF-Auto_Root
이미 다운 받았으므로: ~/Android_Platform/Nexus5에 존재한다.

unzip CF-Auto-Root-hammerhead-hammerhead-nexus5.zip
cd image/
sudo fastboot boot CF-Auto-Root-hammerhead-hammerhead-nexus5.img

install 화면에 SuperSU가 있으면 설치 성공이다.


갤럭시 S3 루팅 하기


다운로드

https://drive.google.com/file/d/0B4pme20nXq8laGxlT2RMMFF0Z0E/view?usp=sharing



1) 삼성 통합 드라이버 설치


2) 스마트폰을 다운로드 모드로 진입하기

종료후 

볼룸 하 + 전원 + 홈

경고창이 뜨면 계속 진행


3) Odin 프로그램 실행 하고

연결이 정상적이면 파란색이기 그것이면 그대로 진행


PDA 눌러서 각자 통신사에 맞는 auto-root 파일 임포트

스타트 눌러서 시작


최종적으로 PASS 뜨고 재부팅 대면 성공

스마트폰에 superSU 있으면 성공




Download Google Apps (GAPPS) for Android LolliPop


Custom ROM에는 GAPPS이라고 알려진 Google 관련 응용프로그램들이 포함되어 있지 않다.


이러한 Google에서 개발한 App들은 GAPPS이라 불리우는 zip파일 형태의 묶음으로 설치 할 수 있다.


편하게 설치하기 위해서 CWM과 같은 Custom recovery 모드가 있으면 편하다.



1단계: CWN과 GAPPS 다운 받기



PA gapps for android 5.1.x Lollipop Link

ROM Manager (CWM) Link



Gapps의 경우 여러 버전이 있지만, 통상 모든 Google service app들이 포함 되어있는 Stock 버전을 받는다.

아래 표를 참조해서 각각의 차이점을 숙지 하자.




2단계 설치하기


우선 다운받은 Gapps.zip파일을 phone의 외장 메모리에 넣는다.


그다음 CWM (Custom recvoery 설치)을 설치 한다.




정상적으로 CWM recovery mode로 진입하면

볼룸 업 다운키로 gapps.zip 파일을 찾아간다음 설치한다.

그다음 재부팅을 하면 정상적으로 Google app들이 바탕화면에 있는것을 볼 수 있다.






AOSP 5.1.0 (LMY47I) Build for Nexus 5 (hammerhead) 


Nexus 5 용 Android 컴파일해서 올리기



1. 환경설정


Ubuntu 14.04


sudo apt-get install bison g++-multilib git gperf libxml2-utils make zlib1g-dev:i386 zip


2. 소스코드 다운 받기



$ mkdir ~/bin

~/.profile 에 PATH 추가

PATH=~/bin:$PATH


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

$ chmod a+x ~/bin/repo


$ repo init -u https://android.googlesource.com/platform/manifest -b android-5.1.0_r3

$ repo sync -j8

android-5.1.0_r3 (LMY47I) 가 Nexus 5용 최신 branch 이다.

option 'j'의 의미는 동시에 받는 저장소의 갯수이다. 네트웍 환경에따라 늘릴수 있다.







3. 저작권 있는 바이너리 획득



Google Binaries for Nexus series 

위 사이트에서 LM471용을 다운 받았다.

각자 알맞게 다운 받는다.


AOSP root 디렉터리에 받은 3개의 파일을 압축 풀어 준다.



각각을 실행 하면 저작권 메시지가 나온다.


I ACCEPT를 타이핑하면 아래와 같이 정상적으로 제조사별 드라이버 파일들이 추출 되는것을 알 수 있다.



남은 2개의 .sh 파일에 대해서도 모두 같은 작업을 수행 한다.



4. 빌드


빌드 스크립트를 읽어 온다.


$ .build/envsetup.sh





어떤 타입으로 빌드 할지를 선택 한다.




최종적인 빌드 성공시 나오는 결과는 아래와 같다.




4. Flash



Smartphone 상태 변경

$ adb reboot bootloader

bootloader 상태로 이동 시킨다.

OEM Unlock 상태여야 한다.


이동

$ cd ~/Android_Platform/Android_L/out/target/product/hammerhead


전부다 업로드 할 것이라면 아래 명령어를 이용 한다.

fastboot -w flashall 


정상적으로 성공하면 아래와 같은 메시지를 볼 수 있다.





기타 정보


fastboot의 위치

AOSP의 아래에 있다.

out/host/linux-x86/bin






AOSP의 버전 관리



Overview



AOSP에 포함된 Git repository의 전체 리스트는

android.googlesource.com (Git Web Interface) 

에서 확인 가능하다. 


약 100개가 넘는 repository가 있다. 

Git 명령어로 하나씩 pulling 하는것은 매우 지루한 일이다.


그래서 구글에서는 Repo 유틸리티를 제공한다, 

Repo를 이용하면 이것들을 통합해서 git repositories들이 다운 받아 진다.


Repo는 manifest.xml 파일에 정의된 사항에 따라 Git repository를 받아오게 된다.

각각의 Git repository는 독립적인 Project로 관리 된다.


Repo 명령어의 사용 방법: https://source.android.com/source/using-repo.html#sync



Repo Init


repo init을 통해서 어떤 branch를 가져올지를 정하게 되는데,

https://android.googlesource.com/platform/manifest

platform/manifest 이 부분에 모든 branch들이 정의가 되어 있다.


repo init 뒤의 branch를 생략하게 되면 master branch를 다운 받아지게 된다.

master branch는 진행중인 project이므로 Google Developer들의 주석이나 팁들이 많이 포함되어 있다.

그리고 일반 개발자들이 기여한 코드들도 들어 있다.

따라서 정상적인 동작을 보장하지는 않는다.


이러한 branch들의 확인을 위해서 Git web site에서 직접 봐도 되고 git 명령어를 이용해도 된다.


git clone https://android.googlesource.com/platform/manifest.git

cd manifest



git tag

git branch -a

위 두 명령어를 이용해서 세부적인 리스트를 확인할 수 있다.


그리고 각 Branch 마다 지원하는 Device model과 특성이 다르가. 그것을 이해하기 위해서는

Codenames, Tags, and Build Numbers

를 읽어 보면 된다.


세부 사용법

$ repo init -u <URL> [<OPTIONS>]


Repo를 현재 작업 디렉터리에 설치

.repo 디렉터리를 생성함.

이것은 Repo 소스코드를 위한 Git 저장소와 표준 안드로이드 manifest 파일을 가지고 있다.

manifest.xml 이라는 심볼링 링크도 있다. 이것은 .repo/manifests/directory를 가리킨다.



Repo Sync



repo sync -j8

-j 뒤의 숫자는 병렬로 repository를 읽어올 숫자이다.

현재 network 상황에 맞추어 option을 줄 수 있다.




시도 리스트


Android 5.0.0_r6 프로젝트에

Android 51.0_r3을 repo init와 sync로 받았더니, 그냥 모두 덮어 씌어져 버렸다.





Nexus 5 (hammerhead) Android 5.0 factory image

 

(공장 이미지) 올리기


참고사이트: click

AOSP을 가지고 Custom rom을 제작하다가 실패할경우, 이곳에서 제공하는 Factory Image를 이용해서 복구할 수 있다.


To flash a system image



1. 위 참고사이트에서 nexus 5용 Factory Image를 다운 받는다.


2. Factory Image에는 GMS와 각종 제조사별 드라이버가 포함되어있다. 이것을 디컴파일 또는 리버스 엔지니어링으로 추출해서 재배포할경우 법적 책임을 물을 수도 있다.


3. 기본적으로 스크립트 사용을 위해서 fastboot를 환경 설정 해주어야 한다.


4. oem unlock (이미 했다면 무시)


adb reboot bootloader 

fastboot oem unlock 


5. Factory Image를 압축 푼다음, flash-all 스크립트를 실행 한다.

   이때 target phone은 bootloader 상태에 있어야 한다.


6. 실행 결과




Android_preview 올릴때와 다르게, radio를 비롯해서, 상당히 많은 데이터가 올라가는 것을 알 수 있다.

이것을 기반으로 Device properties를 extraction해서 AOSP를 Build하는 법을 다음번에 다루 겠다.





1단계: 부트로더 언락과 슈퍼 유저(루팅) 설치 


- ubuntu 환경에서 했다. 하지만 첨부파일을 이용하면 window에서도 할 수 있다. -


▣ 부트로더 언락, Note that 데이터가 모두 날라기니 주의 하세요.


1) 볼륨 2개와 + 전원 버튼을 동시에 4초간 눌러 리커빌 모드로 진입 합니다. 



2) 첨부 파일을 다운 받는다.


r3-galaxynexus-superboot.zip


3) 커멘드 창에서 fastboot devices라고 입력해서 장치가 정상적으로 연결 되었는지를 확인한다.

4) fastboot oem unlock을 적용 한다.


필자는 리눅스 환경에서 설정 하였ㄷ.

8) 겔럭시 넥서스에 경고창이 뜨고 그곳에서 볼륨 상/하 번튼을 이용해서 움직이고 yes를 선택후 전원버튼을 눌러서 실행을 하면 됩니다. 그럼 위와 같은 화면이 나오고 그러면 성공 한것이다.


▣ 슈퍼유저 설치, 루팅하기



1) bootloade로 진입 한다. 

adb shell reboot bootloader


1) 위에 첨부파일 디렉터리로 들어가서, install-superboot-linux.sh를 실행함.

   주의: Mac, Linux, window 별로 스크립트가 다르니 주의해서 실행



2) OKAY라고 메시지가 나오고 재부팅이 되어지면 성공이다.


3) 재부팅이 되어질 때 아래와 같은 자물쇠가 풀린 모양이면 된다.





2단계: CWM Recovery 설치하기. 

 

1) 우선 첨부파일을 다운로드 받는다.


recovery.img


2) 리커버리 모드로 진입을 해야한다. 진입방법은 아래와같이 여러가지다.


2-1) 볼륨버튼 2개 + 전원버튼을 눌러서 부트로더로 들어간다음 그곳에서 설치 한다.

2-2) adb reboot recovery 명령어를 이용해서 들어간다.


3) fastboot flash recovery recovery.img 를 실행 한다.



4) 위와 같이 OK 뜨게되면, CWM이 정상적으로 설치가 된 것입니다.

5) 절대로 지금 bootloader 화면에서 reboot을 하면 안됨.

reboot 할경우 recovery 이미지가 복구됨.


3단 계: 커스텀 롬 설치하기 


1) reboot 하지 않은 부트로더 화면에서 볼륨키를 이용해서 Recovery mode로 이동.

2) 커스텀롬을 SD 카드에 집어 넣는다.

3) CWM 리커버리에서 아래의 3가지 작업을 한다. 기존의 시스템을 삭제하는 행위이다.


wipe data/factory reset

wipe cache partition

advanced -> wipe dalvik cahce

이 세가지 wipe를 모두 해주셔야 합니다. 이유는 커스텀롬은 시스템적인 부분을 모두 건드리기 때문에 완전히 날리고 새로운 롬을 설치하는게 안전 합니다.


4) 단, 동일한 커스텀 롬을 사용하다가 업그레이드 버전을 설치하는 경우

advanced -> wipe dalvik cache를 해주면 됩니다.


5) 다시 처음으로 돌아가서, install zip from sdacrd를 선택해서 쭉쭉 들어가서 아까 넣은 파일을 선택하면 됩니다. 


1. Google 홈페이지에서 공장 초기화 버전을 다운 받는다.


한국에서 쓰는 버전은


주소: https://developers.google.com/android/nexus/images?hl=ko-KR 


Factory Images "yakju" for Galaxy Nexus "maguro" (GSM/HSPA+)


다른 버전들은 radio 드라이버가 맞지않아서 통화가 되지 않을 수 있다. 따라서 반드시 저 위의 버전을 다운 받아야 한다.


2. USB driver를 설치 한다.


삼성 USB driver를 반드시 설치해야한다.

SDK에 있는 google usb driver만 설치할경우 galaxy nexus장치가 인식되어 지질 않는다.



3. bootloader 에서 하는 작업들


-bootloader lock을 푼다.


adb reboot-bootloader

bootloader oem unlock


혹시라도 

fastboot devices를 입력해도

???? devices라는 메시지가 나오지 않다면,


이것은 타겟과 PC에서의 fastboot 버전이 맞지 않아서일 가능성이크다.

따라서 fastboot 버전을 이리저리 변경을 해줘야한다.

우선은 필자가 되는 버전을 아래에 첨부 한다.


fastboot.zip



잘되면 아래의 명령어들을 이용해서 설치를 한다.



어느정도의 시간이 지나면 재부팅이되고 순정으로 돌아오게 된다.


Cyanogen Mode Full Update Guide Site


<CWM 모드를 Nexus-one에 설치하는 방법이 나와 있다.>


http://wiki.cyanogenmod.org/wiki/Nexus_One:_Full_Update_Guide 



<cyanogen mod 7을 받아서 nexus one으로 compile 하는 방법>


http://wiki.cyanogenmod.org/wiki/Nexus_One:_Compile_CyanogenMod_(Linux) 

http://dlwpals001.blog.me/60154562600

위 방법을 모두 충실히 따라 해야한다.

RomManager도 설치를 해야 한다. 그래야 build option에 passion이 나온다.

extract.sh를 꼭 실행해서 .so 파일을 모두 추출 해야 한다.



< compile시 문제가 생긴다. 카메라 공유 라이브러리 관련해서 >


참조사이트: http://forum.cyanogenmod.org/topic/35075-qundefined-reference-to-opencamerahardware-on-cm7/


핵심 수정사항

The provided solution to set "USE_CAMERA_STUB := false" in device/htc/passion/BoardConfig.mt did not work for me. However I found the config-file device/htc/passion-common/BoardConfigCommon.mk which contains an option BOARD_USE_FROYO_LIBCAMERA which was set to true. So I assume it expected an outdated libcamera (from FroYo release), but my libcamera.so was already updated and on GIngerbread level. So setting this option tofalse, running make clean and re-starting the build succeeded!


Confirmed.
I had the same problem in my ViewSonic.

Solved by:
cd home/lior/android/system/device/malata/smb-common/
gedit BoardConfigCommon.mk 
And setting:
BOARD_USE_FROYO_LIBCAMERA to false


위와 같이 3군대를 false로 변경하면 정상적으로 컴파일이 이루워 지게 된다.

Google에서는 Version Control을 위한 Repo와 Git 


android source code를 작업하려고 할 때 어쩔수 없이 Repo Git를 이용해야할 것이다.

즉, 안드로이드의 경우 많은 프로젝트들이 합쳐진 형태이다. 따라서 git가 1개만 쓰인것이 아니라. 매우 많이 쓰인것이다. 따라서 이러한 서로 흐터져 있는 저장소의 코드를 받아오기위해서 repo를 이용하게 된다.

 

repo의 정채는 그냥 git 명령어를 조합해서 실행하는 Pthyon 프로그램이다.

이렇게 Android Open source Project를 모두 다운 받은 다음에는 git와 repo를 사용해서 소스코드를 관리해야한다. 여기서 중요한것은 git은 각각의 프로젝트에 맞게 설정되어 있다는 것이다

무슨 말이냐하면

system, build .. 이런 각각의 디렉터리가 프로젝트가 된다.

필자의 경우 모든 프로젝트를 git 하나로 관리해보려고 했으나, 속도문제도 있고, commit이 잘 안되는 문제가 발생 했다.

그래서 그냥 기존에 있는 git의 구조를 사용하기로 했다. 이 글을 보는 사람도 그렇게 할 것을 추천 드린다.

 

그런 의미에서 구글에서 설명한 Version Corntorl 문서를 정리해 보도록 한다.

 

대부분의 경우에 대해서 Repo 대신에 Git를 사용할 수 있다. 또한 복잡한 Command들에 대해서는 Repo Git를 혼용해서 사용할 수 있다.

하지만 basic한 작업에 대해서는Repo만을 사용하는 것이 당신의 작업을 보다 간단하게 만들 것이다.

Git : open-source-version-control을 위한 시스템으로 이것은 아주 큰 프로젝트를 관리하기 위해서디자인 되어졌다.

우리는 Android context에 대해서 git local opertion들을 사용한다. 예를 들면, branching, commits, diffs, edits이다.

android project를 셋업 하는데의 하나의 도전적 과제는안드로이드 프로젝트를 어떻게 쉽게 배포하는가 이다. 이것을 위해서GIT를 선택 했다.

Repo : 이것은 repository management tool이며, 이것은 GIT위에서 개발 되었다.

Repo는 많은 Git Repository들을 통합했다. 즉, Android project는 여러 개발 프로젝트가 통합된 것이기 때문에 서로 다른 Git Repository가 사용되어져 왔다.

그리고 repo를 통해서 우리의 Revision Contro System으로 upload 되어 진다.

이것은 필요에 따라 Git repositroies들을 통합한다. 개발 작업 흐름과 같은것들을 자동으로 관리할 수 있다.

Repo Git를 대신하는것이 아니다. 그것은 단지 GIT를 이용해서 Android 프로젝트를 좀 더 쉽게 관리하기 위해서 만들어진 것이다.

repo 명령어들은 Pythonscript들을 실행하는 것이다.

Repo command를 이용해서download file multiple 저장소에서 할 수 있다.

Gerrit : 이것은 git를 사용하는 프로젝트에대한 웹 기반의 코드 리뷰 시스템이다. Gerrit는 권한히있는 사용자가 submit 변경 Git를 통해서 집중화 하는 것을 장려한다. 이것은 코드 리뷰가 통과한경우 자동으로 병합되어 진다. 게다가 Gerrit는 뭐 뭐가 변경 되었는지 브라우저를 통해서 귑게 알 수 있게 한다.

 

Basic Workflow

저장소화 인터렉팅 하는 기본적인 패턴은 다음과 같다.

1) repo start 명령어를 이용해서 새로운 branch를 생성한다.

2) file을 추가하거나 수정을 한다.

3) git add를 사용해서 변화를 스테이징 한다.

4) git commit을 이용해서 스테이징된 것을 commit 한다.

5) repo upload를 통해서 변화된 정보를 server로 보낸다.

 

Task reference

Synchronizing your client

원격 저장소와 클라이언트 작업 디렉터리를 모든  Project들에 대해서 동기화 시킨다.

>repo sync

 

선택적인 프로젝트만 동기화 시킨다.

>repo sync project_name

 

Creating topic branches

언제든지 로컬 작업 공간에 변화를 주고자 할 때 새로운 이슈를 저장하고 있는 Branch를 생성한다.

 이렇게 생성된 각각의 branch들은 고립되어져 있다.

> repo start BRANCH_Name

새로 생성한 branch를 확인 하는 방법

>repo status

 

브랜치에 특별한 프로젝트의 내용을 담을 수도 있다.

> git start BRANCH_NAME Project

특정 브랜치로 이동하는 방법

> git checkout BRANCH_NAME

현재 존재하는 Branch들을 확인 한다.

> git branch or repo branches

 

Note: A bug might be causing repo sync to reset the local topic branch. If git branch shows * (no branch) after you run repo sync, then run git checkout again.

 

Stating files

commit하기전에 스테이징 작업을 해야한다.

즉 어떤 버퍼에 커밋할 파일을 등록 해주는 작업이다. 불필요해 보이지만 꼭 필요한 작업이다.

>git add

파라메터로는 파일 또는 디렉터리를 받는다.

그리고 스테이징 되어진 파일은 삭제될 수도 있고 수정 될 수도 있다.

 

Viewing client status

작업 공간에서의 파일들의 상태를 볼 수 있다.

> repo status

 

커밋 되지 않은 파일과 HEAD의 파일을 비교해서 차이점을 보여 준다.

repo diff

 

cd ~/WORKING_DIRECTORY/PROJECT

git diff --cached

이것은 즉, 안드로이드 플랫폼 소를 몽땅 다 받으면 그 하나하나의 디렉터리가 프로젝트가 된다.

즉, 그 디렉터리 안에가면 .git가 또 있다.

--cached 옵션은 스테이징 영역과 저장소의 차이점을 보여 준다.

그냥 git diff하면 작업트리와 스테이징 영역과의 차이점을 보여준다.

저장소(HEAD) // 스테이징 // 작업트리

이렇게 3개의 구조로 되어 있을 것이다.

 

committing changes

commit 이라는 것은 revision control system에서 아주 기초적인 명령이다.

git에서 commit은 간단하게 실행 할 수 있다.

> git commit

만약 do not add a log message가 나온다면 commit은 거부 된것이다.

새로 추가되어저야할 파일은 스테이징 한다음 commit을 해야 한다.

 

Uploading changes to Gerrit

 

업로딩 이전에 가장 최신 버전의 revision들로 업데이트 하자.

>repo sync

그다음 실행한다.

repo upload

 

이 변화 모록들은 이 때까지 commit을 헀었던 것들이다.

review server로 업로드할 branch를 선택 하여야 할 것이다.

 

□ Recovering sync conflicts

만약 repo sync가 충돌 현상을 보인다면

 

status code =U, 즉 파일들이 합병되지 않는 상태를 보이는 것이다.

충돌 지역의 수정이 절대적으로 필요 하다.

일단 관련 프로젝트 디렉터리로 가서 변경을 해야하는데,

그 곳에 있는 git의 기능을 최대한 활용 하자.

즉 파일을 추가하고

commit을 하고

rebase --continue를 한다. 예제는 다음과 같다.

> git add .

> git commit

> git rebase --continue

 

rebase가 완료되면 repo sync를 다시 한다.

 

Cleaning up your client files

변경된 부분을 통합해 준다.

repo sync

안전하게 추가된 branch들을 제거 한다.

repo prune

 

Deleting a client

> rm -rf

 

Git and Repo cheatsheet 

 

 

□ Repo command reference

 

repo 명령어 사용의 기본적인 패턴은 아래와 같다.

repo command options

 

일단 Repo가 설치되어 있다면 도움말 명령어를 실행 할 수 있다.

repo help command

 

repo의 많은 명령어들은 Project 이름을 아규먼트로 받고 있다.

이것은 특별한 project의 이름 일 수도 있고, 아니면 로컬 디텍터리의 프로젝트 경로를 입력해도 된다.

repo sync [project0 project1 ... projectN]

repo sync [/PATH/TO/PROJECT0... /PATH/TO/PROJECTN]

 

 

repo의 커맨드 종류

  abandon      Permanently abandon a development branch

  branch       View current topic branches
  branches     View current topic branches
  checkout     Checkout a branch for development
  cherry-pick  Cherry-pick a change.
  diff         Show changes between commit and working tree
  download     Download and checkout a change
  grep         Print lines matching a pattern
  init         Initialize repo in the current directory
  list         List projects and their associated directories
  prune        Prune (delete) already merged topics
  rebase       Rebase local branches on upstream branch
  smartsync    Update working tree to the latest known good revision
  stage        Stage file(s) for commit
  start        Start a new branch for development
  status       Show the working tree status
  sync         Update working tree to the latest revision
  upload       Upload changes for code review

 

abandon

 

branch

 

branches

 

checkout

 

cherry-pick

 

diff

 

download

 

grep

 

init

> repo init -u URL [OPTIONS]

 

repo를 현재 디렉터리에 설치 한다. git 저장소를 위한 repo 소스코드와 Standard Android Manifest.files를 담고 있는 .repo를 현재 디렉터리에 생성 한다.

The

.repo/ directory also contains manifest.xml, which is a symlink to the selected manifest in the .repo/manifests/ directory.

 

Options:

  • -u: specify a URL from which to retrieve a manifest repository. The common manifest can be found at https://android.googlesource.com/platform/manifest

  • -m: select a manifest file within the repository. If no manifest name is selected, the default is default.xml.

  • -b: specify a revision, i.e., a particular manifest-branch.

Note: For all remaining Repo commands, the current working directory must either be the parent directory of .repo/ or a subdirectory of the parent directory.

 

 

prune

 

rebase

 

smartsync

 

stage

 

start

 

status

 

sync

>repo sync [PROJECT_LIST}

Downloads new changes and updates the working files in your local environment. If you run repo sync without any arguments, it will synchronize the files for all the projects.

When you run repo sync, this is what happens:

  • If the project has never been synchronized, then repo sync is equivalent to git clone. All branches in the remote repository are copied to the local project directory.

  • If the project has already been synchronized once, then repo sync is equivalent to:

git remote update
git rebase origin/BRANCH

 

where BRANCH is the currently checked-out branch in the local project directory. If the local branch is not tracking a branch in the remote repository, then no synchronization will occur for the project.

  • If the git rebase operation results in merge conflicts, you will need to use the normal Git commands (for example, git rebase --continue) to resolve the conflicts.

  • After a successful repo sync, the code in specified projects will be up to date with the code in the remote repository.

    Options:

    • -d: switch specified projects back to the manifest revision. Helpful if the project is currently on a topic branch, but the manifest revision is temporarily needed.

    • -s: sync to a known good build as specified by the manifest-server element in the current manifest.

    • -f: proceed with syncing other projects even if a project fails to sync.

     

    upload

     

     

     

    + Recent posts