안녕하세요!

두번째 시간입니다!


본 게시글은 아래 링크에서 모든 시리즈 혹은 관련 포스팅을 보실수 있습니다.


http://minnote.net/category/iCAROS%20Works/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%20%EB%94%B0%EB%9D%BC%ED%95%98%EB%8A%94%20%EA%B0%9C%EB%B0%9C


먼저 본 글은 윈도우나 리눅스등 운영체제나 기본적인 컴퓨터 상식정도는 알고있으신 분들을 중점으로 작성한 문서 입니다.

이번 글 부터는 복잡한 이전 방식을 대체하려고 하이퍼 링크로 본인이 필요하신 부분으로 바로바로 갈수 있도록 준비했습니다.


또한 글 내에 아래 두개와 같은 초록색 혹은 빨간색 글상자를 발견하신다면, 아래와 같은 역활을 합니다.


직접 키보드로 입력하셔야 하는 문구들


많이들 겪는 오류나 조심하셔야 하는 부분


그럼 본격적으로 시작하겠습니다.

목차 입니다.


따라하는 빌드 #2 안드로이드 소스 (sync) 다운로드


1. 소스 다운로드를 위한 기본 준비


2. 안드로이드 소스 다운로드

2-1. 원하는 소스 다운로드

2-1-1. Android Open Source Project 다운로드

2-1-2. Cyanogen Mod 다운로드

2-2. 공통작업 다운로드


3. 이 과정을 마치며!


이러한 순서로 진행하게 됩니다.

위 링크들을 클릭시 필요하신 부분으로 이동 됩니다.성성


1. 소스 다운로드를 위한 기본 준비

우선 구글의 안드로이드 Git 작업을 더 쉽게 해주는 구글의 Repo 라는 녀석을 설치해야 합니다.


Repo에 대한 자세한 정보는

https://source.android.com/source/developing.html (영문)


위 링크에서 보실수 있습니다.

 

방법은 상당히 간단합니다.

 

mkdir -p ~/bin 


위 명령어를 터미널에 입력해 줍니다.


위 명령어는 내 홈디렉토리 (/homin/(계정명) 을 ~ 로 리눅스에서 빠르게 이동 및 표현이 가능합니다)안에 bin이라는 폴더를 만들라는 명령입니다.

-p 옵션은 하위 디렉토리 까지 만들라는 뜻인데, -p 없이 mkdir ~/1/2/3 을 치면 오류가 납니다. ~/1/2/3 은 1폴더 속 2폴더 속 3폴더를 만들라는 뜻인데 1 과 2 폴더가 없으니 오류가 납니다.

-p는 1과 2까지 알아서 만들라는 녀석 입니다 .(사실 잘 몰라요 ㅌㅌ)


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

chmod a+x ~/bin/repo


위 처럼 입력해 주시면 기본적인 준비가 끝났습니다!


하지만 우리는 작업할 공간을 지정 해야 합니다.


위 mkdir 명령어를 응용같진 않지만 응용하셔서 자신이 원하시는 작업 공간을 만드시거나, 탐색기를 이용하셔서 만들어 주시면 됩니다.

여기서 뜻하는 작업공간은 안드로이드 소스를 받고, 빌드할 공간 입니다.


제 기준으로는 /home/icaros7/workspace/cm 입니다.

꼭 workspace 폴더 속 AOSP폴더가 아니어도 됩니다.


mkdir -p ~/workspace/cm


다 만들어 주셨다면, 터미널로 그 폴더로 이동 해야 합니다.

아래는 제 기준 입니다.


cd ~/workspace/cm



2. 안드로이드 소스 다운로드

2-1. 원하는 소스 다운로드


이중 본인이 원하시는 것을 받으시면 됩니다.

매우 많은 소스가 존재하지만 필자는 가장 대표적인 AOSP소스와 CM소스만을 다루겠습니다.


2-1-1. Android Open Source Project 다운로드


우리가 흔히 이야기하는 AOSP 소스 입니다. 구글에서 배포하는 순수한 안드로이드 소스 입니다.


먼저 자신이 다운로드 하고 싶은 안드로이드의 버전을 정해야 합니다.


원하는 안드로이드 버전은 아래 리스트에서 확인 하셔야 합니다.

https://source.android.com/source/build-numbers.html#source-code-tags-and-builds (영문)


위 링크는 매일 새로운 버전이 생긴다면 업데이트 됩니다.


위 링크 리스트에서 우리가 필요한 것은 해당 안드로이드 버전의 Branch 값 입니다.


예를 들어

2015년 9월 24일 필자가 이 글을 작성하는 기준으로 가장 최신의 안드로이드 버전인 android-5.1.1_r18 입니다.


repo init -u https://android.googlesource.com/platform/manifest -b android-5.1.1_r18


 위 명령어를 터미널에 입력해주시면 repo가 알아서 저 위치의 소스를 받아올 준비를 하게 됩니다.


준비가 완료되셨다면, 아래 2-2로 이동해주세요.


2-1-2. Cyanogen Mod 다운로드


우리가 흔히 이야기하는 CM 소스 입니다. CyagnogenMod 팀에서 아니 이제 회사라고 해야 하나요...아무튼 CM에서 배포하는 소스 입니다!


먼저 자신이 다운로드 하고 싶은 CM의 버전을 정해야 합니다.


원하는 CM의 버전은 아래 사이트 중 드롭다운 목록에서 확인이 가능합니다.


https://github.com/CyanogenMod/Android (영문)



저~기 빨간색 테두리가 있는 녀석을 눌러서 나오는 리스트를 확인해주시면 됩니다.


예를들어

2015년 9월 24일 필자가 이 글을 작성하는 기준으로 가장 최신의 안드로이드 버전인 cm-12.1 입니다.


repo init -u https://github.com/CyanogenMod/android.git -b cm-12.1


 위 명령어를 터미널에 입력해주시면 repo가 알아서 저 위치의 소스를 받아올 준비를 하게 됩니다.


준비가 완료되셨다면, 아래 2-2로 이동해주세요.


2-2. 공통작업 다운로드


위 2-1 옵션에서 원하는 소스의 다운로드를 준비시켰다면 이제 repo sync 를 받아야 합니다!

방법은 매우 간단합니다 흐흐


터미널에서 진짜로 repo sync 만 쳐주시면 다운로드 됩니다, 속도가 매우 발암을 유발함으로 한번에 여러개의 파일을 다운로드 해주어야 합니다.

공식 사이트들에서 권장하는 동시 다운로드수는 2~6개 정도이지만, 필자는 40개씩 받을껍니다. (...) 한번 받고 누락된 파일을 다시 다운로드 해주는 과정을 거처준다면 문제 없습니다!

원하는 동시 다운로드 수는 repo sync 명령어 뒤에 -jXX 를 붙여서 가능 합니다.


예를 들어 필자의 경우


repo sync -j40


입니다.



성공적으로 다운로드가 되었다면, 위 처럼 repo 가 Sync 작업을 합니다!

그런데 전 지금 CM서버에 문제가 있나 몇몇 파일이 404 오류를 뿜으며 계속 누락 되는군요.

그래서 다음번에 받기로 했습니다~

3. 이 과정을 마치며!

이번 역시 따로 쓸 말이 없네요...뭔가 엄청나게 어려운걸 한게 없어서...ㅎㅎㅎㅎ

안녕하세요!

오랜만에 이 시리즈 글을 쓰네요. (아니 새로 구성하고는 처음이지요? ㅌㅌ)


본 게시글은 아래 링크에서 모든 시리즈 혹은 관련 포스팅을 보실수 있습니다.


http://minnote.net/category/iCAROS%20Works/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%20%EB%94%B0%EB%9D%BC%ED%95%98%EB%8A%94%20%EA%B0%9C%EB%B0%9C


먼저 본 글은 윈도우나 리눅스등 운영체제나 기본적인 컴퓨터 상식정도는 알고있으신 분들을 중점으로 작성한 문서 입니다.

이번 글 부터는 복잡한 이전 방식을 대체하려고 하이퍼 링크로 본인이 필요하신 부분으로 바로바로 갈수 있도록 준비했습니다.


또한 글 내에 아래 두개와 같은 초록색 혹은 빨간색 글상자를 발견하신다면, 아래와 같은 역활을 합니다.


직접 키보드로 입력하셔야 하는 문구들


많이들 겪는 오류나 조심하셔야 하는 부분


그럼 본격적으로 시작하겠습니다.

목차 입니다.


따라하는 빌드 #1 안드로이드 개발 환경 구성


1. 64비트 우분투 설치


2. 안드로이드 개발 환경 구성

2-1. 자바 설치

2-2. 필수 패키지 다운로드

3-3. ADB 사용을 위한 규칙 수정


3. 이 과정을 마치며!


이러한 순서로 진행하게 됩니다.

위 링크들을 클릭시 필요하신 부분으로 이동 됩니다.성성


1. 64비트 우분투 설치


먼저 본 글에서는 64비트 우분투를 권장하고 있습니다. 하지만 본인의 기호에 따라 다른 리눅스 계열 운영체제를 설치하셔도 무방합니다만, 그에 따라 해당 운영체제의 명령어는 따로 입력하셔야 합니다.

본 글은 우분투 14.04.3 64비트를 기준으로 작성하였습니다.

※왜 64비트 리눅스를 설치하나요?
사실 32비트 우분투를 설치하셔도 무방하도 합니다. 하지만 구글에서 64비트 운영체제를 기준으로 64비트에서 필요한 라이브러리들을 알려주고있음으로 전 64비트 사용합니다.
실제로 32비트에서는 더 잦은 빌드 오류가 있다고 합니다만 전 직접 안써서 모르겠네여
그리고 우분투의 32비트는 램이 2기가 이하의 저사양 컴퓨터용으로 제공되고 있습니다. 하지만 안드로이드 빌드과정에서 램이 2기가로는 많이 부족합니다. 고로 64비트 설치했습니다!!!
(만일 자신의 램이 2기가 이하라면, 일딴 64비트를 설치하시고 가상 메모리를 스왑하셔야만 합니다. 안그러면 빌드 중간에 램부족해서 빌드가 중단됩니다)

먼저 우분투 ISO 이미지등을 다운로드 해야만 하겠지요?
원랜 우분투 공식 홈페이지로 이동하나, 우리가 그곳에서 할일은 없습니다! 그저 다운로드.
따라서 다음에서 제공하는 우분투 한국 서버 FTP 에 대해 링크를 걸었습니다.

http://ftp.daum.net/ubuntu-releases/14.04.3/ <- 요 링크를 가셔서 "ubuntu-14.04.3-desktop-amd64.iso" 를 다운로드 하시면 됩니다.

그게 귀찮으시면 여기 를 클릭하시면 바로 다운로드가 진행 됩니다.
이 글을 읽고계신분이 국내에 계시다면야 빠른 시간내에 다운로드가 완료 됩니다.

