版权声明:本文为作者原创,转载必须注明出处。
转载请注明出处:https://www.jianshu.com/p/5576c2759a1c
这篇文章主要介绍如何在Ubuntu 14.04版本上下载和编译Android源码。
以下步骤都是作者亲自实践,废话不多说,我们开始吧!
一、准备
安装编译Android source code的相关包以及JDK
-
安裝JDK, 要注意的是不同Android版本是需要不同的JDK版本, Android K之前的是JDK 1.6, L, M是JDK 1.7, N以上是JDK 1.8
$ sudo apt-get update $ sudo apt-get install openjdk-8-jdk $ java -version (安装完后可以执行此命令确认是否安装成功以及版本正确)
-
安装相关包 (以Ubuntu 14.04版本为例)
$ 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 ccache \ libgl1-mesa-dev libxml2-utils xsltproc unzip
-
未来若需要切换JDK, 可以用以下方法
$ sudo update-alternatives --config java $ sudo update-alternatives --config javac
其他版本的JDK安装请参考
http://source.android.com/source/initializing.html 抓source code 源码
- 设置repo, 由Google发明的一個管理多個git的脚本 https://source.android.com/source/using-repo.html
1.准备repo环境变量和环境目录$ mkdir ~/bin $ PATH=~/bin:$PATH
- 下载repo
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo (需要翻墙) or 链接: [https://pan.baidu.com/s/1bpLwXCb](https://pan.baidu.com/s/1bpLwXCb) 密码: hjsp (下载放到~/bin底下)
- 修改执行权限
$ chmod a+x ~/bin/repo
- 抓Code
- 运行 repo init 以获取最新版本的 Repo 及其最近的所有错误更正内容。您必须为清单指定一个网址,该网址用于指定 Android 源代码中包含的各个代码库将位于工作目录中的什么位置。
要检出“master”以外的分支,请使用repo init -u https://android.googlesource.com/platform/manifest
-b
指定相应分支。要查看分支列表,请参阅源代码标记和编译版本。
初始化成功后,系统将显示一条消息,告诉您 Repo 已在工作目录中完成初始化。客户端目录中现在应包含一个 .repo 目录,清单等文件将保存在该目录下。repo init -u https://android.googlesource.com/platform/manifest -b android- 4.0.1_r1
- 同步source code, 大约3小时, 这步非常久建议去吃个饭
(我本人没遇到问题, 教学文件有说可能会遇到"exited sync due to fetch errors"错误, 可以加上"-f", 其余的只能Google或是问人)$ repo sync -j4
- 运行 repo init 以获取最新版本的 Repo 及其最近的所有错误更正内容。您必须为清单指定一个网址,该网址用于指定 Android 源代码中包含的各个代码库将位于工作目录中的什么位置。
二、正式编译源码
- 添加Android编译functions到当前环境, ex: lunch, mm, (***此步骤在每次打开新的Terminal时, 都必须执行)
$ source ./build/envsetup.sh 以下是对这个指令的基本功能介绍, 更多介绍可以参考 http://gityuan.com/2016/03/19/android-build/ (很实用) Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment: - lunch: lunch <product_name>-<build_variant> - tapas: tapas [<App1> <App2> ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user] - croot: Changes directory to the top of the tree. - m: Makes from the top of the tree. - mm: Builds all of the modules in the current directory, but not their dependencies. - mmm: Builds all of the modules in the supplied directories, but not their dependencies. To limit the modules being built use the syntax: mmm dir/:target1,target2. - mma: Builds all of the modules in the current directory, and their dependencies. - mmma: Builds all of the modules in the supplied directories, and their dependencies. - cgrep: Greps on all local C/C++ files. - ggrep: Greps on all local Gradle files. - jgrep: Greps on all local Java files. - resgrep: Greps on all local res/*.xml files. - mangrep: Greps on all local AndroidManifest.xml files. - mgrep: Greps on all local Makefiles files. - sepgrep: Greps on all local sepolicy files. - sgrep: Greps on all local source files. - godir: Go to the directory containing a file.
- 根据手机型号设定环境变量 (***此步骤在每次打开新的Terminal时, 都必须执行)
$ lunch <product name> or $ lunch (会出现一个数字选单来选择) 有分eng版(debug版本), user版(release版本), userdebug(能够root的release版本) 也可以用 $ print_lunch_menu 指令看一下该repo底下有哪些product可以build
- 废话不多说, 一言不合就编译, 全新build很慢, 大约要1.5小时
但如果很不幸的遇到build break, 你会发现log洗满了整个屏幕, 你也找不到错误讯息. 所以你该做的是把log存下来, 如此才能分析问题。$ make -j4 target-files-package (数字4代表多线程数量一般来说建议是CPU核心数x2, 我有用过-j16但是并没有快多少) 关于target-files-package参数说明 make target-files-package 比make精简了一些操作,可以更快速打包。有时发现直接make -j4会报错, 但是make -j4 target-files-package 不会报错,原因可能就是因为make多出来的编译命令导致的错误。
make -j4 target-files-package 1>out.txt 2>err.txt & tail -F out.txt (红色的部份表示把stdout 存到out.txt, stderr存到err.txt, 最后用tail 去follow out.txt, 才能在屏幕上看到编译状况) 又或者你可以用tee make -j4 2>&1 | tee out.txt (粉色的部份表示把stderr也导向stdout, 最后用tee同时输出到屏幕以及档案)
三、总结:
如果一切顺利,相信通过上面的操作你已经完成了源码的编译。看起来是不是很简单。如果没有成功的同学,也不要沮丧。大多数的原因,应该是你的系统中缺少相关的依赖库导致的。当然特定问题特定分析,下面我会列出一些之前其他同学遇到过的问题,来帮助大家来检查。
- 在安装编译Android source code的相关包以及JDK环节:
如果出现【无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系】,详情解法可参见这篇文章:
http://www.cnblogs.com/LeoGodfrey/p/3316834.html - 如果出现 “Try increasing heap size with java option '-Xmx<size>'” 这种error
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g" // 调大heap size
./prebuilts/sdk/tools/jack-admin kill-server // 重启jack-admin
./prebuilts/sdk/tools/jack-admin start-server
参考文章:
http://stackoverflow.com/questions/35579646/android-source-code-compile-error-try-increasing-heap-size-with-java-option - error: subcommand无法执行或者执行失败 或者 /bin/bash: xmllint: 未找到命令
原因:缺少特定的库
解决方法:把能下的库都下完,一般差不多就能过了。
差不多有如下这些库会用到
sudo apt install git-core bison build-essential curl flex git gnupg gperf libesd0-dev liblz4-tool libncurses5-dev libsdl-dev
libwxgtk3.0-dev libxml2 libxml2-utils lzop maven openjdk-7-jdk pngcrush schedtool squashfs-tools xsltproc zip g++-multilib
gcc-multilib lib32ncurses5-dev lib32readline6-dev libc6-dev-i386 x11proto-core-dev libx11-dev ccache libgl1-mesa-dev unzip
python-imaging lib32z1-dev
相关参考文章:
- https://source.android.com/setup/build/downloading.html(Android官方下载源码介绍)
- http://gityuan.com/2016/03/19/android-build/ (这篇讲解Android编译系统, 讲得非常清楚)
- http://elinux.org/Android_Build_System (英文版的也不错, 可以对照看看)
- http://source.android.com/source/requirements.html (Android官方下载源码系统环境介绍)