컴퓨터 지식 네트워크 - 컴퓨터 제품 - 안드로이드 소스 코드를 직접 컴파일할 수 있나요?

안드로이드 소스 코드를 직접 컴파일할 수 있나요?

최신 Ubuntu 16.04 를 이용하시면 먼저 Git 가 설치되어 있는지 확인해 주세요. Git 를 설치하지 않은 학생들은 다음 명령을 통해 git 를 설치할 수 있습니다.

Sudo apt-get install git git config–글로벌 사용자. email "test @ test.com" gitconfig–글로벌 사용자. name "test "

여기서 test@test.com 은 자신의 사서함입니다.

간략한 설명

안드로이드 소스 코드 컴파일의 네 가지 프로세스: 1. 소스 코드 다운로드 컴파일 환경을 구축하십시오. 소스 코드를 컴파일하십시오. 4 달리기. 이 프로세스에 따라 아래에 설명되어 있습니다.

소스 코드 다운로드

벽이 분리되어 있기 때문에, 여기서 우리는 국산 미러 소스로 다운로드한다.

현재 사용 가능한 거울 소스는 일반적으로 HKUST 와 칭화에서 나온 것으로, 구체적인 용도도 비슷하다. 여기서 나는 칭화대 거울을 선택하여 설명한다. (참조: HKUST 출처, 칭화원)

환매 도구 다운로드 및 설치

다음 명령을 실행하여 repo 도구를 다운로드하고 설치합니다.

Mkdir ~/binpath = ~/bin: $ pathcurl/platform/manifest

또는 다음을 사용합니다.

Repoinit-u git://aosp.tuna.tsinghua.edu.cn/aosp/platform/manifest

둘 다 같은 효과를 거두었지만 합의가 달랐다.

이 명령을 실행하는 동안 프롬프트가 gerrit.googlesource.com 에 연결할 수 없는 경우 ~/bin/repo 파일을 편집하고 REPO_URL 의 행을 찾아 내용을 다음과 같이 변경하기만 하면 됩니다.

REPO_URL = '/git-repo'

그런 다음 위의 명령을 다시 실행하십시오.

주석을 첨부하다

매개 변수가 없는 manifest 명령은 주 서버에서 최신 코드를 가져오는 데 사용되지만 -b 매개 변수를 통해 특정 Android 버전을 지정할 수 있습니다. 예를 들어 android-4.0. 1_r 1 분기를 원하는 경우 명령은 다음과 같습니다.

Repoinit-u/platform/manifest-b Android-4.0.1_ r1

(AOSP 프로젝트의 모든 지점의 현재 리스트는 지점 리스트를 참고하십시오.)

소스 코드를 로컬로 동기화

창고를 초기화한 후에는 코드를 로컬에 정식으로 동기화할 수 있습니다. 이 명령은 다음과 같습니다.

환매 동기화

나중에 최신 원격 코드를 로컬로 동기화해야 하는 경우 이 명령만 실행하면 됩니다. 동기화 중 네트워크 상의 이유로 중단된 경우 이 명령을 사용하여 동기화를 계속할 수 있습니다. 놀라지 않으면 5 시간 만에 모든 소스 코드를 로컬에 동기화할 수 있다. 그래서 이 과정은 밤에 잠을 잘 때 완성할 수 있다.

(팁: 코드가 완전히 동기화되었는지 확인하십시오. 그렇지 않으면 다음 컴파일 중 오류가 참담하게 느껴질 수 있습니다. 불확실한 아동화는 repo sync 로 여러 번 동기화할 수 있습니다. ) 을 참조하십시오

컴파일 환경 구축

소스 코드를 다운로드한 후에는 컴파일 환경을 구축할 수 있습니다. 시작하기 전에 몇 가지 컴파일 요구 사항을 살펴보겠습니다.

1. 하드웨어 요구 사항:

64 비트 운영 체제는 2.3.x 이상 버전만 컴파일할 수 있으며 2.3.x 이하 버전을 컴파일하려면 32 비트 운영 체제가 필요합니다.

디스크 공간이 많을수록 좋으며 100GB 이상. 즉, 더 큰 하드 드라이브를 살 수 있습니다.

지금 가상 시스템에서 Linux 를 실행하려면 최소한 16GB RAM/swap 이 필요합니다.

(사실, 가상 시스템에서 2.3.x 이상의 코드를 컴파일하는 것이 좋습니다. ) 을 참조하십시오

2. 소프트웨어 요구 사항:

1. 운영 체제 요구 사항