다운로드가 모두 완료되셨다면, 이제 내가 우분투를 어떠한 방식으로 설치하실까를 고민 하셔야 합니다.

1. 하드디스크에 직접적으로 우분투 설치 (파티션 조정을 하거나 포멧이 필요)
2. wubi를 통한 윈도우 안에 우분투 설치 (추후 가상 디스크 확장 작업 필요)
3. VM웨어,버추얼 박스등의 가상 머신 프로그램을 통한 우분투 설치

저는 개인적으로 1번과 3번을 가장 적극 추천 드립니다. 2번 과정은 추후 가상 디스크를 따로 확장 하셔야 합니다.
저는 3번 과정을 선택했습니다. 1번의 경우 컴퓨터의 모든 성능을 우분투에다가 할당이 가능 함으로 중사양 사용자 혹은 저사양 사용자에게 추천하고 싶은 방식입니다.
3번의 경우 윈도우가 정상 부팅된 상태에서 윈도우 안에 또하나의 운영체제를 실행하는 방식입니다. 다시말해 한 컴퓨터로 두개의 운영체제를 구성함으로 어느정도의 사양이 요구 됩니다만 리눅스 계열은 윈도우 만큼 많이 쓰지 않아 중사양 사용자나 저사양 사용자도 하셔도 무방 합니다. 램이 많으면 좋지만요~ 또한 이 3번의 장점은 SSH등을 이용해 윈도우에서 리눅스의 명령 프롬프트(?)를 띄우고 개발하는것이 가능합니다. 나중에 다시한번더 언급 하겠습니다. 1번 과정도 2대 이상의 컴퓨터가 같은 내부 네트워크 안에 있다면 가능 합니다.

일딴 기본적으로 안드로이드 빌드를 하시려면 "최소 30기가 이상의 공간이있는 디스크"에 우분투를 설치하셔야 합니다.

이 과정은 딱히 뭐라 적을것도 없고, 할것이 없어서 그냥 사진 한장으로 대체 합니다.



요요
(이전 글 사진인건 안비밀)


2. 안드로이드 개발 환경 구성

우분투가 모두 성공적으로 설치 되셨나요

바로 급하지만 우리는 안드로이드 개발 환경 구성을 해야 합니다,


우분투가 모두 부팅이 되셨다면, 컨트롤키 + 알트키 + T키를 눌러주세요.




위와 같이 우분투의 내장 터미널이 실행될것 입니다.


우분투는 여기서 모든 작업이 가능 합니다. NT커널을 사용하고 DOS를 대체하는 명렴프롬프트만이 존재하는 윈도우와는 많이 다르게 모든 작업이 가능 합니다.

오히려 저는 종종 마우스로 누르는거보다 여기서 작업하는게 더 편한 경우도 있습니다만은 파일 관리는 마우스가 편합니다 ㅎㅎ


우선 자신이 개발할 안드로이드 환경을 정하셔야 합니다.

여기까지 오신분이라면 안드로이드에 대한 기본 지식은 있다 생각하겠습니다.


2-1. 자바 설치


롤리팝 5.0 이상의 안드로이드의 경우 자바 이용시 7버전을 사용 합니다.

진저브레드 2.3 이상의 안드로이드에서 킷켓 4.4의 안드로이드까지는 자바 이용시 6버전을 사용합니다.

컵케잌1.5 이상의 안드로이드에서 프로요 2.2의 안드로이드까지는 자바 이용시 5버전을 사용합니다.


자신이 해당하는 부분의 자바를 설치해야함을 기억 해주세요~


이 글에서는 롤리팝 소스를 받고, 안드로이드 사이트 master 브랜치를 받으시는 경우 무조건 늘 최신 버전의 자바를 설치하시면 됩니다.



sudo apt-get update

sudo apt-get install openjdk-7-jdk



우선 자바를 설치하시 위해 우분투에서 주로 쓰이는 OpenJDK 를 설치 합니다.


만일 성공적으로 설치 되신 경우에는 "java -version" 명령어를 입력하시면 아래와 비슷하게 나오셔야 합니다.



2-2. 필수 패키지 다운로드


그런 다음 안드로이드 개발에 꼭 필요한 필수 패키지 들을 설치하셔야만 합니다.


본 글은 우분투 14.04 를 기준으로 작성하였습니다.



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



성공적으로 설치가 완료되셨다면 개발환경 구성의 반이상이 끝났습니다!

아래서부터는 필수 과정은 아닙니다만은 없으면 많이 불편하죠.


2-3. ADB 사용을 위한 규칙 설정

개발과정중 ADB사용이 안된다면 상당한 불편함이 있습니다.


일딴 우분투에서는 기본적으로 각종 핸드폰 제조사별 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



위 문구를 터미널에서 입력해 줍니다. 그러면 알아서 구글에서 가장 최신의 정보가 적혀있는 녀석을 알아서 설치하고, 필요한 서비스를 재시작 해줍니다.

(저도 이글쓰면서 처음 알았네요. 이때까지 늘 따로따로 직접 했는데...)


3. 이 과정을 마치며!

모든 과정이 오류 없이 성공적으로 준비 되셨나요?

그렇다면 이미 안드로이드 빌드 과정에 한 100분의 1쯤 다가 왔습니다 (...)

왜냐하면 안드로이드 소스를 받는게 100분의 98 이거든요!!!! 아오 오래걸려라


만약 여기까지하시는데 멘탈이 깨지신다?!?!!?

이제 빌드중에 오류나시면 훨훨 날라가십니다.

단단히 준비하세요!


사실 이 편에서는 여기다가 적을께 뭔가 없네요.


다음에 뷉겠습니다!

안녕하세요.

오늘은 다름이 아니라 LG 옵티머스Q2의 루팅 과정에 대해 좀 이론 처럼(?) 뺵빽 하게 적어 봅니다.

 

저도 초보이지만, 메모 차원에서 글을 남깁니다.

 

먼저 이글은 옵티머스Q2의 최초의 아이스크림 샌드위치 펌웨어인 137펌웨어를 기준으로 작성했습니다.

 

먼저 이글은 백원만님 (jungil0502@naver.com)에 의해 만들어질수 있었던 방법 입니다.

 

읽으시기전 유용할것이다 라고 생각 되면 손가락 한번씩만 눌러주십시요~^^

모바일이라면 맨 아래에서라도 괜찮다 싶으면 눌러주세요 ㅠㅠ

 

먼저 옵티머스Q2는 120,126,128 진저브레드 펌웨어 그리고 131 유출 아이스크림 샌드위치때는 부트로더 락이 걸려있지 않았습니다.

 

 

하지만 이번 137 ICS펌웨어에선 부트로더 락 이 걸리게 되었습니다.

 

엔디비아 테그라2 AP2Xh 의 부트로더에 관한 자세한 내용은 영구땡칠님이 정리하신 글이 있습니다.

http://cafe.naver.com/androidhacker/323 위 글 참조해 주시면 될듯 합니다.

또한 이 부트로더의 크랙 관련글도 위 링크에 같이 있습니다.

※크랙과 언락은 약간 다릅니다. 주로 언락은 제조사에서 부트로더 언락을 공식적으로 지원하는 경우에 사용하고, 크랙은 사용자가 직접 부트로더를 수정하는 경우가 됩니다.

 

이 부트로더를 크랙을 해야지만 옵티머스Q2는 루팅이 가능 합니다.

 

옵티머스Q2에서 사용하는 루팅 방식은 아래와 같습니다.

 

1. 부트이미지의 램디스크의 default.prop에서 adb 연결시 자동으로 root 권한으로 실행되게 수정

2. 부팅 완료후 adb 를 이용해 루팅 관련 파일 (su 바이너리, SuperSU등) 주입

3. 재부팅

 

위와 같은 과정을 사용했습니다.

하지만 이번엔 부트로더의 락에 의해

수정된 부트이미지를 부트 영역에 넣고 부팅을 할 경우 LG벽돌이 됩니다. (옛날 옵큐의 OZ벽돌이나 요즘 옵티머스의 시큐리티 에러등)

부트로더가 부트이미지가 순정 이미지가 아니라면 그대로 부팅을 중지시킵니다.

 

그러하여 4단계로 나눠지게 되었습니다.

 

1. 부트이미지의 램디스크의 default.prop에서 adb 연결시 자동으로 root 권한으로 실행되게 수정

2. 백원만님의 크랙된 137 부트로더 적용

3. 부팅 완료후 adb 를 이용해 루팅 관련 파일 (su 바이너리, SuperSU등) 주입

4. 재부팅

 

옵티머스Q2의 경우엔 Nvidia 사의 테그라2 3D AP25H 칩셋을 사용해 APX 모드라는 녀석이 사용이 가능 합니다.

APX 모드는 Fastboot 등과 같은 역활을 합니다. 허나 테그라2 AP20H를 사용하는 아트릭스 같은 경우엔 apx모드 사용이 불능 하여 Fastboot 을 사용합니다.

 

아무튼 APX 모드라는 꽤나 강력한 놈이 있기에 우린 부트로더도 손쉽게 플래싱이 가능 합니다.

APX라는 녀석이 있어서, 옵티머스 2x, Q2, Ex는 벽돌 불가폰이 되었습니다.

 

nvflash 라는 프로그램과 관련 라이브러리를 따로 구하셔야 합니다만 전 원 출처를 잘 몰라 제가 소유하고 있는 파일을 사용합니다.

 

nvflash.exe --bl 부트로더파일 --download 파티션번호 이미지.img

 

가 기본적인 명령 입니다.

간단히 플래싱을 할 경우에 사용하는 명령어 입니다.

 

옵티머스Q2의 경우엔 부트로더 영역은 4번 파티션 입니다.

 

 

 

하지만 크랙 부트로더 플래싱은 가장 마지막에 해야 합니다.

먼저 수정된 부트 이미지를 플래싱 합니다.

 

nvflash --bl bootloader.bin --download 12 ics137boot.img

# nvflash.exe --bl nvflash용부트로더 --download 12번부트로더파티션 수정된부트이미지 

 

nvflash 의 --bl 명령어는 먼저 nvflash.exe와 APX모드를 연결할때 사용하는 부트로더를 먼저 4번 부트로더 영역에 플래싱 합니다.

저 nvflash 용 부트로더는 진저브레드때의 부트로더 입니다.

 

이젠 부트로더를 플래싱 하여야 합니다.

nvflash 는 한번만 --bl 명령어인 부트로더를 주입하면 됩니다. 그러하여 다음부턴 -r 명령어를 사용하여 그 전에 플래싱 했던 nvlfash 용 부트로더를 계속 사용한다고 합니다.

 

그러하여 아래와 같은 명령을 이용해 플래싱 합니다.

 

nvflash -r --download 4 ics137crackboot.bin

# nvflash.exe -r --download 4번부트로더파티션 크랙된부트로더

 

 

