이번 포스팅에서는 원문에서 설명된 안드로이드 OS 컴파일을 위한 환경 구축과 소스코드 다운로드 방법을 설명한다.

안드로이드는 오픈 소스 라이센스로 구성되어 있기 때문에 구글에서는 이를 공개하여 git으로 다운로드 할 수 있도록 제공한다.

다운로드에 대한 원문 설명은 아래와 같다.

Android OS Soruce Code : http://source.android.com/source/index.html

 

원문에서는 GNU/Linux와 Mac OS (Intel/x86) 두 가지에 대한 환경 구축을 설명하지만, 이번 포스팅에서는 리눅스 환경에서 구축하는 것을 주로 하여 설명한다.

 

 

1. 환경 구축 요구사항

  - http://source.android.com/source/requirements.html

 

하드웨어 요구사항

  - 진저브레드(2.3.x) 이상의 OS 버전에서는 64-bit 환경 필요

  - checkout에 필요한 공간은 최소 100GB이며, 싱글 빌드시 150GB가 필요하고, 그 이상일 경우 최소 200GB를 필요

  - 가상 머신환경에서는 최소 16GB의 RAM/swap 크기 필요


소프트웨어 요구사항

  - Android 6.0 (Marshmallow) - AOSP master: Ubuntu 14.04 (Trusty)

  - Android 2.3.x (Gingerbread) - Android 5.x (Lollipop): Ubuntu 12.04 (Precise)

  - Android 1.5 (Cupcake) - Android 2.2.x (Froyo): Ubuntu 10.04 (Lucid)


Java Development Kit (JDK)

  - The master branch of Android in AOSP: Ubuntu - OpenJDK 8, Mac OS - jdk 8u45 or newer
  - Android 5.x (Lollipop) - Android 6.0 (Marshmallow): Ubuntu - OpenJDK 7, Mac OS - jdk-7u71-macosx-x64.dmg
  - Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat): Ubuntu - Java JDK 6, Mac OS - Java JDK 6
  - Android 1.5 (Cupcake) - Android 2.2.x (Froyo): Ubuntu - Java JDK 5

 

주요 패키지

  - Python 2.6 -- 2.7 from python.org
  - GNU Make 3.81 -- 3.82 from gnu.org; Android 3.2.x (Honeycomb) and earlier will need to revert from make 3.82 to avoid build errors
  - Git 1.7 or newer from git-scm.com

 

 

2. 환경 구축

필자의 경우 Ubuntu 14.04.4 LTS 에서 구동되는 것을 확인하였으며, Build:LMY48T / Branch:android-5.1.1_r19의 소스 코드를 다운받아 빌드되는 것을 확인하였다.


  - 필요 패키지 설치

    $ apt-get update

    $ 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

 

 

3. Repo 설치

  - http://source.android.com/source/downloading.html

 

  - root 디렉토리 아래에 bin 디렉토리를 만들고 PATH 환경 변수 설정

$ mkdir ~/bin
$ PATH=~/bin:$PATH

  - Repo 도구를 다운로드하고 실행 퍼미션 설정

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

 

 


4. Repo 클라이언트 초기화

  - 소스 코드를 다운받아 작업할 디렉토리 생성

$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY


  - 해당 git에 이름과 이메일 주소 등록

$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"


  - 등록하지 않은 상태에서 Repo 클라이언트 초기화를 진행하면 다음과 같은 에러가 발생
 


 

  - 기본 마스터로 설정된 코드를 다운받고 싶다면 아래와 같이 입력

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


  - 만약 원하는 특정 버전의 소스 코드를 받고 싶다면 -b 옵션으로 해당 브런치 네임을 사용하여 초기화

$ repo init -u https://android.googlesource.com/platform/manifest -b {BranchName}

  ex) repo init -u https://android.googlesource.com/platform/manifest -b android-5.1.1_r19


  - 원하는 브런치를 확인하기 위해서는 아래의 주소를 참고하면 된다.

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

 

 


  - 다음과 같이 'y'를 누르면 Repo 클라이언트 초기화 작업은 완료된다.

 

 

5. 안드로이드 소스 코드 다운로드 (android-5.1.1_r19 기준 약 40GB, 1시간 반 소요)

$ repo sync



 

  - 소스 코드 다운로드 완료 후, 저장된 소스 코드 목록

 

 

안드로이드 OS는 리눅스 기반의 환경에서 Dalvik/ART으로 하여금 앱이 동작하며, 따라서 리눅스에 대한 Native Code를 지원한다.

간단히 설명하자면, 리눅스 기반의 C/C++ 코드를 지원하며 안드로이드 NDK (Native Development Kit)를 이용하여 컴파일이 가능하다.

아래는 안드로이드 NDK를 받기 위한 경로이다.

 

안드로이드 NDK (Native Development Kit) : http://developer.android.com/ndk/downloads/index.html

 