AOSP 오픈 소스의 주요 분기는 Ubuntu 의 장기 버전으로 개발 및 테스트되므로 Ubuntu 로 컴파일하는 것이 좋습니다. 다음은 Ubuntu 의 여러 버전이 컴파일할 수 있는 안드로이드 버전입니다.

안드로이드 버전

컴파일에 필요한 최소 Ubuntu 버전

안드로이드 6.0 에서 AOSP 마스터 우번투14.04 까지

안드로이드 2.3.x 에서 안드로이드 5.x Ubuntu12.04 로

안드로이드1.5 에서 안드로이드 2.2.x Ubuntu10.04 까지.

2.JDK 버전 요구 사항

운영 체제 버전 외에 JDK 버전도 주목해야 합니다. 편의상 다양한 안드로이드 버전의 소스 코드에 필요한 JDK 버전도 열거했습니다.

안드로이드 버전

필요한 JDK 버전을 컴파일합니다

AOSP 안드로이드 메인 라인 오픈 JDK 8

Android 5.x 에서 Android 6.0 OpenJDK 7 로

안드로이드 2.3.x 에서 안드로이드 4.4.x 갑골문 JDK 6 까지

안드로이드 1.5 에서 안드로이드 2.2.x 갑골문 JDK 5 까지.

자세한 내용은 Google 소스 코드 컴파일 요구 사항을 참조하십시오

Ubuntu 16.04 에서 AOSP 메인 라인 코드를 컴파일하고 있으므로 OpenJDK 8 을 설치하고 다음 명령을 실행해야 합니다.

Sudo apt-get 설치 openjdk-8-jdk

Ubuntu 14.04 에서 AOSP 메인 라인 코드를 컴파일해야 하는 경우 OpenJDK 8 도 설치해야 합니다. 이 시점에서 다음 명령을 실행해야 합니다.

Sudo apt-get 업데이트 sudo apt-get 설치 openjdk-8-jdk

Android 5.x 에서 Android 6.0 사이의 시스템 버전을 컴파일하려면 openjdk7 이 필요합니다. 그러나 Ubuntu 15.04 이상 온라인 설치 라이브러리는 openjdk8 과 openjdk9 만 지원합니다. 따라서 openjdk 7 을 설치하려면 먼저 PPA 를 설정해야 합니다.

Sudo add-apt-repository PPA: open JDK-r/PPA sudo apt-get 업데이트

그런 다음 설치 명령을 실행합니다.

Sudo apt-get 설치 openjdk-7-jdk

경우에 따라 다른 버전의 안드로이드 시스템을 컴파일해야 하므로 다른 JDK 버전을 사용할 수 있습니다. Jdk 버전 전환의 경우 다음 명령을 사용할 수 있습니다.

Sudo 업데이트-대체-javasudo 업데이트 구성-대체-javac 구성

기타 요구 사항

구글의 공식 컴파일 환경 구축 가이드는 Ubuntu 14.04, Ubuntu 12.04, Ubuntu 10.04 가 추가해야 할 의존성을 설명했다 나는 Ubuntu 16.04 의 설정이 Ubuntu 14.04 와 비슷해야 한다고 생각했는데, 너무 어리다고 말할 수 밖에 없었다.

다음은 Ubuntu 16.04 의 종속성 설정입니다.

Sudo apt-get install libx11-dev: i386 lib readline 6-dev: i386 libgl/kloc- -mesa-dev g++-multilib sudo apt-get install-y git flex bison gperf build-essential lib ncurses 5-dev: i386 sude N libxml 2-utils xsltproc zlib1g-dev: i386 sudo apt-get sudo apt-get install zip curl zlib/kloc. G-dev gcc-multi lib g++-multi lib sudo apt-get install libc 6-dev-i386 sudo apt-get install lib 32 ncurses 5-det Proto-core-devlibx11-devsudo apt-get install libgl1-mesa-

(여러 명령의 매개 변수는 중복되지만 우리를 방해하지 않습니다. ) 을 참조하십시오

컴파일 환경 초기화

위 프로세스가 완료되면 컴파일 환경을 초기화해야 합니다. 이 명령은 다음과 같습니다.

소스 코드 버전 /envsetup.sh

이 명령을 실행한 결과는 다음과 같습니다.

여기에 그림 설명을 하나 써 주세요

이 명령은 다른 실행 스크립트만 도입했을 뿐, 이 스크립트는 무엇을 하고 있는지, 이 문서에는 자세히 설명되어 있지 않다는 것을 쉽게 알 수 있습니다.

명령이 성공적으로 실행되면 밑바닥에서 사용할 점심 명령과 같은 유용한 명령을 받게 됩니다.