를 입력하여, 플래싱을 합니다.

 

이렇게 하였다면, 이제 모든 과정은 완료되었습니다.

이젠 그저 adb 를 사용해 약간 파일만 넣어주면 됩니다.

 

이곳은 제가 제작해둔 http://cafe.naver.com/optimusq2life/7591 글에 있는 One Power 라는 루팅툴의 동작을 알아보겠습니다.

 

일딴 휴대폰에서 설정 - 개발자 옵션 - USB 디버깅 모드에 체크가 되어야 합니다.

(진저브레드 이하의 OS의 경우 설정 - 어플리케이션 (응용프로그램) - 개발 - USB디버깅 입니다)

 

su 파일과 busybox,SuperSU.apk 는 rooting 이라는 폴더 내에

adb 는 adb 라는 폴더 내에 있습니다.

 

adb\adb wait-for-device # USB가 연결이 될때까지 기다립니다.
adb\adb remount # 모든 파티션을 마운트 합니다.
adb\adb push rooting/su /system/xbin/su # SU파일을 /system/xbin (명령어 폴더)에 넣습니다.
adb\adb shell chown 0.0 /system/xbin/su # SU파일의 소유자 정보를 수정합니다.
adb\adb shell chmod 06755 /system/xbin/su # SU파일에 755권한과 특수 권한을 부여 합니다.
adb\adb shell ln -s /system/xbin/su /system/bin/su # SU파일을 /system/bin 에 심볼릭 링크를 생성합니다.

adb\adb push rooting/busybox /system/bin/busybox # busybox 를 /system/xbin (명령어 폴더)에 넣습니다.
adb\adb shell chown 0.0 /system/bin/busybox # busybox파일의 소유자 정보를 수정합니다
adb\adb shell chmod 0755 /system/bin/busybox # busybox파일에 755 권한을 부여 합니다
adb\adb push rooting/SuperSU.apk /system/app/SuperSU.apk # SuperSU 앱을 시스템 앱으로 복사합니다.
adb\adb shell chown 0.0 /system/app/SuperSU.apk # 소유자 정보 수정.
adb\adb shell chmod 0644 /system/app/SuperSU.apk # 644권한 부여.

 

위 와 같은 동작에 의해 모든 과정이 완료 됩니다.

 

그리곤 adb\adb reboot 한번.

안녕하세요!

Icaros 이자, Se7eN 인 Winpower7 입니다! (으잉?)

 

오늘은 그 유명하고 빠릿하고 간지 좔좔 줄줄 흐른다고 알려져있는, TWRP 리커버리를 한번 포팅 시도를 해보겠습니다!

 

Twrp 리커버리란?

TeamWin 팀에서 만든 리커버리로써, 현제 많은 기기가 이용중인 CWM리커버리보다 강력하며 빠른 리커버리 입니다.

 

TeamWinRecoveryProject 의 약자로써, 국내에도 몇몇 기기에 포팅이 되어 많은 사랑을 받고 있습니다.

 

※참고로 본 블로그는 드레그 기능을 지원하지 않음으로, 맨 아래 보시면 TXT파일로 따로 저장한 파일잉 있습니다.

 

왼쪽 옵티머스 3D와 오른쪽 갤럭시 넥서스에 실행되고 있는, Twrp 리커버리 / http://cafe.naver.com/nexusdevelops/8514 / http://cafe.naver.com/nxss/230342)

 

위 사진 처럼, 터치, 배터리 퍼센트 표시기, 소프트키, 암호화 등의 CWM과 다른 기능들로 많은 신비함을 뿜어 내고 있답니다 ㅎㅎ

 

하지만 이런 리커버리....지금까지 포팅이 된 리커버리는 주로 ClcokworkMod 리커버리 입니다.

그럼 이제, Twrp 리커버리도 각 기기에 알맞게 포팅시도를 해볼까요?

 

안탑갑게도, 전 국내 LG 옵티머스Q2에 포팅시도를 하고 있지만, 아직까지 LG벽돌이 기다리고 있을뿐 ~_~;;

 

먼저 이 포팅법은 Rootzwiki 에 TeamWin 에서 직접 작성해준 글을, 제 흐접 영어 실력으로 번역한 글 입니다.

원문 : http://rootzwiki.com/topic/23903-how-to-compile-twrp-from-source/

 

일딴 제가 한국어로 조금 원문과 다르게 쉽게 번역을 하였습니다.

직역을 한곳엔 표시를 하였습니다.

 

1. 리커버리 소스 파일 교체

먼저 자신이 어떤 소스를 받았는지 알아야 합니다.

예전 제 글을 따라 오셨다면, http://minnote.net/117 이글에서 안드로이드 버전 마다~ 이 부분을 보시면

각각 받은 소스가 다릅니다.

 

일딴 현제 이 글에 나와있는 말은 진저브레드 소스 (CM7)과 아이스크림 샌드위치 소스 (CM9) 만 언급되었습니다.

CM10 소스 및 CM6 소스는 어떻게 되는지 잘 모르겠습니다.

※안드로이더스 카페 내 콜홍님이 CM10 역시 CM9 처럼 하면 된다고 알려주셨습니다.

 

* CM9/CM10 소스를 받으신 분

Cyanogen Mod 9 ICS 소스를 받으신 분은

https://github.com/TeamWin/Team-Win-Recovery-Project/

위 링크에 들어 가셔서, 파일을 받으신후

CM소스 폴더/bootable/recovery 폴더를 교체해 주세요.

※ 예) /home/icaros/android/system/bootable/recovery

 

 

* CM7 소스를 받으신 분

Cyanogen Mod 7 GB 소스를 받으신 분들은 빌드 폴더도 같이 교체를 해주셔야 작업이 가능 합니다.

 

CM9 설명과 동일하게

https://github.com/TeamWin/Team-Win-Recovery-Project/

위 링크로 들어 가셔서, 파일을 받으신후

CM소스 폴더/bootable/recovery 폴더를 교체해 주세요.

※ 예) /home/icaros/android/system/bootable/recovery

 

CM7 소스를 받으신 분들은 빌드 폴더 또한 교체를 해주셔야 합니다.

 

https://github.com/Dees-Troy/TWRP2-CM7_build

위 링크로 들어 가셔서, 파일을 받으신후

CM소스 폴더/build 폴더를 교체해 주세요.

※ 예) /home/icaros/android/system/build

 

2. 컴파일을 하기 전 기본 정보 수정

먼저 컴파일을 하기전에, 디바이스 정보를 TWRP 리커버리에 알맞게 수정을 하셔야 정상 사용이 가능 합니다.

 

예전에 제 글을 따라 오셨다면, 아마

/home/(사용자 계정명)/android/system/device/(제조사)/(기기명) 폴더가 있습니다.

그쪽으로 터미널이 아닌 마우스를 통해 들어가주세요 ㅎㅎ

 

※ 예) /home/icaros/android/system/device/lge/lu6500

 

그러신뒤, 그 폴더를 가보시면 BoardConfig.mk 파일이있습니다.

 

※현제 윈도우에서 글을 작성하여, 우분투 환경으로 스크린샷을 찍지 못하였습니다...ㅠㅠ 추후 수정하겠습니다.

※다른 CM포팅 작업을 하던 디바이스 셋팅 파일로는 컴파일 하는데 지장이 있을수 있으니, 새로운 부트이미지를 해체 하셔서 작업하시는것을 추천 드립니다.

 

그런뒤, BoardConfig.mk 파일 내에

 

TARGET_RECOVERY_INITRC :=

 

란 문장이 있는지 확인 합니다. 없을 경우 추가해 주시고, 있는 경우

기존에 만들고 있던 리커버리나, 이 방법을 통해 만든 리커버리의 램디스크내에 있는 init.rc 파일 내에

 

on init
        export PATH /sbin

       
export LD_LIBRARY_PATH .:/sbin


라는 문장이 있는지 확인해 줍시다. Q2 이미지 같은 경우엔, 5번째 줄에 있었습니다.

 

모두 성공적으로 확인이 되었다면, 이제 다시 BoardConfig.mk 파일로 돌아와

 

맨 아래쪽에

 

DEVICE_RESOLUTION := 해상도 가로 값x해상도 세로 값

 

을 추가 합니다.

 

예) DEVICE_RESOLUTION := 540x960

예) DEVICE_RESOLUTION := 480x800

 

※참고

아오 제 대가리로 해석을 못하겠어요. 혹시나 해서 언제나 믿지 않았던 발번역을 돌렸지만, 역시 믿을께 못되는듯

원문

