Android源码下载与编译

环境

Ubuntu 16.04 LTS
清华大学镜像源
Android 9.0.0_r30

准备工作

安装依赖包和工具

sudo 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 libgl1-mesa-dev libxml2-utils xsltproc unzip

安装OpenJDK 8

注: 目前的android源码中实际上都自带了JDK,在prebuilts/jdk中,所以理论上是不用再单独配置JDK的。这里之所以要配置,主要是考虑到其它应用程序或者其他场景可能会用到java,还是配一个公有的JDK方便些,毕竟有利而无害。

sudo apt-get install openjdk-8-jdk 

不用配置环境变量PATH,因为系统默认会在/usr/bin下建立java/javac等的软连接,而/usr/bin已经在PATH中了。可以使用which java查看java可执行程序的路径。

使用java -version查看版本信息:

blues@android:~$ java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.16.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

如果安装多个版本的JDK,使用update-alternatives切换:

sudo update-alternatives --config java
sudo update-alternatives --config javac

配置ccache编译缓存

ccache可以加速编译过程,如果不配置也没有问题,但是会慢很多。
开启ccache开关:
在~/.bashrc文件中新增一行:

export USE_CCACHE=1

保存后source一下该文件, 使配置生效:

source ~/.bashrc

配置缓存为50G(默认5G):

ccache -M 50G

执行ccache -s查看配置和使用情况:

blues@android:~/android/aosp$ ccache -s
cache directory                     /home/blues/.ccache
primary config                      /home/blues/.ccache/ccache.conf
secondary config      (readonly)    /etc/ccache.conf
cache hit (direct)                     0
cache hit (preprocessed)               0
cache miss                         41098
called for link                      307
called for preprocessing               8
unsupported source language         1084
files in cache                     22771
cache size                         957.3 MB
max cache size                      50.0 GB

如果ccache未安装,使用sudo apt-get install ccache进行安装。

下载repo脚本

repo脚本需要放在家目录的bin目录里,这个目录一般都是没有的,需要新建:

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

bin目录需要添加到PATH中,这样就可以在任意位置使用repo,由于Ubuntu 16.04 LTS中已经默认把该目录加进去了(在~/.profile中添加的),所以我们不需要做任何操作。如果想确认PATH中的内容,可以执行echo $PATH查看。

下载Android源码

新建一个目录存放源码,进入该目录,执行repo init初始化repo仓,然后使用repo sync同步。

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -b android-9.0.0_r30
repo sync

-u: 指定REPO_URL,即远程repo仓地址,这里选择的是清华大学镜像源。

如果有VPN等途径能够访问源码官网的话,可以直接从官网下载:
repo init -u https://android.googlesource.com/platform/manifest

-b: 指定分支。

如果不知道有哪些分支,可以 先不加-b参数(此时默认是master分支)。初始化完成之后,cd进入.repo/manifests目录下,执行git branch -a查看所有分支信息,如下截取了部分结果:可以看到android-9.0.0_r30是在里面的,

remotes/origin/android-9.0.0_r22
remotes/origin/android-9.0.0_r3
remotes/origin/android-9.0.0_r30
remotes/origin/android-9.0.0_r31
remotes/origin/android-9.0.0_r32
remotes/origin/android-9.0.0_r33
remotes/origin/android-9.0.0_r5
remotes/origin/android-9.0.0_r6
remotes/origin/android-9.0.0_r7
remotes/origin/android-9.0.0_r8
remotes/origin/android-9.0.0_r9
remotes/origin/android-arch-navigation-release
remotes/origin/android-arch-work-release
remotes/origin/android-cts-2.2_r8
remotes/origin/android-cts-2.3_r10
remotes/origin/android-cts-2.3_r11

然后使用 repo init -b 分支名 选择要切换的分支,然后执行 repo sync 同步。哪怕以后代码全部下载完毕,想要再下载其它分支代码,也是同样操作:

  1. repo init -b 选择分支
  2. repo sync 同步

同步过程比较耗时,根据网速情况有所差异,甚至可能会中断,不用担心,再次执行repo sync就可以了。

开始编译

进入源码目录,执行三步走战略,

  1. 执行source build/envsetup.sh初始化编译环境
blues@android:~/android/aosp$ source build/envsetup.sh 
including device/generic/car/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-mips64/vendorsetup.sh
including device/generic/mini-emulator-mips/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/generic/uml/vendorsetup.sh
including device/google/crosshatch/vendorsetup.sh
including device/google/cuttlefish/vendorsetup.sh
including device/google/marlin/vendorsetup.sh
including device/google/muskie/vendorsetup.sh
including device/google/taimen/vendorsetup.sh
including device/linaro/hikey/vendorsetup.sh
including sdk/bash_completion/adb.bash

  1. 执行lunch aosp_arm64-eng,选择目标产品参数为aosp_arm64-eng。如果想选择其它产品,直接执行lunch,会出现选择列表。
blues@android:~/android/aosp$ lunch aosp_arm64-eng

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=9
TARGET_PRODUCT=aosp_arm64
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv8-a
TARGET_2ND_CPU_VARIANT=generic
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.15.0-45-generic-x86_64-Ubuntu-16.04.5-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=PQ1A.190105.004
OUT_DIR=out
  1. 执行make,开始编译
make -j4

-j后面的数字根据CPU的规格而定,一般是[cpu核心数x每个核心的线程数],所以j4或j8都是常用的设定。以下是jN的官方解释:
Build everything with make. GNU make can handle parallel tasks with a -jN argument, and it’s common to use a number of tasks N that’s between 1 and 2 times the number of hardware threads on the computer being used for the build. For example, on a dual-E5520 machine (2 CPUs, 4 cores per CPU, 2 threads per core), the fastest builds are made with commands between make -j16 and make -j32.

如果单编模块的话,可以使用make+模块名,如下编译packages/services/Telephony:

make TeleService

模块名通过工程下的Android.mk确认,如查看packages/services/Telephony/Android.mk中的LOCAL_PACKAGE_NAME := TeleService,确认Telephony的编译模块名为TeleService。

搭建Opengrok环境(可选)

如果需要通过Opengrok来阅读Android源码的话,可以参考这篇文章来搭建Opengrok:
搭建Opengrok–阅读Android源码

参考

Establishing a Build Environment
Downloading the Source
Preparing to Build

发布了11 篇原创文章 · 获赞 44 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 精致技术 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览