소스 코드 컴파일

컴파일 환경이 초기화된 후 컴파일 대상 선택 및 컴파일 수행 단계를 포함한 소스 코드 컴파일 단계로 들어갑니다.

컴파일 대상을 선택합니다

점심 지시문을 통해 컴파일 목표를 설정하다. 컴파일 대상은 생성된 이미지가 어떤 장치에서 실행되는지 말합니다. 여기서는 컴파일 대상을 aosp_arm64-eng 으로 설정하고 명령을 실행합니다.

점심 aosp_arm64-eng

대상 형식 지정 컴파일

빌드 대상의 형식: 빌드 빌드-빌드 유형. 예를 들어 위의 aosp_arm-eng 에 대한 빌드는 aosp_arm 이고 빌드 유형은 eng 입니다.

빌드란 무엇입니까?

BUILD 는 특정 함수 조합의 특정 이름, 즉 컴파일된 이미지를 실행할 수 있는 환경입니다. 여기서 aosp(Android 오픈 소스 프로젝트) 는 Android 오픈 소스 프로젝트를 나타냅니다. Arm 은 시스템이 arm 아키텍처에서 실행되는 프로세서이고 arm64 는 64 비트 arm 아키텍처입니다. 프로세서, x86 은 x86 아키텍처 프로세서를 의미합니다. 또한 특정 Nexus 장치를 나타내는 단어도 있습니다. 다음은 일반적으로 사용되는 장치 코드 및 컴파일 대상입니다. 자세한 내용은 공식 문서를 참조하십시오.

| 모델 | 장치 코드 | 컴파일 대상 |

|-|-|-|

| nexus 6p | angler | aosp _ angler-user debug |

| nexus 5x | bull head | aosp _ bull head-user debug |

| nexus 6 | shamu | aosp _ shamu-user debug |

| nexus 5 | hammerhead | aosp _ hammerhead-userdebug |

팁: Nexus 장치가 없는 경우 일반적으로 arm 또는 x86 중에서 선택할 수 있습니다.

빌드 유형이란 무엇입니까?

빌드 유형은 컴파일 유형이며 일반적으로 세 가지 유형이 있습니다.

-user: 즉, 컴파일 된 시스템 미러링은 공식적으로 시장에 출시 될 수있는 버전이며 권한은 제한적입니다 (예: 루트 권한 없음, dedug 와 다름 등). ).

-userdebug: 사용자 버전에 따라 루트 및 디버그 권한을 켭니다.

-debug: engineer 를 대표합니다. 개발 엔지니어의 버전입니다. 최대 권한 (루트 등) 을 가지고 있습니다. ) 에는 많은 디버깅 도구가 포함되어 있습니다.

편성 목표의 구성을 이해하면 자신의 현재 상황에 따라 선택할 수 있다. 목표는요?

매개 변수 없이 점심 명령만 실행하면 됩니다. 나중에 콘솔에는 모든 컴파일 대상이 다음과 같이 나열됩니다.

여기에 그림 설명을 하나 써 주세요

그런 다음 해당 숫자만 입력하면 됩니다.

예를 들어, Nexus 장치가 없는 경우 컴파일 후 실행만 하려면 aosp_arm-eng 를 선택할 수 있습니다.

(Ubuntu 16.04(64 비트) 컴파일 후 가상 머신을 시작할 때 검은색 화면에 끼워져 aosp_arm64-eng 컴파일을 시도합니다. 그래서 저는 aosp_arm64-eng 을 사용했습니다. ) 을 참조하십시오

컴파일을 시작합니다

Make 지시문을 통해 코드를 컴파일하고 -j 매개 변수를 통해 컴파일에 참여하는 스레드 수를 설정하여 컴파일 속도를 높입니다. 예를 들어, 8 개의 스레드를 설정하여 동시에 컴파일합니다.

브랜드 -j8

컴파일에 참여하는 스레드 수가 많을수록 좋지 않다는 점에 유의해야 합니다. 보통 당신의 기계 컵의 핵심에 따라 결정됩니다. 코어 * 2 는 현재 CPU 코어의 두 배입니다. 예를 들어, 현재 내 노트북은 듀얼 코어 4 스레드라면 공식에 따라 가장 빠른 컴파일은 make -j8 이 될 수 있습니다.

(cat /proc/cpuinfo 를 통해 관련 CPU 정보 확인)

만약 모든 것이 순조롭다면, 컴파일은 몇 시간 안에 완성할 수 있다. 보기 # # make 가 성공적으로 완료되었습니다 (01:18: 45 (hh: mm: ss)) # # 컴파일되었음을 나타냅니다.