Note that themes do not rotate, so the 1280x800 theme is intended for tablets and would not work on the Samsung Galaxy Note that expects a 800x1280 type of theme (which doesn't exist yet).

 

직역본?...

테마들은 회전을 하면 안됩니다. 그래서 1280x800 테마는 타블렛 PC들 그리고, 삼성 갤럭시 노트 같은 800x1280 타입의 테마에선 아직 동작하지 않습니다.

 

아마 타블렛 PC등에서 기본적으로 가로모드가 기본 상태인 몇몇 디바이스들이 해상도를 입력할때 갤럭시 노트를 예로 들자면

800x1280 으로 입력을 하라는 소리 같습니다. 즉 가로모드는 지원이 안되어, 1280x800 으로 입력을 하면 화면이 짤리는듯 합니다.

※100% 정확하지 않습니다.

 

 

그리고 만약 부팅을 했을때, 그래픽이 깨지는 현상이 일어 난다면 아래 문구를 BoardConfig.mk 파일에 추가 합니다.

 

RECOVERY_GRAPHICS_USE_LINELENGTH := true

 

여기 까지를 하면 기본적인 셋팅은 끝나는듯 합니다.

이제 여기서 부턴 부가적인 셋팅 입니다. 하지만 필요한 경우가 많습니다. 잘 읽어봐주세요.

BoardConfig.mk 파일에 적용되는것들 입니다.

 

이 아래 부분은 가장 첫 부분이지만, 해석을 해봐도, 발번역을 해도 뭔소리인질 모르겠습니다.

아래는 당신이 어떻게 개별 / 파티션들을 어떻게 추가로 백업 옵션에 넣을 수 있는지 입니다. 'SP1_NAME' 항목은 recovery.fstab 에 정의된 파티션의 이름과 일치해야 합니다.
'SP1_DISPLAY_NAME' 은 백업된 파일이 'SP1_NAME'의 파티션 이름과 달라야 할 경우에 쓰이는 이름입니다. 'SP1_BACKUP_METHOD'는 파티션이 어떻게 정의되어야 할지(파일 혹은 이미지)
를 결정합니다. 그리고 'SP1_MOUNTABLE' 항목은 파티션이 마운트 될 수 있는지 여부를 결정합니다.

SP1_NAME := "pds"
SP1_BACKUP_METHOD := files
SP1_MOUNTABLE := 1
SP2_NAME := "osh"
SP2_DISPLAY_NAME := "Webtop"
SP2_BACKUP_METHOD := files
SP2_MOUNTABLE := 1
SP3_NAME := "preinstall"
SP3_BACKUP_METHOD := image
SP3_MOUNTABLE := 0

 

고글 발번역을 돌리면

 

아래 백업에 사용할 파티션의 목록에 사용자 정의 / 특별 파티션을 추가 할 수있는 방법입니다.SP1_NAME recovery.fstab에 정의 된 파티션의 이름과 일치해야합니다. SP1_NAME 다를해야 할 경우 SP1_DISPLAY_NAME는 백업 페이지에 표시되는 이름입니다. SP1_BACKUP_METHOD 파티션 (파일 또는 이미지) 백업하는 방법을 정의합니다. 그리고 파티션하는 경우 SP1_MOUNTABLE 결정 장착 할 수 있습니다.

 

이라 나옵니다.

 

아마 특수 파티션을 위한 경우인듯 합니다.

 

RECOVERY_SDCARD_ON_DATA := true - /data/media 를 핸들링하여 사용하는 디바이스들을 위한 구문 입니다.

(허니콤 디바이스들과 ICS에선 갤럭시 넥서스 같은 디바이스들이 필요한 것 입니다)

 

BOARD_HAS_NO_REAL_SDCARD := true - SD카드 파티셔닝 같은 기능들을 사용하지 않습니다.

 

TW_INCLUDE_DUMLOCK := true - HTC Dumlock 같은것이 필요 할때 사용합니다. (아마 독바가 추가 되는듯 합니다)

 

 

이 글상자는 내장 SD카드를 가진 폰들은 필요한 작업입니다.

즉 내장SD카드가 있는 폰이라면 필요 합니다.

※ 외장 SD카드를 꼽지 않아도, SD카드가 있는 폰

 

recovery.fstab 에 쓴 내용이랑 일치시켜 주세요!

 

예를 들어 recovery.fstab 에 내장 메모리를 /emmc 에 지정하고, 외장 SD카드를 /sdcard 에 넣었다면 아래와 같이 추가 합니다.

 

TW_INTERNAL_STORAGE_PATH := "/emmc"
TW_INTERNAL_STORAGE_MOUNT_POINT := "emmc"
TW_EXTERNAL_STORAGE_PATH := "/sdcard"
TW_EXTERNAL_STORAGE_MOUNT_POINT := "sdcard"

 

원래 원문은

 

TW_INTERNAL_STORAGE_PATH := "/data/media"
TW_INTERNAL_STORAGE_MOUNT_POINT := "data"
TW_EXTERNAL_STORAGE_PATH := "/sdcard"
TW_EXTERNAL_STORAGE_MOUNT_POINT := "sdcard"

 

입니다. 하지만 제가 해외 옵티머스 2x의 Twrp 리커버리 작업 파일을 보며 Q2용으로 수정하며 바꾼 내용을 올립니다.

 

또는 recovery.fstab 에 내장 메모리를 /sdcard 에 넣고, 외장 SD카드를 /sd-ext 에 넣으셨다면 아래와 같이 추가합니다.

 

TW_INTERNAL_STORAGE_PATH := "/sdcard"
TW_INTERNAL_STORAGE_MOUNT_POINT := "sdcard"
TW_EXTERNAL_STORAGE_PATH := "/sd-ext"
TW_EXTERNAL_STORAGE_MOUNT_POINT := "sd-ext"

 

 

TW_NO_BATT_PERCENT := true - 첫부분에 있던 사진을 보시면, 배터리 퍼센트가 표시 됩니다. 이걸 표시 하지 않으시려면 추가하세요.

 

TW_CUSTOM_POWER_BUTTON := 107 - 락스크린을 위해 별도의 파워버튼을 지정하려면 추가하세요.

107 부분엔 키값을 넣으면 되는 모양 입니다.

그런데 잠금화면도 있나요!! 역시 Twrp 위대합니다.

 

 

TW_NO_REBOOT_BOOTLOADER := true - 부트로더가 없는 경우 메뉴에서 부트로더로 재부팅 메뉴를 제거 합니다.

 

TW_NO_REBOOT_RECOVERY := true - 리커버리로 직접 진입이 불가능 한경우 메뉴에서 리커버리로 재부팅 메뉴를 제거 합니다.

 

TW_NO_USB_STORAGE := true - USB마운트를 지원하지 않는 디바이스들을 위해 USB마운트 메뉴를 제거 합니다.

 

RECOVERY_TOUCHSCREEN_SWAP_XY := true - X축과 Y축 사이의 터치 맵핑을 스왑 합니다. 뭔소리인지 모르겠네요~

번역은 대충 된듯 합니다.

원문 - swaps the mapping of touches between the X and Y axis / 직역 - 그 X축과 Y축 사이 터치 영역 맵핑을 스왑한다.

 

* 아래 두 줄은 직역 입니다.

RECOVERY_TOUCHSCREEN_FLIP_Y := true - Y축 터치 스크린 값을 넘겨 줍니다.
RECOVERY_TOUCHSCREEN_FLIP_X := true - X축 터치 스크린 값을 넘겨 줍니다.

위와 관련된 구문 입니다.

 

TW_NEVER_UNMOUNT_SYSTEM := true - 시스템 파티션을 절대 마운트 해제 하지 않습니다.

(가끔 몇몇 모토로라 기기에서 필요하다는 군요~)

 

TW_INCLUDE_INJECTTWRP := true - 부팅 이미지에 두 번째 램 디스크 복구 삼성 장치 삼성 부트 이미지 일부 TWRP를 삽입 할 수있는 능력을 추가

제가 삼성 디바이스를 한번도 못만져 봐서 그런지, 해석도 이해도 안되네요. 구글 발번역 입니다.

※ 아마 삼성기기에 있는 두번쨰 리커버리 파티션에 Twrp 이미지를 플래싱 할수 있는 능력 추가?..정도 인듯 합니다.

 

TW_DEFAULT_EXTERNAL_STORAGE := true - 외장 SD카드를 기본 저장소로 지정 합니다. (위에 내장 SD카드가 있는 디바이스들에게 해당 됩니다. 아마 백업을 하면 외장 SD카드를 우선으로 백업 하나 봅니다)

 

TW_FLASH_FROM_STORAGE := true - RAM 이 좀 작은 디바이스들에게 좋은 구문 인듯 합니다.

플래싱 하는 롬이 RAM 보다 지나치게 큰 경우, RAM 대신 /tmp 에서 작업을 진행 하는것 입니다.

Twrp 에서 이걸 기본 값으로 설정 하는걸 고려중이라네요~

 

 

 

Here's some flags that may help you, but are not specific to TWRP (works in CWM too):
This flag has multiple options, but can be used to set different graphics modes that may be need to correct color space issues on some devices:
TARGET_RECOVERY_PIXEL_FORMAT := "BGRA_8888"
TARGET_RECOVERY_PIXEL_FORMAT := "RGBX_8888"
TARGET_RECOVERY_PIXEL_FORMAT := "RGB_565"

BOARD_HAS_FLIPPED_SCREEN := true -- flips the screen upside down for screens that were mounted upside-down
TARGET_PREBUILT_RECOVERY_KERNEL := path/to/kernel -- use to specify a kernel specifically for building recovery

 

 

이 부분은 귀찮기도 하고, 해서 번역을 건너 뛰었습니다.

 

발번역을 하면

 

이것은 당신을 도와줄 몇 가지 추가 항목들입니다. 그러나 이것은 TWRP에만 특정되는건 아닙니다(CWM에서도 작동합니다).
이 플래그는 여러가지 경우가 있지만, 대표적으로 몇몇 기기에서 일어나는 색상 문제를 해결하기 위해 다른 그래픽 모드로 설정되는데 사용됩니다.

TARGET_RECOVERY_PIXEL_FORMAT := "BGRA_8888"
TARGET_RECOVERY_PIXEL_FORMAT := "RGBX_8888"
TARGET_RECOVERY_PIXEL_FORMAT := "RGB_565"

 

BOARD_HAS_FLIPPED_SCREEN := true - 스크린이 위아래로 뒤집힌 기기들을 위한 옵션입니다.
TARGET_PREBUILT_RECOVERY_KERNEL := path/to/kernel - 리커버리를 빌드하기 위해 커널을 특별하게 지정하기 위해 사용됩니다.

 

참고적으로 https://github.com/TeamWin 이 사이트에서 자신의 디바이스와 비슷한 디바이스의 작업 파일을 찾아 작업 하시면 좀더 수월하게 하실수 있습니다^^

 

저 같은 경우엔 옵티머스 Q2에 포팅을 시도 함으로, 해외 옵티머스 2x 파일인 P990 파일을 보고 수정을 하였습니다.

 

 

위와 같이 설정을 한후, CWM리커버리 빌드 하듯이 해주시면 됩니다~ 어떻게 하냐고요?

http://minnote.net/117 글의 아래쪽 빌드 쪽을 참조해 주시면 됩니다.

 

winpower7_twrp.txt

 

 

+ 2012년 11월 29일 추가

조규진 님이, 미번역 부분과 부족한 부분을 번역해 주셨습니다^^

감사합니다~

안녕하세요!

Se7eN 인 Icaros 입니다.

 

오늘은 순정 락스크린 부활에 이어, LG옵티머스들의 화이트 UI를 제거하여 보겠습니다.

 

원래 안드로이드 4.x 아이스크림 샌드위치는 검은색 프레임워크를 중심으로 구성되어있습니다.

갤럭시, 베가, 모토로라, 엑스페리아 등의 타기종 아이스크림 샌드위치를 보시면 알수 있습니다^^

 

읽으시기전 손가락 운동한번만^^

 

LG 옵티머스 기종들의 ICS , JB에선 하얀색의 UI가 눈에 뛰며 예뻐 보입니다.

 

하지만 전 마음에 안들어요! 하루 빨리 제거 하고 싶었어요.

하지만 안드로이더스의 콜홍님이 제보를...(http://cafe.naver.com/androiders/1503270)

 

(하얀색 UI를 제거하기전의 Q2와 제거한후의 Q2)

 

오른쪽 사진의 뒤를 자세히 봐주시면, 순정 락스크린이 정상적으로 표시가 됩니다^^

 

하지만 이 화이트 UI제거의 문제점이 있습니다.

 

1. 루팅하신 분만 이용가능

2. 순정 메시지 어플 사용 불능

3. 순정 메모 어플 색 겹침 현상

 

1번은 당연히 아실테구, 2번은 전 GO SMS Pro 를 사용하여 해결을 하고 있습니다.

순정 메시지 어플의 사용이 불능 합니다.

3번은 사용에는 지장이 없지만, 메인화면에서 글씨 색과 배경색이 같아 불편함이 있습니다. 하지만 개별 메모를 터치하시면 정상 표시가 됩니다.

 

무작정 해보고 봅시다!

 

준비물 : Root Explorer , 안드로마이저 등의 Build.prop 을 수정 가능한 어플리케이션 또는 시스템 작업이 가능한 파일 탐색기 어플

저는 Root Explorer 를 사용하였지만, 강좌에 편리함을 위해 안드로마이저 Free 를 사용하여 보겠습니다.

 

1. Google Play 스토어에서 "안드로마이저" 를 설치하여 줍니다.

[https://play.google.com/store/apps/details?id=com.j.y.daddy.customizer]

 

2. 안드로 마이저를 실행 하여 주신후, Tool 탭을 터치하신후, "Build.prop 관리자" 를 터치하여 주십시오.

3. 2번 사진을 보시면서, 조금만 밑으로 내려 주시면

"ro.lge.capp_optimusui"

"ro.lge.capp_resource"

아래 두개의 줄이 있습니다.

 

터치를 하신후, 값을

 

true 를 지워주신후, false 로 적으신후 확인!

을 눌러 주신후

 

적용을 눌러 주시면 됩니다.

뭐 알아서 재부팅 하시겠습니까? 라는 질문이있지만, 재부팅을 하신후에 적용이 됩니다.

 

적용을 하신후에는 정상적으로 표시가 됩니다.

안녕하세요~

Icaros 입니다!

 

요즘은 CWM을 접고, Twrp 라는 제가 찬양하는 리커버리의 포팅을 옵티머스Q2에 시도중입니다.

(하지만 절대로 12월 5일이 기말이지 않아요. 절대로.....절대로 맞아요)

 

이건 Q2만이 아닌 모든 아이스크림샌드위치이상의 옵티머스 폰들에게 해당 됩니다.

 

아무튼, 안드로이드 순정의 락 (잠금) 스크린 (화면)...전 진저의 락스크린은, LG의 락스크린이 멋지고

아이스크림 샌드위치의 락스크린은, 안드로이드 순정 락스크린이 훨씬더 멋져보인답니다~ ㅎㅎ

 

LG의 ICS락스크린은 UI가 예쁘단걸로 찬사를 받고 있지만, 음악을 많이 듣는 저에겐 독같은 존재 ㄱ-;

 

이유는 바로, LG의 순정 락스크린에선 "LG 음악 플레이어" 만이 잠금화면에서 컨트롤러가 표시가 됩니다.

다른 뮤직 플레이어를 쓰면, 자체 잠금화면이나, 잠금 없음을 한뒤 상단바를 내려서 컨트롤을 해야 합니다.

 

하지만 허니콤(컴 / 안드로이드 3.x) 부터 안드로이드 락위젯 이라는 기능이 추가되었습니다.

바로 아래 사진과 같이, 안드로이드에서 직접 잠금화면에서 뮤직 컨트롤러를 제공 합니다.

 

 

어떠한 음악 플레이어 어플도 지원이 됩니다.

일딴 제가 확인한것으로는 "파워 엠프"와 "Google Play Music" 입니다.

 

하지만 우리 옵티머스들의 아이스크림 샌드위치에선 LG락스크린을 사용하느랴고, 저 기능 사용을 못합니다.

 

하지만 우리는 오늘 안드로이드 순정의 락스크린을 부활시켜 봅시다.

아래 사진은 오늘 7시 49분에 찍은, 제 옵티머스Q2의 락스크린 입니다.

 

요즘 패턴 그리기가 귀찮아, 그냥 풀고 다녀요.

※아래 검은색 화면이 표시되는것은 소프트키(네비게이션 바) 입니다. 착오 없으시길 바랍니다.

※현제 국내에 판매되고 있는 LG 옵티머스들 중에는 루팅 없이, 저런 소프트키가 있는 폰은 없습니다.

※갤럭시 넥서스, 테이크 LTE, 넥서스4, 넥서스10등의 몇몇폰들은 기본적으로 저것이 있습니다.

※오 저것 추가하는 강좌도 올려야지요~

 

일딴 루팅 (Rooting)을 하신 분들만이 가능 하십니다.

 

준비물 : Root Explorer 등의 시스템을 조작할수 있는 파일 탐색기, 손가락

 

1. Root Explorer 등의 시스템을 조작할수 있는 파일 탐색기를 실행 합니다.

2. /system/app 으로 들어 갑니다.

3. LockScreen3.apk 를 찾아줍니다.

 

4. LockScreen3.apk 를 꾹 터치하여, 이름바꾸기를 터치하여 줍니다.

※저기 노란색으로 표시해둔, 버튼이 "R/W Mount" 또는 "마운트 R/W" 등으로 R/W라는 말이있으면, 한번 터치한후 해줍니다.

 

5. 여기서 두방향의 갈림길에 놓이게 됩니다.

설명 읽어 보시고, 대충 선택하시구 가주시면 됩니다~

 

길1 - 일딴 한번, 순정 락스크린을 써보고, 다시 원래 LG락으로 오시고 싶은분

1-1. 이름 바꾸기를 합니다.

1-2. 이름을 "LockScreen3.apk1" 로 바꿔 줍니다.

1-3. LockScreen3.odex 파일있다면, 삭제하거나 이름을 바꾸지 말고 그냥 놔둡니다.

길2 - 계속 순정 락스크린으로 살고 싶으신분

2-1. 이름 바꾸기를 하시지 마시고, 삭제를 눌러 줍니다.

2-2. LockScreen3.odex 파일이있다면, Odex 파일도 삭제해 줍니다.

 

이렇게 영구적과 반영구정이 있습니다.

전 1번을 추천 드립니다^^

 

이 과정을 거친후에, 화면을 껏다가, 켜보면! 안드로이드 순정 락이!

 

근데...꼭 읽어주세요

 

일딴 재부팅을 하지 않으시고, 잠금화면을 가시면, 바탕화면이 이상하게 표시됩니다. 재부팅을 하여 주세요.

 

그리고 또한 화이트UI제거를 하시지 않으면 아래 사진 처럼 이상할수 있습니다.

알림 및 소유자 정보, 긴급 통화 및 통신사 문구가 이상하게 표시가 됩니다. 다음글을 참조해주세요.

 

또한 의문의 회색 바도 생겨버린답니다~

꼭 다음글을 한번 읽어주세요!

서로 관련이 있습니다.

 

저 현상은 LG옵티머스 ICS에 예쁘다고 극찬을 받고 있는, 하얀색 UI를 제거해야 정상적인 표시가 됩니다.

 

바로가기 : http://minnote.net/134

이것이 제가 꾸미고 있는, 옵티머스Q2의 CWM리커버리 메인 화면 입니다!

어서 모든 강좌를 올려 볼려고 합니다~


윗쪽, CWM-Based Recovery v6.0.1.2 를 Optimus Q2 CWM-Based Recovery v4 / v6.0.1.2 로 수정!

Power Off 추가!

LG Optimus Q2 이미지로 수정!

Welcom to the God World! / So am I Still Waiting / For OpQu2 CM9/CMX ROM...Please! 추가!


가 있습니다.


제가 현제 준비중인것은 쿼티 폰의 자부심인 리커버리에서 쿼티를 이용하여 콘솔을 살리는것 입니다! 그 내용은 나중에 약간 다루겠습니다.


읽으시기전 손가락 운동 한번^^


일딴 저 사진에 빨간색으로 표시를 해둔, "Power Off" 를 추가해 보겠습니다.

저것을 선택하면 그냥 폰이 종료 됩니다 ㅎㅎ


예전 까진 있었지만 2012년 1월인가 부터, 필요가 없는 부분이라고 생각되어 없어졌다고 합니다.

하지만 안드로이더스의 Npp님의 요청(?)으로 한번 시도를! 그리고 엄청난 도움이 되어 여러가지 수정을 가능하게 되었습니다.

으어어어 그러고 보니 Npp님께도 감사를! 영구땡칠님께도 감사를!


일딴...저도 초보자라...순서를 변경하는 고급 기능은 잘 모르겠습니다. 아니 할수는 있는데 단 한번도 시도를 해보지 않았습니다.


일딴 아래 파일 수정을 통해 살리기가 가능 합니다.

/home/(사용자 계정명)/android/system/bootable/recovery/default_recovery_ui.c


이미 Power Off에 대한 기본적인 내용들은 모두 추가가 되어있기 때문에 살리기만 하면 됩니다^^


https://github.com/CyanogenMod/android_bootable_recovery/commit/cd3705e4aba68274f7033a32bfc0d9b1010a4513

위 GitHub 의 default_recovery_ui.c 파일의 히스토리를 통해

Power Off 를 지운것을 알수 있습니다.


https://github.com/CyanogenMod/android_bootable_recovery/blob/ics/extendedcommands.c

위 파일 즉 extendedcommands.c 파일에 Power Off에 관련된 소스들이 있습니다. 맨 아래쪽 어드벤스 메뉴쪽 참고 부탁드립니다.


1. 아래 경로로 들어가, default_recovery_ui.c 파일을 열어 줍니다.

/home/(사용자 계정명)/android/system/bootable/recovery/default_recovery_ui.c


2. 아래와 같은 내용이 있습니다. 사진 아래 참조

저~기 빨간색과 노란색 줄 사이에 "                       "power off"," 를 추가해 주시면 됩니다.


즉 원본은 아래와 같습니다.


/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#include <linux/input.h>

#include "recovery_ui.h"
#include "common.h"
#include "extendedcommands.h"

char* MENU_HEADERS[] = { NULL };

char* MENU_ITEMS[] = { "reboot system now",
                       "install zip from sdcard",
                       "wipe data/factory reset",
                       "wipe cache partition",
                       "backup and restore",
                       "mounts and storage",
                       "advanced",
                       NULL };



여기서 저 굵게 표시해둔, Advanced 메뉴 아래쪽에 Power Off 를 추가해 줍니다.


아래 완성본(?) 파일 내용 입니다.


/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <linux/input.h>

#include "recovery_ui.h"
#include "common.h"
#include "extendedcommands.h"

char* MENU_HEADERS[] = { NULL };

char* MENU_ITEMS[] = { "reboot system now",
                       "install zip from sdcard",
                       "wipe data/factory reset",
                       "wipe cache partition",
                       "backup and restore",
                       "mounts and storage",
                       "advanced",
                       "power off",
                       NULL };

void device_ui_init(UIParameters* ui_parameters) {
}

int device_recovery_start() {
    return 0;
}

int device_reboot_now(volatile char* key_pressed, int key_code) {
    return 0;
}

int device_perform_action(int which) {
    return which;
}

int device_wipe_data() {
    return 0;
}


먼저 강좌를 시작 하기 전, 이 글은

영구땡칠님의 글을 그냥 사진만 추가해서 올린다고 해도 뭐라 할것이 없습니다...ㅠㅠ

원문 / http://cafe.naver.com/androidhacker/461


먼저 하시기 전에, 손가락 운동 한번만^^


일딴 대부분의 디바이스가 정상 동작을 하겠지만, 몇몇 디바이스들은 CWM리커버리 기본 셋팅으로 빌드를 하면

선택키가 없고, 볼륨키로만 왔다 갔다만 할수 있는....그런 상황이 일어나 버립니다...ㅠㅠ


제가 만들어본 LG 옵티머스Q2와 옵티머스Ex 에선 그랬습니다.


그래서 약간 글을 써볼려고 합니다.

위에서 말했듯이, 이 글은 영구땡칠님께서 써주신 글 입니다.

올라온거 보고, 덧글도 제가 1등으로 달았어요!


영구땡칠님曰 / "이미 초급딱치를 뗀 개발자라고 생각하신다면 이 글을 안보고도 쉽사리 고칠 부분을 찾아내실수 있습니다. 그런 분들이라면 이 문서를 참고하지 말고 직접 고보시기 바랍니다"


아아...전 아직 못뗏어요...ㅠㅠ


언제나 그렇지만 저에게 언제나 도움을 주시는 영구땡칠님 (LG 기기에서 많은 활약을...), hPa님 (이분은 너무 글로벌 하셔서), 베르제브님 (옵티머스Q2와 Ex를 구원해 주신 분...)등의 수많은 능력자 분들이 있기에, 전 낼름 받아 먹기만 하고 글을 써 봅니다.


먼저 개념은 이러 합니다.


grep VOLUME 라는 명령어를 내려, 자신이 수행했던 기록을 거슬러 올라갈수 있습니다.

그렇게 해서 파일을 찾는 방식 입니다.


하지만...전 왜 저 명령어가 안먹히죠...ㅠㅠ 그래서 글을 그대로 날름 했습니다.



ClcokworkMod 리커버리 5에선 아래와 같은 파일을 수정 하시면 됩니다.

/home/(사용자 계정명)/android/system/bootable/recovery/default_recovery_ui.c


ClockworkMod 리커버리 6에선 아래와 같은 파일을 수정 하시면 됩니다.

/home/(사용자 계정명)/android/system/bootable/recovery/default_recovery_keys.c


전 CWM5의 작업 파일을 만저 본적이 없어, CWM6을 기준으로 글을 써 봅니다.


1. /home/(사용자 계정명)/android/system/bootable/recovery/default_recovery_keys.c 파일을 열어 줍니다.


2. 열어 보시면 아래와 비슷한 내용이 있습니다. 여기서 대충 딱 보시고! 아 이거군아! 하시면 초급자 딱지는 땟다고 봐도 된다고 합니다! 오오 (불행중 다행)


아래 내용은 Git Hub 에서 가져온 가장 기본 상태의 파일 내용 입니다.

#include <linux/input.h>


#include "recovery_ui.h"
#include "common.h"
#include "extendedcommands.h"


int device_toggle_display(volatile char* key_pressed, int key_code) {
    int alt = key_pressed[KEY_LEFTALT] || key_pressed[KEY_RIGHTALT];
    if (alt && key_code == KEY_L)
        return 1;
    // allow toggling of the display if the correct key is pressed, and the display toggle is allowed or the display is currently off
    if (ui_get_showing_back_button()) {
        return 0;
        //return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_END);
    }
    return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_POWER || key_code == KEY_END);
}

int device_handle_key(int key_code, int visible) {
    if (visible) {
        switch (key_code) {
            case KEY_CAPSLOCK:
            case KEY_DOWN:
            case KEY_VOLUMEDOWN:
            case KEY_MENU:
                return HIGHLIGHT_DOWN;

            case KEY_LEFTSHIFT:
            case KEY_UP:
            case KEY_VOLUMEUP:
            case KEY_HOME:
                return HIGHLIGHT_UP;

            case KEY_POWER:
                if (ui_get_showing_back_button()) {
                    return SELECT_ITEM;
                }
                if (!get_allow_toggle_display() && !ui_root_menu) {
                    return GO_BACK;
                }
                break;
            case KEY_LEFTBRACE:
            case KEY_ENTER:
            case BTN_MOUSE:
            case KEY_CAMERA:
            case KEY_F21:
            case KEY_SEND:
                return SELECT_ITEM;
            
            case KEY_END:
            case KEY_BACKSPACE:
            case KEY_SEARCH:
                if (ui_get_showing_back_button()) {
                    return SELECT_ITEM;
                }
                if (!get_allow_toggle_display() && !ui_root_menu) {
                    return GO_BACK;
                }
            case KEY_BACK:
                if (!ui_root_menu) {
                    return GO_BACK;
                }
        }
    }

    return NO_ACTION;
}


딱 보시고 아실 분은 다 아실듯 합니다! 우둔한 저도 알아 차렸으니;


아래 부분을 보아 봅시다.

            case KEY_CAPSLOCK:
            case KEY_DOWN:
            case KEY_VOLUMEDOWN:
            case KEY_MENU:
                return HIGHLIGHT_DOWN;


위와 같은 내용 입니다.


위 내용은 다음과 같은 뜻을 가지고 있습니다.


CapsLock 버튼, Down 버튼, 볼륨 다운버튼, 메뉴 버튼 으로 아래쪽 항목을 선택 할수 있습니다.


그럼 아래 와 같이 수정을 하면, 검색키를 통해 아래쪽 항목을 선택 가능 합니다.

※단 검색키 이용은 약간의 수정이 필요 합니다


            case KEY_CAPSLOCK:
            case KEY_DOWN:
            case KEY_VOLUMEDOWN:
            case KEY_MENU:

            case KEY_SEARCH:

                return HIGHLIGHT_DOWN;


위와 같이 "case KEY_XXX"를 추가하면, 됩니다.



#include <linux/input.h>


#include "recovery_ui.h"
#include "common.h"
#include "extendedcommands.h"


int device_toggle_display(volatile char* key_pressed, int key_code) {
    int alt = key_pressed[KEY_LEFTALT] || key_pressed[KEY_RIGHTALT];
    if (alt && key_code == KEY_L)
        return 1;
    // allow toggling of the display if the correct key is pressed, and the display toggle is allowed or the display is currently off
    if (ui_get_showing_back_button()) {
        return 0;
        //return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_END);
    }
    return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_POWER || key_code == KEY_END);
}

int device_handle_key(int key_code, int visible) {
    if (visible) {
        switch (key_code) {
            case KEY_CAPSLOCK:
            case KEY_DOWN:
            case KEY_VOLUMEDOWN:
            case KEY_MENU:
                return HIGHLIGHT_DOWN; / 항목 아래로 이동

            case KEY_LEFTSHIFT:
            case KEY_UP:
            case KEY_VOLUMEUP:
            case KEY_HOME:
                return HIGHLIGHT_UP; / 항목 위로 이동

            case KEY_POWER:
                if (ui_get_showing_back_button()) {
                    return SELECT_ITEM;
                }
                if (!get_allow_toggle_display() && !ui_root_menu) {
                    return GO_BACK;
                }
                break; / 이놈 때문에 파워버튼이 정상동작을...지우고 수정해야 할듯 합니다. 뭐하는 놈인지 모르겠어요,...ㅠㅠ
            case KEY_LEFTBRACE:
            case KEY_ENTER:
            case BTN_MOUSE:
            case KEY_CAMERA:
            case KEY_F21:
            case KEY_SEND:
                return SELECT_ITEM; / 항목을 선택
            
            case KEY_END:
            case KEY_BACKSPACE:
            case KEY_SEARCH:
                if (ui_get_showing_back_button()) {
                    return SELECT_ITEM;
                }
                if (!get_allow_toggle_display() && !ui_root_menu) {
                    return GO_BACK;
                }
            case KEY_BACK:
                if (!ui_root_menu) {
                    return GO_BACK; / 뒤로 가기
                }
        }
    }

    return NO_ACTION;
}


입니다.


제가 약간 응용한 부분을 보겠습니다.

Q2에 적용된 파일이며, Q2는 하단 하드웨어 키가


옆의 사진과 같습니다.

그래서 저는 전원키 대신


메뉴 - 위로 이동 (방향키 및 볼륨키 대응)

홈 - 아래로 이동 (방향키 및 볼륨키 대응)

뒤로 - 뒤로 (백스페이스 키 대응)

검색 - 선택 (엔터키 및 전원키 대응)




그래서 아래와 같이 수정해 보았습니다.


#include <linux/input.h>

#include "recovery_ui.h"
#include "common.h"
#include "extendedcommands.h"


int device_toggle_display(volatile char* key_pressed, int key_code) {
    int alt = key_pressed[KEY_LEFTALT] || key_pressed[KEY_RIGHTALT];
    if (alt && key_code == KEY_L)
        return 1;
    // allow toggling of the display if the correct key is pressed, and the display toggle is allowed or the display is currently off
    if (ui_get_showing_back_button()) {
        return 0;
        //return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_END);
    }
    return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_POWER || key_code == KEY_END);
}

