做SDK开发差不多一年了,想要进阶的话就得好好研究Android的源码了。在这里记录下我编译时的流程,供各位参考。
[TOC]
##环境搭建
我用的电脑系统是OSX 10.10.5。
需要准备的工具有:
- XCODE,用最新版吧
- MacPorts
- Java环境
jdk1.6下载
jdk1.7下载
jdk1.8下载
jdk1.8ForOSX这个是下载更新系统自带的Java版本,目录为/System/Library/Frameworks/JavaVM.framework
,终端输入java -version获取的就是这个Java的版本。自己安装的Java目录在/Library/Java/JavaVirtualMachines
。
这个目前推荐用1.6,具体看下文,用1.8的话容易出问题。
下面开始按步骤搭建环境。
###创建大小写敏感的磁盘映像
####1.生成镜像文件
方法一
打开终端,复制粘贴
|
|
这里的100g指的是分区大小,现在的android系统越来越大,现在Android7.1是20G,不过如果.repo也放进去的话,就要70G了,这里设置大一点。
如果提示需要权限,就输入sudo -s
,然后输入密码直接以root用户操作。
方法二
打开磁盘工具,文件,新建映像,如图所示。
之后在设定的位置处就能看见创建的磁盘了,双击磁盘映像,就可以在侧边栏看见磁盘。
如果后期需要修改映像大小,可使用:
|
|
命令。
####2.设置挂载和卸载命令(仅供参考,无效可手动输)
由于mac下很多重要文件都是隐藏的,所以建议大家首先把隐藏的文件显示出来,在终端里获取权限后输入以下命令。
|
|
打开用户/你的用户名文件夹,看下有没有“.bash_profile”这个文件,这个文件是OSX系统下的环境变量,如果没有,则新建一个。
- 打开终端,输入
cd
然后把用户/你的用户名文件夹拖到终端,输入touch .bash_profile
,创建文件。 open -e .bash_profile
编辑文件,编辑完后保存。source .bash_profile
,更新环境变量。
在.bash_profile文件中加入
|
|
|
|
在终端输入mountAndroid
和umountAndroid
看能否挂载和卸载安卓分区,如果不能,打开用户/你的用户名文件夹,找到android.dmg.sparseimage,制作替身,放到桌面,以后挂载只需要打开替身即可。
###安装make,git,GPG
|
|
- 打开用户/你的用户名文件夹下的“.bash_profile”文件,看是否有
export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
,没有就加上。修改完“.bash_profile”文件后需要在终端输入source .bash_profile
命令,是修改立即生效。 - 打开终端,输入如下命令
|
|
待其自动下载安装完成。如果提示gmake not found
,就输入sudo port -d sync
,如果提示port not found
,就检查环境变量是否设置成功。
###修改Mac默认的最大可同时打开文件数
打开用户/你的用户名文件夹下的“.bash_profile”文件,加入ulimit -S -n 1024
,这样编译时同时编译的文件数可以更多。
##源码下载
###1.建立本地仓库
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
一起复制粘贴到终端执行。
第一句在用户/你的用户名文件夹下建立了一个bin目录。
第二句将bin目录添加至环境变量,需要打开“.bash_profile”文件检查下有没有添加成功。
第三句安装repo工具。
第四句将repo的权限改为可执行。
###2.镜像下载
源码下载用国内的镜像会快很多。
- 用清华大学的镜像源(https://mirrors.tuna.tsinghua.edu.cn/),务必使用迅雷下载,地址:https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
- 将下载好的文件解压到刚才建立的bin目录中,解压后bin目录结构为”bin/aosp/.repo”。打开menifest目录,右键点击default.xml,制作替身,将替身拷贝到.repo目录,重命名为menifest.xml。
- 打开终端,输入
cd
,拖入aosp目录。执行命令:
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.0.1_r1
结尾是版本号,对照版本列表修改。
输入
repo sync -j1 -f --force-sync
,不是repo sync
,repo sync
会出现Exited sync due to fetch errors
错误。
常见问题:error.GitError: manifests rev-list (‘^c4e4db1a85b9bea00b9fe8c6a18f9d3357adab0c’, ‘HEAD’, ‘–’): fatal: Not a git repository (or any of the parent directories): .git
删除.repo/menifest文件夹下的.git文件夹,不行再删.repo下的menifest.git文件夹。
编辑 ~/bin/repo,把 REPO_URL 一行替换成:
REPO_URL = ‘https://mirrors.tuna.tsinghua.edu.cn/git/git-repo‘
- 更方便的方式(download.sh)123456789#!/bin/bashPATH=~/bin:$PATHrepo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.0.0_r14repo syncwhile [ $? = 1 ]; doecho "================sync failed, re-sync again ====="sleep 3repo sync -j1 -f --force-syncdone
##源码编译
###编译准备
将bin/aosp目录拷贝到android.dmg.sparsefile分区,可删除.repo目录。
注意
android源码编译的Java版本要和/Volumes/untitled/aosp/build/core中的main.mk中的设置Java版本的地方对应,如果mk文件中是1.6就要用1.6,是1.8就要用1.8。
123456789101112131415161718 # Check for the correct version of javajava_version := $(shell java -version 2>&1 | head -n 1 | grep '^java .*[ "]1\.6[\. "$$]')ifneq ($(shell java -version 2>&1 | grep -i openjdk),)java_version :=endififeq ($(strip $(java_version)),)$(info ************************************************************)$(info You are attempting to build with the incorrect version)$(info of java.)$(info $(space))$(info Your version is: $(shell java -version 2>&1 | head -n 1).)$(info The correct version is: Java SE 1.6.)$(info $(space))$(info Please follow the machine setup instructions at)$(info $(space)$(space)$(space)$(space)http://source.android.com/source/download.html)$(info ************************************************************)$(error stop)endif
jdk设置可以参考:
- 打开“.bash_profile”文件,
open ~/.bash_profile
。 - 设置jdk版本和别名,修改成自己的JDK目录名。
|
|
保存后执行source ~/.bash_profile
。
终端输入jdk6、jdk7、jdk8 即可切换jdk版本。
###开始编译
####1.环境准备
终端输入source build/envsetup.sh
####2.设置编译目标lunch full-eng
####3.开始编译make
或make -j4
或make -j16
做好使用make。编译完成后可看见aosp目录有out文件夹,aosp/out/host/darwin-x86/framework
文件夹中有一些jar包生成,使用make命令会生成,make -j16
不会。
常见问题
1.XCODE的SDK版本问题
|
|
打开Android分区的aosp目录,进入
aosp/external/qemu
,打开Makefile.android,找到并改成如下代码:
|
|
/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk
是我的XCODE应用程序包里的内容,根据自己的版本改即可。
2.内存溢出
|
|
修改Jack的配置文件prebuilts/sdk/tools/jack-admin
,将
|
|
修改为
|
|
然后在终端输入
|
|
重新编译时会重新启动jack server。
继续编译。
3.文件没找到
|
|
在目录external/iptables/extensions/../include/Linux/netfilter
中创建文件xt_DSCP.h
:
|
|
##导入Android Studio
###生成idegen.jar
接着上一步,终端中当前位置在Android分区上的aosp目录。
确认下aosp/out/host/darwin-x86/framework
文件夹中没有idegen.jar
,输入命令:mmm development/tools/idegen
,可看见文件夹中生成了这个jar包。
###生成android.ipr和android.iml文件
输入命令development/tools/idegen/idegen.sh
,执行完成可看到aosp目录生成了这两个文件。使用Android Studio打开android.ipr即可导入源码工程。
Android Studio查看源码的相关配置请看我的下一篇文章:Android Studio查看android源码。
最后,祝大家都编译成功,也可以加群( 301919302 )讨论Android技术哦。
转载请注明出处:http://write.blog.csdn.net/mdeditor#!postId=52212584。