Ubuntu 14.04 Android源码编译介绍

版权声明:本文为作者原创,转载必须注明出处。
转载请注明出处:https://www.jianshu.com/p/5576c2759a1c

build for android

这篇文章主要介绍如何在Ubuntu 14.04版本上下载和编译Android源码。
以下步骤都是作者亲自实践,废话不多说,我们开始吧!

一、准备

安装编译Android source code的相关包以及JDK

  1. 安裝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 (安装完后可以执行此命令确认是否安装成功以及版本正确)
    
  2. 安装相关包 (以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
    
  3. 未来若需要切换JDK, 可以用以下方法

    $ sudo update-alternatives --config java
    $ sudo update-alternatives --config javac
    

    其他版本的JDK安装请参考
    http://source.android.com/source/initializing.html

  4. 抓source code 源码

  • 设置repo, 由Google发明的一個管理多個git的脚本 https://source.android.com/source/using-repo.html
    1.准备repo环境变量和环境目录
    $ mkdir ~/bin
    $ PATH=~/bin:$PATH
    
    1. 下载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底下)
    
    1. 修改执行权限
    $ chmod a+x ~/bin/repo
    
  • 抓Code
    1. 运行 repo init 以获取最新版本的 Repo 及其最近的所有错误更正内容。您必须为清单指定一个网址,该网址用于指定 Android 源代码中包含的各个代码库将位于工作目录中的什么位置。
      repo init -u https://android.googlesource.com/platform/manifest
      
      要检出“master”以外的分支,请使用 -b 指定相应分支。要查看分支列表,请参阅源代码标记和编译版本
      repo init -u https://android.googlesource.com/platform/manifest -b android-  4.0.1_r1
      
      初始化成功后,系统将显示一条消息,告诉您 Repo 已在工作目录中完成初始化。客户端目录中现在应包含一个 .repo 目录,清单等文件将保存在该目录下。
    2. 同步source code, 大约3小时, 这步非常久建议去吃个饭
      $ repo sync -j4
      
      (我本人没遇到问题, 教学文件有说可能会遇到"exited sync due to fetch errors"错误, 可以加上"-f", 其余的只能Google或是问人)

二、正式编译源码

  1. 添加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.
    
  2. 根据手机型号设定环境变量 (***此步骤在每次打开新的Terminal时, 都必须执行)
    $ lunch <product name>
    or
    $ lunch (会出现一个数字选单来选择)
    有分eng版(debug版本), user版(release版本), userdebug(能够root的release版本)
    也可以用 $ print_lunch_menu 指令看一下该repo底下有哪些product可以build
    
  3. 废话不多说, 一言不合就编译, 全新build很慢, 大约要1.5小时
    $ 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多出来的编译命令导致的错误。
    
    但如果很不幸的遇到build break, 你会发现log洗满了整个屏幕, 你也找不到错误讯息. 所以你该做的是把log存下来, 如此才能分析问题。
    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同时输出到屏幕以及档案)
    

三、总结:

如果一切顺利,相信通过上面的操作你已经完成了源码的编译。看起来是不是很简单。如果没有成功的同学,也不要沮丧。大多数的原因,应该是你的系统中缺少相关的依赖库导致的。当然特定问题特定分析,下面我会列出一些之前其他同学遇到过的问题,来帮助大家来检查。

  1. 在安装编译Android source code的相关包以及JDK环节:
    如果出现【无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系】,详情解法可参见这篇文章:
    http://www.cnblogs.com/LeoGodfrey/p/3316834.html
  2. 如果出现 “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
  3. 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

相关参考文章:

  1. https://source.android.com/setup/build/downloading.html(Android官方下载源码介绍)
  2. http://gityuan.com/2016/03/19/android-build/ (这篇讲解Android编译系统, 讲得非常清楚)
  3. http://elinux.org/Android_Build_System (英文版的也不错, 可以对照看看)
  4. http://source.android.com/source/requirements.html (Android官方下载源码系统环境介绍)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容