int device_handle_key(int key_code, int visible) {
    if (visible) {
        switch (key_code) {
            case KEY_CAPSLOCK:
            case KEY_DOWN:
            case KEY_VOLUMEDOWN:
            case KEY_HOME:
                return HIGHLIGHT_DOWN;

            case KEY_LEFTSHIFT:
            case KEY_UP:
            case KEY_VOLUMEUP:
            case KEY_MENU:
                return HIGHLIGHT_UP;

//            case KEY_POWER:
//                if (ui_get_showing_back_button()) {
//                    return SELECT_ITEM;
//                }
//                if (!get_allow_toggle_display() && !ui_root_menu) {
//                    return GO_BACK;
//                }
//                break;
            case KEY_LEFTBRACE:
            case KEY_ENTER:
            case BTN_MOUSE:
            case KEY_CAMERA:
            case KEY_F21:
            case KEY_SEND:
            case KEY_SEARCH:
            case KEY_POWER:
                return SELECT_ITEM;
           
            case KEY_END:
            case KEY_BACKSPACE:
                if (ui_get_showing_back_button()) {
                    return SELECT_ITEM;
                }
                if (!get_allow_toggle_display() && !ui_root_menu) {
                    return GO_BACK;
                }
            case KEY_BACK:
                if (!ui_root_menu) {
                    return GO_BACK;
                }
        }
    }

    return NO_ACTION;
}