달리기 시뮬레이터

컴파일한 후 다음 명령을 사용하여 Android 가상 시스템을 실행할 수 있습니다.

소스 build/envsetup.shlunch (방금 설정한 대상 버전 선택, 예: 2 선택) 시뮬레이터.

이전에 source 및 lunch 명령을 실행했기 때문에 컴파일 직후 가상 시스템을 실행하는 경우 가상 시스템을 실행하는 명령만 실행하면 됩니다.

에뮬레이터

놀라지 않으면, 잠시 후에 실행 인터페이스를 볼 수 있습니다.

여기에 그림 설명을 하나 써 주세요

보충

에뮬레이터 작업에 대해서는 에뮬레이터 작동에 필요한 네 가지 파일을 살펴보겠습니다.

리눅스 커널

System.img

Userdate.img

Ramdisk.img

점심 명령을 사용할 때 aosp_arm-eng 을 선택하면 매개 변수 없이 emualtor 명령을 실행할 때 Linux 커널은 기본적으로/source/prebuilds/QEMU-kernel/arm/kernel 을 사용합니다 안드로이드 미러 파일의 기본값은 방금 컴파일한 미러인 source/out/target/product/generic 디렉토리의 system.img, userdata.img 및 ramdisk.img 입니다

위에서 점심 명령을 사용할 때 aosp_arm64-eng 을 선택했기 때문에 리눅스는 기본적으로/source/prebuilds/QEMU-kernel/arm64/kernel-QEMU 아래의 kernel 을 사용합니다

물론 시뮬레이터 명령을 사용하면 시뮬레이터를 통해 볼 수 있는 매개변수 설정을 통해 다른 파일을 사용할 수 있습니다.

모듈 컴파일

구글은 make 명령을 통해 전체 안드로이드 소스 코드를 컴파일하는 것 외에도 개별 모듈의 컴파일을 지원하는 명령을 제공합니다.

컴파일 환경이 초기화된 후 (즉 소스 코드인 build/envsetup.sh 실행) 우리는 위에서 사용한 도시락 외에 다음과 같은 유용한 지침을 얻을 수 있습니다.

