1.下载源码
某墙的原因,这里采用的是清华大学的镜像:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
1.1 新建用于存放下载脚本文件的目录,第一行命令创建一个名为Source的文件夹,存储所有下载的资源(强迫症,喜欢整理)
mkdir /home/user/Source
cd /home/user/Source
mkdir ~/bin
PATH=~/bin:$PATH
1.2 下载Repo
git clone https://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/
cp git-repo/repo ~/bin/
1.3 修改Repo文件
gedit ~/bin/repo
REPO_URL = ‘https://gerrit.googlesource.com/git-repo’
改为
REPO_URL = ‘https://gerrit-google.tuna.tsinghua.edu.cn/git-repo’
1.4 创建用于存放Android源代码的目录
mkdir android_source
cd android_source
1.5 同步源代码,这里下载的是6.0的版本,-j4是开启4线程,设备好的同学可以设置为8线程,报错的话继续第二行命令
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r79
repo sync -j4
p.s:由于首次同步需要下载 24GB 数据,过程中任何网络故障都可能造成同步失败,建议直接使用初始化包进行初始化。
下载初始包
#下载重试不限次数,防止网络异常中断
wget -c -t 0 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
tar -vxzf aosp-latest.tar
cd aosp
#这时ls的话什么也看不到,因为只有一个隐藏的.repo目录
repo sync
选择版本同步
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r79
repo sync -j4
下载完成,见下图,可能会有部分偏差
源代码目录含义:
目录名 | 描述 |
---|---|
abi | 应用程序二进制接口 |
bionic | C/C++运行时库,在NDK程序中很大一部分调用就是这里的程序 |
bootable | 用于Android装载和启动程序,其中就包括bootloader和recovery。bootloader是Android中唯一在LInux内核之前执行的程序。通过这段程序可以初始化硬件,建立内存控件的映射图等,总之,bootloader就是为LInux内核准备合适的运行环境。 |
build | 用于编译Android源代码以及建议system.img,ramdisk.img等文件的工具 |
cts | 用于兼容性测试的工具 |
dalvik | Dalvik虚拟机的源代码 |
development | 高层的开发和调试工具 |
device | 与设备相关的代码 |
docs | 包含与Android源代码项目的文档和工具,如Dalvik虚拟机格式文档等 |
external | 扩展工具的源代码 |
framworks | Android框架层源代码。也就是Android SDK的源代码 |
hardware | 硬件层接口和库 |
libcore | Java核心库 |
ndk | NDK相关的源代码 |
packages | 与Android系统一同发布的应用程序的源代码 |
prebuilts | Android在各种平台下编译之前要使用的工具 |
sdk | 在开发环境中使用的工具,如ddms,draw9path,sdkmanager等 |
system | Android的基本系统 |
注意:查看所有分支
cd .repo/manifests
git branch -a
如果想切换到其它分支可以重新执行
repo init -b android-7.1.2_r11
repo sync
2.编译源码
2.1 安装编译源码所需要的软件。在控制台中通过cd命令退回到Ubuntu用户的根目录下,然后依次执行以下命令:
sudo apt-get update
sudo apt-get install openjdk-7-jdk
sudo update-alternatives --config java
sudo update-alternatives --config javac
sudo gedit /etc/profile
查看环境变量是否为
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
以上命令每一条都必须分开单独执行,目的是为了获取1.7版本的jdk并设置环境变量。当我们安装完Ubuntu之后可能会自带一个jdk,但是如果用自带的jdk编译Android源码很可能会提示jdk版本不符合要求的错误,因此我们需要重新下载1.7版本的jdk,我用openjdk-7-jdk编译未出现任何问题。
然后验证jdk版本
chenchen@chenchen:~$ java -version
java version "1.7.0_131"
OpenJDK Runtime Environment (IcedTea 2.6.9) (7u131-2.6.9-0ubuntu0.14.04.2)
OpenJDK 64-Bit Server VM (build 24.131-b00, mixed mode)
chenchen@chenchen:~$ javac -version
javac 1.7.0_131
接下来继续执行以下命令,同样每一行都是分开单独执行的:
sudo apt-get install git gnupg flex bison gperf build-essential
sudo apt-get install zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386
sudo apt-get install libgl1-mesa-dev g++-multilib mingw32 tofrodos
sudo apt-get install python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
如果报错,看提示安装相应软件。
以上命令主要是安装编译源码时需要用到的各种软件,如果没有安装这些软件,编译的过程中会提示缺少必要的软件而无法继续编译,因此,在正式编译源码之前,一定要先安装这些软件。
2.2 导入编译Android源码所需的环境变量和其它参数
在控制台中通过cd命令进入到/home/chenchen/Source/android_source/目录下,然后执行命令:
source build/envsetup.sh
chenchen@chenchen:~/Source/android_source$ source build/envsetup.sh
including device/asus/deb/vendorsetup.sh
including device/asus/flo/vendorsetup.sh
including device/asus/fugu/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-mips/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/htc/flounder/vendorsetup.sh
including device/huawei/angler/vendorsetup.sh
including device/lge/bullhead/vendorsetup.sh
including device/lge/hammerhead/vendorsetup.sh
including device/moto/shamu/vendorsetup.sh
including sdk/bash_completion/adb.bash
2.3 在控制台中执行命令:lunch,运行命令之后会提示我们选择编译目标。这里我选择的的默认目标,即aosp_arm_eng。
2.4 在控制台中执行命令:make -j8,开始编译。
整个源码编译完成之后,如果提示如下信息
此时,你可以直接执行命令:emulator,执行之后将会出现android模拟器的界面
3.导入Studio
3.1 修改IDEA_HOME/bin/studio.vmoptions或studio64.exe.vmoptions中-Xms和-Xmx的值。文档中使用的是748m, 可自行修改
3.2 进入Android 源码根目录
执行mmm development/tools/idegen/
这行命令的意思是编译idegen这个项目,生成idegen.jar文件.生成成功后,会显示这个jar包的位置
chenchen@chenchen:~/Source/android_source$ mmm development/tools/idegen/
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=6.0.1
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.4.0-78-generic-x86_64-with-Ubuntu-14.04-trusty
HOST_BUILD_TYPE=release
BUILD_ID=MOB31T
OUT_DIR=out
============================================
make:进入目录'/home/chenchen/Source/android_source'
host Java: idegen (out/host/common/obj/JAVA_LIBRARIES/idegen_intermediates/classes)
Install: out/host/linux-x86/framework/idegen.jar
make:离开目录“/home/chenchen/Source/android_source”
#### make completed successfully (3 seconds) ####
3.3 执行sh ./development/tools/idegen/idegen.sh
chenchen@chenchen:~/Source/android_source$ development/tools/idegen/idegen.sh
Read excludes: 3ms
Traversed tree: 15118ms
执行完后,会在源码的根目录下生成android.ipr和android.iml文件。使用Android studio打开android.ipr文件,就可以导入系统源码了。