// 파란색은 주석 처리를 한것 입니다.


즉 저 문장들은 실제로는 없는것과 같이 처리 된다는 것 입니다.


해석을...


#include <linux/input.h>

#include "recovery_ui.h"
#include "common.h"
#include "extendedcommands.h"


int device_toggle_display(volatile char* key_pressed, int key_code) {
    int alt = key_pressed[KEY_LEFTALT] || key_pressed[KEY_RIGHTALT];
    if (alt && key_code == KEY_L)
        return 1;
    // allow toggling of the display if the correct key is pressed, and the display toggle is allowed or the display is currently off
    if (ui_get_showing_back_button()) {
        return 0;
        //return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_END);
    }
    return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_POWER || key_code == KEY_END);
}

int device_handle_key(int key_code, int visible) {
    if (visible) {
        switch (key_code) {
            case KEY_CAPSLOCK:
            case KEY_DOWN:
            case KEY_VOLUMEDOWN:
            case KEY_HOME:
                return HIGHLIGHT_DOWN;

            case KEY_LEFTSHIFT:
            case KEY_UP:
            case KEY_VOLUMEUP:
            case KEY_MENU:
                return HIGHLIGHT_UP;

//            case KEY_POWER:
//                if (ui_get_showing_back_button()) {

//                    return SELECT_ITEM;

//                }

//                if (!get_allow_toggle_display() && !ui_root_menu) {

//                    return GO_BACK;

//                }

//                break;

// 일딴 이놈때문에 전원키가 동작을 안하니 삭제를...
            case KEY_LEFTBRACE:
            case KEY_ENTER:
            case BTN_MOUSE:
            case KEY_CAMERA:
            case KEY_F21:
            case KEY_SEND:
            case KEY_SEARCH:
            case KEY_POWER:

// 전원키와 검색키를 선택 항목에 넣습니다
                return SELECT_ITEM;
           
            case KEY_END:
            case KEY_BACKSPACE:

// 이 부분에 검색 값이있었지만, 위쪽으로 이동을 했습니다
                if (ui_get_showing_back_button()) {
                    return SELECT_ITEM;
                }
                if (!get_allow_toggle_display() && !ui_root_menu) {
                    return GO_BACK;
                }
            case KEY_BACK:
                if (!ui_root_menu) {
                    return GO_BACK;
                }
        }
    }

    return NO_ACTION;
}