-응? -croot: 디렉토리를 트리의 맨 위로 변경합니다. -응? -m: 나무 꼭대기에서 시작하십시오. -응? -mm: 현재 디렉토리의 모든 모듈을 구성합니다. -응? -mmm: 제공된 디렉토리에 모든 모듈을 작성합니다. -응? -cgrep: 모든 로컬 C/C++ 파일의 Greps. -응? -jgrep: 모든 로컬 Java 파일의 grep 입니다. -응? -resgrep: 모든 로컬 res/* 의 grep. Xml 파일. -응? -godir: 파일이 포함된 디렉토리로 이동합니다.

Mmm 지시문은 지정된 디렉토리를 컴파일하는 데 사용됩니다. 일반적으로 각 디렉토리에는 하나의 모듈만 포함되어 있습니다. 예를 들어, 여기서는 Launcher2 모듈을 컴파일하고 명령을 실행합니다.

Mmm 패키지/어플리케이션/부트 2/

잠시 후, 메시지가 나타나면:

# # # 성공적인 성공 # # #

이것은 컴파일이 완료되었음을 의미합니다. 이제 out/target/product/gereric/system/app 에서 컴파일된 Launcher2.apk 파일을 볼 수 있습니다.

시스템 이미지를 다시 패키지합니다

지정된 모듈을 컴파일한 후 해당 모듈의 apk 를 시스템 미러에 통합하려면 make snod 지시어를 사용하여 시스템 미러를 다시 패키징해야 합니다. 이렇게 하면 새로 생성된 system.img 에 방금 컴파일된 Launcher2 모듈이 포함되어 시뮬레이터를 다시 시작하면 적용됩니다.

모듈을 개별적으로 설치합니다

우리는 몇 가지 모듈을 끊임없이 수정하고 있는데, 매번 컴파일을 마칠 때마다 system.img 를 다시 포장하고 휴대폰을 다시 시작할 수는 없겠죠? 간단한 방법이 있습니까?

컴파일 후 생성된 apk 파일은 ADB install 명령을 사용하여 디바이스에 직접 설치할 수 있습니다. make snod 를 사용하는 것보다 많은 이벤트를 절약할 수 있습니다.

보충

다음은 out/target/product/generic/system 디렉토리 아래의 공통 디렉토리에 대한 간략한 설명입니다.

안드로이드 시스템과 함께 제공되는 apk 파일은 out/target/product/generic/system/apk 디렉토리에 있습니다.

C 컴파일의 실행과 같은 일부 실행 파일은 out/target/product/generic/system/bin 디렉토리에 있습니다.

동적 링크 라이브러리는 out/target/product/generic/system/lib 디렉토리에 있습니다.

하드웨어 추상화 계층 파일은 모두 out/target/product/generic/system/lib/HW 디렉토리에 있습니다.

SDK 컴파일

SDK 를 직접 컴파일해야 하는 경우 매우 간단합니다. make SDK 명령만 실행하면 됩니다.

오차 세트

컴파일하는 동안 발생하는 대부분의 오류는 구글에서 찾을 수 있습니다. 다음은 몇 가지 일반적인 오류입니다.

오류 1: 임시 컴파일에 잘못된 버전을 사용하고 있습니다. 구체적인 오류는 다음과 같습니다.

그림 설명을 입력하려면 클릭하십시오.

여기에 그림 설명을 하나 써 주세요

구축 환경의 요구 사항을 자세히 살펴보면 이 오류는 피할 수 있습니다. 물론 이 문제도 쉽게 해결할 수 있습니다. openjdk 8 을 설치하고 sudo update-alternative 명령을 사용하여 JDK 버전을 전환하는 것을 잊지 마십시오.

오류 2: 메모리 부족 오류입니다. 구체적인 오류는 다음과 같습니다.

그림 설명을 입력하려면 클릭하십시오.

여기에 그림 설명을 하나 써 주세요

이 오류는 특히 AOSP 메인 라인 코드를 컴파일할 때 더 작은 JVM 힙 크기로 인해 발생합니다.

현재 다음과 같은 두 가지 솔루션이 있습니다.

방법 1:

명령을 컴파일하기 전에 pre builds/SDK/tools/jack-admin 파일을 수정하고 파일에서 다음 줄을 찾습니다.

Jack _ server _ command = "Java-djava.io.tmpdir = $ tmpdir $ jack _ server _ VM _ arguments

그런 다음 다음 그림과 같이 해당 행에 -Xmx4096m 을 추가합니다.

Jack _ server _ command = "Java-djava.io.tmpdir = $ tmpdir $ jack _ server _ VM _ arguments

그런 다음 time make -8j 를 실행합니다.

방법 2:

콘솔에서 다음 명령을 실행합니다.

Exportjack _ server _ VM _ arguments = "-dfile.encoding = utf-8-xx:+tiered compilation-xx

그림과 같이:

그림 설명을 입력하려면 클릭하십시오.

여기에 그림 설명을 하나 써 주세요

명령을 실행한 후 make 명령을 사용하여 컴파일을 계속합니다. 경우에 따라 jack-admin kill-server 를 실행할 때 명령이 없다는 메시지가 나타날 수 있습니다. 이 시점에서 out/host/linux-x86/bin/ 디렉토리로 이동하면 jack-admin 파일이 존재하지 않는다는 것을 알 수 있습니다. 내가 너라면, 나는 다시 시작할 것이다.

오류 3: 에뮬레이터를 사용할 때 가상 머신이 검은색 화면 인터페이스에서 멈추고 클릭해도 아무런 반응이 없습니다. 이 시점에서 kerner 문제가 될 수 있으며 해결 방법은 다음과 같습니다.

다음 명령을 실행합니다.

。 /out/host/Linux-x86/bin/emulator-partition-size1024-kernel. /prebuilds/QEMU-kernel/arm/kernel-QEMU-armv7

커널-QEMU-arm V7 커널은 시뮬레이터가 검은색 화면을 기다리는 문제를 해결하는 데 사용되고 -partition-size 1024 는 경고 해결을 위해 사용됩니다. 시스템 파티션 siez 는 미러 파일 (1) 과 일치하도록 조정됩니다

처음에 컴파일한 버전이 aosp_arm-eng 인 경우 위 명령을 사용해도 검은색 화면을 기다리는 문제가 해결되지 않으면 aosp_arm64-eng 를 컴파일할 수 있습니다.

그것을 완성하다.

지금까지 Android 컴파일의 전 과정을 이미 알고 있습니다. 또한 안드로이드 소스 코드의 다중 창고 관리 메커니즘에 대해서도 간단히 설명하겠습니다. 다음으로, 제가 직접 해보겠습니다.

上篇: 애플 노트북 macbook pro 아이콘 세로로 어떻게 조절해 下篇: Lenovo thinkpadt450에 마이크가 없는 이유는 무엇입니까?
관련 내용