다운받은 NDK를 압축 풀어보면, 아래와 같은 파일목록이 있는데, 이 중 ndk-build.cmd​를 이용하여 컴파일한다. 편의를 위해서는 환경변수를 등록하여 사용하는 것이 좋다.

 

 

안드로이드 기기에서 실행하기 위한 간단한 소스를 입력한 후 저장을 하자.

 

 

ndk-build.cmd를 이용하기 위해서는 해당 소스 파일이 jni ​디렉토리에 있어야 한다. 또한 Makefile을 만들어주어야 하는데 자세한 정보는 아래페이지에 설명되어 있으니 참고해서 사용하면 된다. 이번 포스팅에서는 간단하게 NDK를 이용한 안드로이드 환경에서의 Hello World 프로그램 작성이므로, 간단한 컴파일 방법까지만 설명한다.

 

Android.mk : http://developer.android.com/ndk/guides/android_mk.html

 

 

다음과 같이 Android.mk로 Makefile을 만들고 ndk-build를 실행하면 HelloWorld.c 파일이 컴파일 된 것을 확인할 수 있다.

 

 

컴파일된 바이너리 파일은 libs 디렉토리에서 확인할 수 있다.

 

 

실행을 위해 adb를 이용하여 안드로이드 기기의 /data/local/tmp 디렉토리에 push 한다.

 

 

안드로이드 USB 디버깅 모드 설정이 되어있지 않다면, 이전 포스팅에서 정리한 글을 참고하여 USB 디버깅 모드를 설정한다.

안드로이드 USB 디버깅 모드 설정 : http://blog.naver.com/programmist/220653236705

adb push를 이용하여 /data/local/tmp 디렉토리의 HelloWorld를 바로 실행하게 되면, 아래와 같이 실행 권한이 없기 때문에 실행이 되지 않는다.

 

 

chmod를 이용하여 실행 권한을 준다.

 

 

실행 권한을 주고 난 뒤, 해당 파일을 실행시키면 다음과 같이 정상적으로 HelloWorld가 뜨는 것을 확인할 수 있다.

 

 

다음과 같은 방법으로 일반적인 POSIX를 따르는 소스 코드는 NDK를 이용하여 구현이 가능하며, Linux에서 사용하는 많은 명령어들이 크로스 컴파일를 이용하여 공개되어 있다. 따라서, NDK에서 지원하지 않는 라이브러리가 있더라도 해당 라이브러리 소스 코드만 있다면 NDK를 이용하여 다양한 응용이 가능할 것이다.

 

안드로이드는 USB 디버깅 모드가 활성화 되어 있으면, 설치된 앱의 apk 파일을 추출하는 것이 가능하다.

 

안드로이드 USB 디버깅 활성화 방법은 이전 포스팅에서 설명하였다.
USB 디버깅 모드 설정 : 2017/05/02 - [Android] - 안드로이드 USB 디버깅 모드 설정

 

앱을 추출하기 위해서, 이전 포스팅에서 예를 들었던 Notepad for Android 앱을 추출하는 것을 예시로 설명한다.
Notepad for Android : https://play.google.com/store/apps/details?id=com.blogspot.logpedia.note2

 

안드로이드 앱을 설치하게 되면 기본 경로는 /data/app ​디렉토리에 apk 원본파일을 다운받아 저장한다.
저장되는 파일명은 해당 apk의 AndroidManifest.xml에 등록된 Package명-1.apk로 저장하게 되며, 이를 이용하여 저장되는 디렉토리와 해당 apk파일명에 대해 유추가 가능하다.

 

 

먼저 apk를 추출하기 전, 먼저 자신의 안드로이드 버전을 확인해야 한다.
안드로이드가 4,x에서 5.x로 넘어가면서부터 설치된 apk가 저장되는 경로가 바뀌어졌으며, 해당 경로를 직접적으로 확인하기 위해서는 아래의 그림처럼 루팅(Rooting)을 해야 확인 가능하다.

 

 

4.x 이하 버전에서는 다음과 같이 루트 권한을 가진 상태에서 경로를 확인해보면 설치된 앱의 apk가 /data/app ​디렉토리에서 앱의 ​Package명-1.apk 형태로 저장이 되어 있는 것을 확인할 수 있다.

따라서, AndroidManifest.xml를 분석하여 Package명을 알 수 있으면 4.x 이하 버전에서는 이와 같은 경로로 설치된 앱에 대하여 저장 경로가 유추가 가능하고, 이를 바탕으로 adb 명령어를 사용하여 다음 아래 그림과 같이 루트 권한 없이도 해당 앱을 추출하는 것을 확인할 수 있다.

 

 

4.x 이하 버전과는 다르게 5.x 버전 이후에서는 아래 그림처럼 apk가 저장되는 경로가 /data/app/Package-1 ​디렉토리로 변경되고, 해당 디랙토리 내의 base.apk ​형태로 앱이 저장되도록 변경되었다.

 

 

앞서, 설명한 것과 마찬가지로 adb 명령어를 이용하면, 루트권한 없이도 앱 추출이 가능하다.

 

 

 

+ Recent posts