이제 그리고 빌드를 하시면 됩니다!


다음번에는 메인 화면 수정 및 리커버리 정보 수정을 한번 흐흐

안녕하세요.

Icaros 입니다.


먼저 이러한 방법으로 쿠킹 형식으로 Miui 산소 센스 Lewa OS를 포팅 할수 있습니다.


이번엔 그냥 MIUI를 쿠킹해 보겠습니다.


그전에 손가락 운동 한번^^


먼저 준비물은 다음과 같습니다.


- 포팅할 폰의 CM롬 또는 AOSP 롬

- 포팅할 폰과 해상도가 동일한 폰의 MIUI

- 텍스트 편집 프로그램 (Notepad ++ 추천)

- 7zip 등의 압축 유틸리티 (알집 비추천 / WinRAR등 추천)


일딴 이러한 방법의 단점이라면, 기반롬인 CM롬 또는 AOSP롬등에 있는 모든 문제점을 모두 MIUI로 끌고 갑니다.

예를 들어 기반롬에서 카메라가 동작하지 않는다면, 이 방법으로 포팅한 MIUI도 카메라가 동작하지 않습니다.


포팅할 폰과 동일한 해상도를 가진 폰의 MIUI 파일은 다음 사이트에서 구하실수 있습니다.

http://www.miui.com / http://en.miui.com



제가 추천드리는 바로는 7zip 을 이용하는것 입니다.

압축을 푸시지 마시고, 그냥 7zip 으로 열기를 해주십시오.


1. MIUI롬(동일한 해상도를 가진 폰의 MIUI)의 /system/app 폴더와 /system/framework 폴더를 기반롬으로 덮어쓰기 합니다.


2. MIUI롬의 /system/lib/libandroid_runtime.so 파일을 기반롬 /system/lib 안에 덮어쓰기 합니다.

※ 부팅이 되지 않는 경우, 원래 기반롬의 libandroid_runtime.so 파일을 사용해 주십시오.


3. 기반롬의 /system/media 폴더를 지워 줍니다.


4. MIUI롬의 /system/media 폴더를 덮어씌워 줍니다.


5. MIUI롬의 /system/etc/telocation.db 파일과 yellowpage.db 파일을 기반롬 /system/etc 에 넣어줍니다.


6. MIUI롬의 /system/lib/content-types.properties 파일을 기반롬 /system/lib 에 넣어 줍니다.


7. MIUI롬의 /system/xbin/invoke-as 파일을 기반롬 /system/xbin에 넣어 줍니다.


8. MIUI롬의 /system/lib/libeaec.so 파일을 기반롬의 /system/lib 에 넣어 줍니다.


9. 기반롬의 updater-script 에 대충 중간쯤에 다음을 추가해 줍니다.

set_perm(0, 0, 06755, "/system/xbin/invoke-as");

set_perm(0, 0, 0755, "/system/lib/liblbesec.so");


10. 이제 빌드프롭을 수정 합니다.


ro.build.id=MIUI
ro.build.display.id=MIUI
ro.build.version.incremental=2.x.x (MIUI 버전을 적어 주세요)

ro.config.ringtone=MI.ogg
ro.config.notification_sound=FadeIn.ogg
ro.config.alarm_alert=GoodMorning.ogg
ro.config.sms_received_sound=FadeIn.ogg
ro.config.sms_delivered_sound=MessageComplete.ogg


그런후 저장 하시고, 리커버리로 플래시를 하시면 MIUI가 포팅 됩니다!


쓸글이 없으니 다음은 Lewa OS를 쿠킹해 봅시다.

안녕하세요~

winpower7 입니다. 별명으로 '이카로스' 라 하겠습니다.


먼저 이 방법은 저 역시 초보 개발자 이기 때문에...저 역시 다른글을 보고 배웠지만

그 글들을 모두 모아, 쉽고, 최대한 제가 할수 있는 능력안에선 다 해드릴려고 합니다.


일딴 CWM리커버리를 포팅 하는 데에는 2가지 방법이 있습니다.

첫번째는 Windows 에서도 클릭 몇번으로 포팅이 가능 합니다.


하지만 삼성 갤럭시 디바이스 처럼 몇몇 약간 다른 방식의 파티션을 사용하는 기기들은 불가능 합니다.

또한 LG전자의 1~2세대 디바이스 처럼 기본 리커버리가 없는 폰 역시 불가능 합니다.

※요즘 나온 펌웨어는 리커버리가 기본적으로 들어있습니다. LG폰역시...하지만 리커버리 파티션 부팅이 안될뿐;

첫번째 쉬운 방법은 두번째 글 마치고 쓰겠습니다. 뭐 네이버에 널렸으니...


그전에 손가락 운동 한번^^


하지만 우린 우분투를 이용한 CWM-based Recovery 를 포팅해 보겠습니다.


먼저 다음과 같은 개발환경이 되어야 합니다.


- x64 지원 CPU / 64비트 지원 CPU

└ 32비트 컴퓨터에선 빌드조차 되지 않습니다. 확인법은 CPU-Z 등을 이용해 주시면 감사하겠습니다.


- 우분투 10.x 이상의 ISO 또는 설치된 컴퓨터

└ 가상 컴퓨터로 돌리셔도 됩니다. 하지만 윈도우가 설치되어 있다면, 쉽게 우분투를 덮어쓰기 형식으로 설치 할수 있으니 참고바랍니다. 우분투는 오픈소스 운영체제 임으로, 네이버에서도 합법적으로 구하실수 있습니다. / 저는 우분투 10.10 환경에서 진행 합니다. / 커널은 2.6.35-22


- 루팅이 된 안드로이드 디바이스

└ 개통이 안된 기기도 가능 합니다. / 저는 LG 옵티머스Q2로 글을 진행 합니다.


- 여러가지 정신들...인내심, 전기료에 대한 걱정 (인터넷 속도가 개똥이신분만 걱정하심 되요), 강인함과 굳은 마음


1. 우분투 운영체제를 설치 합시다.

※이 부분에는 사진이 단 한장도 없습니다. 죄송합니다.


우분투...안드로이드 개발자 분이시라면 한번쯤은 들어 보신 말 입니다.


우분투는 윈도우와 같은 하나의 운영체제 입니다. 여기서 우분투를 알아 뭐 알건 없고

그냥 본론으로 갑니다.


전 우분투 10.10 환경에서 진행 합니다. 완전 초보자 이시라면, 가장 구하기 쉬운 12.xx를 통해 다른 12.xx 글을 보시거나

10.10 을 구하여, 저랑 동일한 환경에서 포팅하시는것도 좋습니다.


먼저 가상 윈도우로 우분투를 설치 할것인지, 우분투를 아예 포멧후 설치 할것인지, 우분투를 윈도우와 쓰면서 듀얼 부팅을 할것인지, 우분투를 윈도우 안에 설치 할것인지 정하셔야 합니다.


가상 윈도우로 하시는 방법은 그닥 추천 드리지 않음으로 (하지만 개발에는 훨씬 편합니다. 단 좀 짜증날뿐)

전 윈도우 위에 우분투룰 설치하겠습니다.


우분투 ISO 파일을 받으셨다면, 윈도우에서 알집이나 7zip 등으로 압축을 푸신후 폴더에 가보시면

"webui.exe" 라는 파일이 있습니다. 그 파일을 실행 하시면

"윈도우 위에 우분투 설치" 라는 버튼이 2번째에 있습니다. 그걸 그냥 클릭 하시면 됩니다.


기본적인 정보를 입력하신후, 하드디스크는 30GB로 잡아 주시는걸 추천 드립니다. 나중에 하드 공간이 없어 포멧하시는 일은 없기를...


윈도우 위에 우분투를 설치하시면, 포멧 없이 윈도우와 우분투를 듀얼 부팅하셔서 사용하실수 있습니다.

프로그램 추가/제거에서 우분투를 다른 프로그램과 동일하게 지우실수 있습니다.


기본적인 정보와 비밀번호 설정을 다 하셨다면, 다음을 눌러 기본적인 파일 설치를 합니다.


그런후 '지금 재부팅' 을 하여, 듀얼 부팅에 시도 합니다.


듀얼 부팅이란걸 처음 하시는 분은 아마 기본 설정인 30초 동안 윈도우 부팅전 새로운 화면이 보입니다.


Windows Boot Manager 인가요...가 나옵니다.


거기서 방향키와 엔터를 사용하여, 'Ubuntu' 로 부팅을 합니다.


그럼 약 10~20분 동안 언어팩등 여러가지 설치를 하게 됩니다.


이 부분은 이렇게 끝났습니다.

원래 글을 나눌려 했지만 귀찮아 져서, 그냥 씁니다.


2. 기본 셋팅 및 CM소스를 받아 보자

※참고로 복사 붙여 넣기가 안되시는 분들은, 맨 아래 첨부파일에서 복사 붙여넣기 해주세요.

아아...여기서 이제 욕이 나옵니다. 인터넷이 느리신 분은 엄청난 전기료가 나오실수 있습니다.

엄청난 시간이 소요 됩니다. 가상 윈도우에 경우 여기서 좀 걸리실수 있습니다.

