下面的操作都是在Linux下进行的,我用的Ubuntu。切换到su超级用户。
1.下载源码,有各种方法:
①你如果能访问谷歌的话,直接用Git下载。
②不能访问谷歌,那就搜索下载源码压缩包(搜不到的可以联系我)。
2.安装open jdk 7(必须),不要安装Oracle的jdk,这里面的原因比较复杂,我想大概和之前oracle-Google打官司有关吧。
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-7-jdk
执行
gedit ~/.bashrc
添加jdk的环境变量,通过apt-get安装的软件一般都在/usr/lib/目录下:
# set jdk PATH
export PATH=/usr/lib/jvm/java-7-openjdk-amd64/bin:$PATH
保存并退出。
3.安装各种软件包:
sudo apt-get install git gnupg flex bison gperf build-essential
sudo apt-get install zip curl libc6-dev libncurses5-dev x11proto-core-dev
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386
sudo apt-get install g++-multilib tofrodos lib32ncurses5-dev lib32ncursesw5-dev
sudo apt-get install python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install lib32z1 dos2unix gcc g++
4.在 .bashrc文件中添加相关属性:
echo export USE_CCACE=1 >> ~/.bashrc
5.在终端cd进入到下载好并解压了的源码目录下,导入编译Android源码所需的环境变量和其它参数,运行以下命令:
source build/envsetup.sh
注意:由于我们需要烧录的是真机,所以一定要事先准备好相应机型的驱动,否则烧录之后开机会一直卡在Google logo这个界面里。
驱动下载:https://developers.google.com/android/drivers#shamulrx21o
可以看到,nexus5的5.0对应的驱动是LRX21O,我们下载好驱动之后,拷贝到源码根目录,执行
tar -zxvf 驱动.tgz
命令依次解压出.sh文件还是放到源码根目录下,运行文件就会在根目录下生成vendor文件夹,里面放着驱动(三个驱动都要下载、解压)。
运行
make clobber
清除无用的编译。
6.运行lunch命令选择编译目标
lunch
nexus5选择aosp_hammerhead-userdebug,也就是输入20并回车,如果是模拟器就选择aosp_arm-eng
7.执行make
make -j10
【执行make -j8, 8为同时编译的线程数,一般Google推荐执行源码编译的线程数 = CPU核心数x 2 + 2,比如4核,就推荐10线程编译,执行make –j10。】
关于cpu个数,可以用下面命令查看:
cat /proc/cpuinfo
如果有报错的话,直接输入make重试。
当你看到下面一堆输出时,已经编译完成了:
Creating filesystem with parameters:
Size: 1073741824
Block size: 4096
Blocks per group: 32768
Inodes per group: 8192
Inode size: 256
Journal blocks: 4096
Label:
Blocks: 262144
Block groups: 8
Reserved block group size: 63
Created filesystem with 1411/65536 inodes and 81288/262144 blocks
Install system fs image: out/target/product/hammerhead/system.img
out/target/product/hammerhead/system.img+out/target/product/hammerhead/obj/PACKAGING/
recovery_patch_intermediates/recovery_from_boot.p maxsize=1096212480 blocksize=135168 total=317825554 reserve=11083776
recovery_patch_intermediates/recovery_from_boot.p maxsize=1096212480 blocksize=135168 total=317825554 reserve=11083776
#### make completed successfully (01:18:47 (hh:mm:ss)) ####
我的i7+16G内存等待一个多小时,编译成功之后我们就要把源码弄成可以在AndroidStudio下查看的项目(只是为了方便我们学习源码):
使用m、mm、mmm命令之前要在android源码目录下执行命令:
. build/envsetup.sh
1.生成IDE工具文件
mmm development/tools/idegen/
运行完将生成idegen.jar文件。
2.生成Android Studio配置文件
主要是生成android.iws, android.ipr, android.iml,这三个文件是Android Studio项目的关键文件,主要就是列出项目的模块组成,依赖关系,目录结构。
sh ./development/tools/idegen/idegen.sh
3.导入到AndroidStudio
打开Android Studio,File->Open->源码根目录android.ipr,Android会自动导入工程所有代码,漫长的indexing过程耗时30~120分钟左右,i7+16G内存也就20分钟左右,听4首歌曲的时间。
过程:index中会弹出framework的config提示,点击config, 然后确认,会继续indexing一段时间。
结束:indexing结束后,选择project视图,就看到文章开始的那张清晰的代码结构了。
注意:如果你编译的是 aosp 分支 可能会出现
Exception in thread “main” Java.io.FileNotFoundException: ./out/target/product/generic/obj/GYP/shared_intermediates/res.java (Is a directory)
解决办法:这其实是一个bug,打开/development/tools/idegen/src/Configuration.java,将
if (path.endsWith(".java"))
修改为
if (path.endsWith(".java") && !file.isDirectory())
好了,源码我们后面有时间再看,既然已经编译完成,我们就烧录到手机上看看呗。
1.安装adb:
apt-get install adb
2.进入fastboot模式
adb reboot bootloader
3.安装fastboot命令
apt-get install fastboot
4.指定rom位置
export ANDROID_PRODUCT_OUT=out/target/product/hammerhead
5.烧录
fastboot flashall -w
-w选项清除设备的data分区,对你第一次烧录设备非常有用,如果不是第一次的话则可选可不选。
编译过程遇到的问题:
1.unsupported reloc 43
解决办法:文件 /art/build/Android.common_build.mk,找到:
# Host.
ART_HOST_CLANG := false
ifneq ($(WITHOUT_HOST_CLANG),true)
# By default, host builds use clang for better warnings.
ART_HOST_CLANG := true
endif
改成如下:
# Host.
ART_HOST_CLANG := false
ifeq ($(WITHOUT_HOST_CLANG),false)
# By default, host builds use clang for better warnings.
ART_HOST_CLANG := true
endif
如果错误还存在,尝试:
cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld
2.build/core/tasks/apicheck.mk:57: recipe for target ‘out/target/common/obj/PACKAGING/checkapi-current-timestamp’ failed
解决办法:
make update-api && make -j10