一、准备环境
在Mac下编译Android的源代码需要一个大小写敏感(Case Sensitive)的分区格式。
官方指南:https://source.android.com/source/requirements
1,大小写敏感的磁盘分区
如果你原来的分区不是HFS一类大小写敏感的文件格式,那么最简单的办法就是新建一个这种分区格式的dmg出来,命令如下:
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 100g ~/android.dmg
最好保证100g的空间,我最后占用空间74.06G。
android.dmg 根据自己实际情况写存放的位置,可放在移动硬盘下。
双击android.dmg.sparseimage,mount volume到/Volumes/android。
2,挂载和卸载android.dmg文件
hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android
hdiutil detach /Volumes/android
3,补充1:如果你镜像创建完毕,想改变镜像大小,可以执行下面代码:
hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
4,补充2:你可以为bash添加function,以便快速挂载和卸载android.dmg文件。但如果和我一样偷懒镜像文件直接放桌面,则可以省略这一步,直接从桌面装载镜像就行。
# mount the android file image
function mountAndroid { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }
# unmount the android file image
function umountAndroid() { hdiutil detach /Volumes/android; }
二、源码下载
官方下载教程:http://source.android.com/source/downloading.html
建议使用:清华镜像
1,下载repo
下载Repo之前,需要创建一个bin文件,并且将路径写入到path中:
mkdir ~/bin
PATH=~/bin:$PATH
然后在命令行中输入下面的命令,下载Repo,并且修改属性:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
image-01.png
可以将Repo中的下载地址改为清华大学tuna镜像源,这样就不用挂着VPN下载了。编辑Repo,修改REPO_URL后的地址:
REPO_URL = 'https://gerrit-googlesource.lug.ustc.edu.cn/git-repo'
image-02.png
2,下载源码
创建源码目录:
mkdir android-5.1.0
cd android-5.1.0
根据你的Nexus设备,选择代码分支:Source Code Tags and Builds。执行repo init
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-5.1.0_r1
image-03.png
完成后,执行下面的命令
repo sync
由于下载源码的时间太长,中途可能会出现中断情况,虽然repo同步是支持断点续传,但是不知道什么时候会断开,这一点很麻烦,所以可以写一个shell脚本来开启同步。
可以打开sublime text命名新建一个aospdown.sh,然后拷贝到android-5.1.0,运行./aospdown.sh,等待下载
#!/bin/bash
PATH=~/bin:$PATH
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-5.1.0_r1
repo sync
while [ $? = 1 ]; do
echo "================sync failed, re-sync again ====="
sleep 3
repo sync
done
下载完成后可以,完成后可以删除.repo/文件
rm -rf .repo/
三、源码编译
1,初始化编译环境:source build/envsetup.sh
MacBook-Pro:android xp$ source build/envsetup.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-mips64/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/google/dragon/vendorsetup.sh
including device/google/marlin/vendorsetup.sh
including device/htc/flounder/vendorsetup.sh
including device/huawei/angler/vendorsetup.sh
including device/lge/bullhead/vendorsetup.sh
including device/linaro/hikey/vendorsetup.sh
including device/moto/shamu/vendorsetup.sh
including sdk/bash_completion/adb.bash
2,根据设备选择target:lunch
MacBook-Pro:android xp$ lunch
You're building on Darwin
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_mips-eng
4. aosp_mips64-eng
5. aosp_x86-eng
6. aosp_x86_64-eng
7. full_fugu-userdebug
8. aosp_fugu-userdebug
9. mini_emulator_arm64-userdebug
10. m_e_arm-userdebug
11. m_e_mips-userdebug
12. m_e_mips64-eng
13. mini_emulator_x86-userdebug
14. mini_emulator_x86_64-userdebug
15. aosp_dragon-userdebug
16. aosp_dragon-eng
17. aosp_marlin-userdebug
18. aosp_sailfish-userdebug
19. aosp_flounder-userdebug
20. aosp_angler-userdebug
21. aosp_bullhead-userdebug
22. hikey-userdebug
23. aosp_shamu-userdebug
Which would you like? [aosp_arm-eng]
我的是Nexus 5,所以选择19就可以了。其他设备可以到这里查阅。
3,编译
make -j8
-jN,N这个数字可以跟你的CPU实际情况而定。
至于N写多少,引用下面一段话:
参与编译的线程并不是越多越好,通常是根据你机器cup的核心来确定:core*2,即当前cpu的核心的2倍.比如,我现在的笔记本是双核四线程的,因此根据公式,最快速的编译可以make -j8.
四、运行模拟器
在编译完成之后,就可以通过以下命令运行Android虚拟机了,命令如下:
source build/envsetup.sh
lunch(选择刚才你设置的目标版本,比如这里了我选择的是19)
emulator
如果你是在编译完后立刻运行虚拟机,由于我们之前已经执行过source及lunch命令了,因此现在你只需要执行命令就可以运行虚拟机:
emulator
补充一、Mac OX 配置JDK环境变量
在windows里面配置JDK环境变量很容易,但是如果要在Mac里面配置JDK环境变量和windows里面有所不同,具体如下:
1,Mac OS里面自带jdk,不过是1.7的版本(本人Mac OS 10.11.6 ),如需要1.8则可以去 oracle的官网下载最新的对应的jdk版本,网址如下:
http://www.oracle.com/technetwork/Java/javase/downloads/index-jsp-138363.html
下载完以后安装,此时我有个疑问,系统自带的jdk在什么地方?我下载的jdk又在什么地方呢?
mac系统自带的jdk的安装目录在如下目录:
/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home ;
在mac系统里面jdk的路径是要到Home这里的,所以我们在后面配置环境变量的时候一点要记住选择到home这个文件这里。
我们自己安装的jdk的目录一般在:
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home 下;
也就是到Library这个目录下面去找应该就可以找到。
找到路径以后就是如何配置环境变量的问题。
2,配置环境变量步骤如下:
需要修改两个文件
第一个文件 .bash_profile ,使用如下命令修改:
cd ~ //进入到 ~ 目录
touch .bash_profile //修改.bash_profile文件
vi .bash_profile //使用vi编辑器编辑 .bash_profile文件
i //,在vi编辑器里面输入 i 的意思是开始编辑。
vi编辑器里面的内容如下:
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
CLASSPAHT=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH:
export JAVA_HOME
export CLASSPATH
export PATH
添加如上所示的语句就可以了,第一行代表的是jdk的路径,一定要记住选择到 Home 这个文件加下面;
然后退出vi编辑器使用如下命令:
1. 输入 esc (退出编辑模式)
2. 输入冒号 : wq (保存并退出)或 :wq!(强制保存退出)
3. 保存退出
如果以上修改完毕切正确,那么接下来就是让配置的环境变量生效,使用如下命令:
source .bash_profile
或者可以直接重新启动机器,注销机器都可以。
完毕以后查看下当前的java 版本是否正确输入如下命令:
java -version
MacBook-Pro:~ xp$ java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
如果出现了上面所示的对应的自己的安装的版本那就说明没有问题了,或者使用如下命令查看环境变量是否已经配置成功:
echo $JAVA_HOME
如下所示:
MacBook-Pro:~ xp$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
显示已经配置成功,如果查看java的版本正确,但是查看是jdk环境变量配置失败,重新打开terminal 查看,前面打开的 终端 可能显示不正确,我的就是如此。
补充二、退出后再次编译笔记
MacBook-Pro:~ xp$ cd /volumes
MacBook-Pro:volumes xp$ cd android
-bash: cd: android: No such file or directory
MacBook-Pro:volumes xp$ ls
Macintosh HD MobileBackups
此时双击android.dmg.sparseimage,再执行以下命令:
MacBook-Pro:volumes xp$ ls
Macintosh HD MobileBackups untitled
MacBook-Pro:volumes xp$ cd untitled
MacBook-Pro:untitled xp$ ls
android
MacBook-Pro:untitled xp$ cd android
MacBook-Pro:android xp$ cd ..
MacBook-Pro:androidsrc xp$ ls
android
MacBook-Pro:androidsrc xp$ cd android
MacBook-Pro:android xp$ hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/androidsrc
/dev/disk2 GUID_partition_scheme
/dev/disk2s1 EFI
/dev/disk2s2 Apple_HFS /Volumes/androidsrc
MacBook-Pro:android xp$ make -j16
============================================
PLATFORM_VERSION_CODENAME=O
PLATFORM_VERSION=O
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=darwin
HOST_OS_EXTRA=Darwin-15.6.0-x86_64-i386-64bit
HOST_BUILD_TYPE=release
BUILD_ID=NYC
OUT_DIR=out
============================================
补充三、下载驱动
从这里下载对应的驱动文件到源码目录,下载完成后解压,会发现三个sh文件,依次执行,例如:
$ ./extract-broadcom-hammerhead.shThe license for this software will now be displayed.You must agree to this license before using this software.Press Enter to view the licensels
回车后查看license,翻到license最后,输入I ACCEPT后回车,这时会将驱动文件释放到vendor目录。依次将驱动搞定之后,按照前面的步骤再次编译。
补充四、刷机
又折腾了一遍之后,我们再次fastboot刷刷刷。
手机连上电脑的情况下
adb reboot bootloader
cd 到源码编译输出的目录
fastboot -w flashall
刷完收工,进入全新的Android吧。
编译源码遇到的问题:
执行lunch命令的时候,弹出Can not find SDK 10.6错误
build/core/combo/mac_version.mk:38: *****************************************************
build/core/combo/mac_version.mk:39: * Can not find SDK 10.6 at /Developer/SDKs/MacOSX10.6.sdk
build/core/combo/mac_version.mk:40: *****************************************************
build/core/combo/mac_version.mk:41: *** Stop.. Stop.
** Don't have a product spec for: 'aosp_hammerhead'
** Do you have the right repo manifest?
产生这个错误的原因是,在编译脚本中会检查当前的Xcode sdk的版本是否是兼容的,这可能是因为你mac上的xcode版本比较新,在Android源代码中还没有添加上.理论上说应该用Android代码对应的Xcode SDK版本来编译,不然可能会有兼容性的问题。
解决办法:
command+shift 进入:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
查看sdk版本号,本人为10.11.
输入:
vi build/core/combo/mac_version.mk
//找到mac_sdk_versions_supported
mac_sdk_versions_supported := 10.6 10.7 10.8
//将上面这行换成
mac_sdk_versions_supported := 10.11
//就是换一下支持的sdk版本号。
参考
http://www.cnblogs.com/iOS-mt/p/5726380.html
https://source.android.com/source/index.html
http://www.mobile-open.com/2016/974155.html
http://yajin167.info/2016/11/18/mac-toss-about-android-source.html
http://blog.csdn.net/u010232308/article/details/53978556
自己动手编译Android源码(超详细):
http://www.jianshu.com/p/367f0886e62b
网友评论