서버가 외국에 있어 약 10~300kbps 의 속도로 받아 집니다.


하지만 동시에 받는 기능과 이어 받기 기능이 있어 참 좋습니다.


2-1. 프로그램 -> 보조 프로그램 -> 터미널 을 실행 합니다. (조합키 Ctrl + Alt + T 로도 실행 가능)


2-2. 이제 다음과 같은 글을 터미널에 복사 붙여 넣기 합니다.

sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \ x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \ libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \ libxml2-utils

붙여 넣기를 하면 다음과 같은 메시지가 나옵니다.

[sudo] password for 사용자명:

여기서 영어로 자신의 비밀번호를 입력 합니다.

이때 입력이 안되신다구 당황하시지 마십시오. 안보일뿐 입니다. 한글로 입력하시면 한글이 보입니다. 지워지시구 영어로 전환하여 주십시오.


만약 다음과 같이 E:무엇을 설치할 수 없습니다. 라고 나온다면, 그 부분을 빼고 복사해 붙여 넣기 합니다.


※ 붙여 넣기는, 터미널 안에서 오른쪽 마우스 클릭 -> 붙여 넣기를 통해 붙여 넣을수 있습니다.


또한 E:무엇을 설치할 수 없습니다. 라고 나온다면, 그 파일을 다음 양식에 넣어 입력 합니다.

sudo apt-get install 패키지이름


예) sudo apt-get install lib32ncurses5-dev


※ 업데이트가 필요 하다고 나오는 경우엔

sudo apt-get update 패키지이름


예) sudo apt-get update zip


자자 이제 가장 중요한 CM소스를 받을 차례 입니다.

받기전에 기본 설정을 위해 repo 를 해야 합니다. 뭐 CM소스를 받는 일이죠


홈 폴더로 이동을 해야 합니다. 다음을 입력 합니다.


cd /home/(사용자계정명)


예) cd /home/icaros


그다음은 이제 BIN 이라는 폴더를 만들어 줘야 합니다.


mkdir bin


이제 만들었다면, 이동을 해야 겠죠?


cd bin


그 다음은 BIN을 기본 패치 장소로 지정 해야 합니다.


export PATH=$PATH:~/bin


그 다음은 REPO 사이트로 부터 기본적 설정을 받아와야 합니다.


curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo


이제 받기 위한 준비를 해야 합니다. repo 라는 파일에게 권한을 줍니다.


chmod a+x ~/bin/repo


이제 home/icaros/android/system 이라는 폴더를 만듭니다.


mkdir -p ~/android/system


이제 /android/system 으로 이동 합니다.


cd ~/android/system


이제 CM소스를 받아야 하는데, 여기서 기기를 살펴야 합니다.

안드로이드 버전 마다 받아야 하는 파일이 다릅니다.


설정 -> 휴대폰 정보 -> Android 버전 확인후


4.0.x 인경우 / repo init -u git://github.com/CyanogenMod/android.git -b ics

4.1.x 인경우 / repo init -u git://github.com/CyanogenMod/android.git -b jellybean

2.3.x 인경우 / repo init -u git://github.com/CyanogenMod/android.git -b gingerbread

2.2.x 인경우 / repo init -u git://github.com/CyanogenMod/android.git -b froyo

2.1.x 또는 2.0.1 인경우 / repo init -u git://github.com/CyanogenMod/android.git -b eclair

1.6.x 인경우 / repo init -u git://github.com/CyanogenMod/android.git -b donut

1.5.x 인경우 / repo init -u git://github.com/CyanogenMod/android.git -b cupcake


으로 중 하나를 입력해 주시면 되겠습니다.

이클레어와 컵케익은 저 주소가 정확한지 모르겠습니다. 이클레어는 소스가 맞다면 받아 지고, 컵케익은 주소가 맞아도 아직 파일이 있을지 의문 입니다...CM3은 배포 중단된지 오래라는데...


저는 이번 옵티머스Q2 의 ICS 버전의 CWM를 포팅 함으로, ics를 입력했습니다.


이젠 파일을 받아야 합니다. 엄청난 인내심과 끈기가 필요 합니다. 컴퓨터에 따라 받는 속도가 다릅니다.


repo sync


※ 참고 : repo sync -j 16 같이 뒤에 -j 숫자 를 붙이면 한번에 여러개의 파일을 받습니다.

2부터 최대 80까지를 입력할수 있습니다. 하지만 80은 누락될 위험도 있기에, 보통 16을 사용합니다.

전 50으로 받았습니다. / repo sync -j 50


다 받아 지셨다면, 다음을 입력 합니다.


make -j4 otatools


그 다음 아래 첨부파일을 받아

/home/(사용자 계정명)/bin 에 넣습니다.


unpackbootimg


그 다음은 자신의 폰의 부트이미지를 추출 해야 합니다.


성공적으로 부트 이미지가 추출 되었다면, 이제 본격적인 리커버리 제조에 들어 갑니다.

추출된 부트 이미지는 /home/(사용자계정명)/mydroid 에 넣어 주시면 되겠습니다.


터미널에서 다음을 입력합니다.


. build/envsetup.sh

※컴퓨터를 재부팅후 다시 터미널로 접속 할떈 'cd /home/(사용자 계정명)/android/system' 을 입력해 줘야 합니다.


이제 부트 이미지를 해체 해야 합니다.

그럼으로 mkvendor.sh 를 사용하여, 부트 이미지를 해체 합니다.


build/tools/device/mkvendor.sh 제조사 기기명 /mydroid/boot.img


예) build/tools/device/mkvendor.sh lge lu6500 /mydroid/boot.img

예) build/tools/device/mkvendor.sh sky ima760s /mydroid/boot.img

예) build/tools/device/mkvendor.sh samsung shwm110s /mydroid/boot.img



다 되셨다면, 직접 마우스를 이용하여

/home/(사용자계정명)/android/system/device/제조사/기기명 으로 이동하시면

recovery.fstab 이랑 boardconfig.mk 이 있습니다.


요 두파일을 자신의 폰에 알맞게 수정 해야 합니다.


먼저 recovery.fastab 를 텍스트 편집기로 열어 봅니다.

그럼 이런 대충 비슷한 내용이 나옵니다.

이건 옵티머스Q2의 파티션 정보 입니다.


# mount point    fstype    device        [device2]

/boot           emmc            /dev/block/mmcblk0p7
/cache          ext4            /dev/block/mmcblk0p3
/data        ext4        /dev/block/mmcblk0p11
/recovery       emmc            /dev/block/mmcblk0p1
/sdcard         vfat           /dev/block/mmcblk1p1
/system         ext4            /dev/block/mmcblk0p2
/misc           emmc            /dev/block/mmcblk0p5
/nvarea         emmc            /dev/block/mmcblk0p6
/emmc          vfat           /dev/block/mmcblk0p13


/마운트포인트    파티션    위치


로 적어 주시면 됩니다.

 

기본 리커버리가 있으시다면, 그 리커버리를 부트이미지 분해 하듯이 분해 하시면

저 파일의 내용이 나옵니다. 그걸 적어 주시거나 안나오시면


핡...개노가다 입니다...전 nvflash 로 구하는 테그라 계열 방법밖에 모르겠습니다. 죄송합니다...ㅠㅠ


이제 boardconfig.mk 파일을 열어 줍니다. 다음 비슷한 내용이 나옵니다.

이건 제 컴퓨터에서 해체한 옵티머스Q2의 파일 입니다.


USE_CAMERA_STUB := true

# inherit from the proprietary version
-include vendor/lge/lu6500/BoardConfigVendor.mk

TARGET_NO_BOOTLOADER := true
TARGET_BOARD_PLATFORM := unknown
TARGET_CPU_ABI := armeabi
TARGET_BOOTLOADER_BOARD_NAME := lu6500

BOARD_KERNEL_CMDLINE :=
BOARD_KERNEL_BASE := 0x10000000
BOARD_KERNEL_PAGESIZE := 2048


# fix this up by examining /proc/mtd on a running device
BOARD_BOOTIMAGE_PARTITION_SIZE := 0x00800000
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x1400000
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 0x22400000
BOARD_USERDATAIMAGE_PARTITION_SIZE := 0x105c0000
BOARD_FLASH_BLOCK_SIZE := 131072


TARGET_PREBUILT_KERNEL := device/lge/lu6500/kernel

#BOARD_HAS_NO_SELECT_BUTTON := true
# Use this flag if the board has a ext4 partition larger than 2gb
#BOARD_HAS_LARGE_FILESYSTEM := true


이 파일은 원래 리커버리가 있으시다면, 당연 풀어서 보시면 되지만 없는 디바이스 일경우

adb shell 또는 안드로이드 터미널 에뮬레이터에서 su 입력후 'cat /proc/mtd' 를 입력하시면 나옵니다.


그래두 못구하시겠다면, 좀 다른 방법을 사용해야 합니다. 여기서 나오는 값은 보드 커널 페이지사이즈랑 보드 커널 베이스 입니다.


BOARD_BOOTIMAGE_PARTITION_SIZE := 부트 파티션 크기를 16진수로 적습니다.
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 리커버리 파티션 크기를 16진수로 적습니다.
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 시스템 파티션 크기를 16진수로 적습니다.
BOARD_USERDATAIMAGE_PARTITION_SIZE := 데이터 파티션 크기를 16진수로 적습니다.
BOARD_FLASH_BLOCK_SIZE := SD카드 파티션 크기를 16진수로 적습니다. / 는 잘 모르겠어요.



이제 boardconfig.mk 파일을 한글자 라도 수정해 저장했다면, 명령을 실행해 줘야 합니다.


make clobber


그런후, 이제 본격적으로 리커버리 이미지 생성전 준비를 해 둡시다.


lunch full_기기명-eng


예) lunch full_lu6500-eng


핡핡...이제 드디어 리커버리 이미지를 생성해 봅시다^^


make -j4 recoveryimage


make clobber

lunch full_기기명-eng

make -j4 recoveryimage


여기서 주의할점이 있습니다.

여기서 뭐라뭐라 나오면서 안되는 경우도 있는데....

그럼 혹시 원래 폰의 리커버리 파일을 뜯으신적이 있나요?

기본 리커버리를 이 방법으로 뜯으셨다면, 그 파일을 삭제해 주셔야 합니다.

를 입력후 엔터를 딱! 하시면 약 3분 가량 후에

android/system/out/target/product/기기명 폴더 안에 recovery.img 가 있답니다!


만약 에러가 뜨신다면, 위에서 수정한 두 파일 수정이 잘못된것 입니다.

전 커널 페이지 값에서 한참 헤맷습니다...ㅠㅠ


 

CWM-winpower7.txt

 

Windows OS에서 보실경우 아래 파일을 받아 주십시오.

 

CWM-winpower7_Windows.txt


+ Recent posts