• 自己碰到问题的解决方案,希望能给大家带来帮助

         现在编译源码已经成了家常便饭了,基本上定期对公司每个项目的主线代码进行同步,然后晚上下班前开启编译,防止有的问题单别人已经修改了,自己还在这花时间修改,但是这两天真是奇怪,同一套编译环境,amber、s2、x10其他几个项目都是好好的,唯独x3项目每次编译都不通过,报的错误基本都一样:GC overhead limit exceeded
    Try increasing heap size with java option '-Xmx<size>'

         具体的日志内容如下:

    Warning: AndroidManifest.xml already defines versionCode (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    Warning: AndroidManifest.xml already defines versionName (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    Warning: AndroidManifest.xml already defines minSdkVersion (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    target Package: LetvTeleExtra (out/target/product/x500/obj/APPS/LetvTeleExtra_intermediates/package.apk)
    Building with Jack: out/target/common/obj/APPS/LetvUserManual_intermediates/with-local/classes.dex
    GC overhead limit exceeded
    Try increasing heap size with java option '-Xmx<size>'
    Warning: This may have produced partial or corrupted output.
    make: *** [out/target/common/obj/APPS/LetvNote_intermediates/with-local/classes.dex] Error 41
    make: *** Waiting for unfinished jobs....
    GC overhead limit exceeded
    Try increasing heap size with java option '-Xmx<size>'
    Warning: This may have produced partial or corrupted output.
    make: *** [out/target/common/obj/APPS/LetvUserManual_intermediates/with-local/classes.dex] Error 41
    GC overhead limit exceeded
    Try increasing heap size with java option '-Xmx<size>'
    Warning: This may have produced partial or corrupted output.
    make: *** [out/target/common/obj/APPS/Music_intermediates/with-local/classes.dex] Error 41


    #### make failed to build some targets (03:14:18 (hh:mm:ss)) ####

         

         从日志上理解,就是虚拟机内存不足了,然后各种google、百度,找到的比较符合的答案就两个,

         GC overhead limit exceeded when building android source

         Android source code compile error: “Try increasing heap size with java option '-Xmx'”

         然而对照自己的编译环境看了下,和这个的jack配置不一样,真是头大了,对编译环境自己又不懂,不过在x3m/prebuilts/sdk/tools目录下还是找到了传说中的jack-admin文件,路径如下图:


         但是在里边没有找到任何环境变量配置相关的选项,好吧,继续找,又找到x3m/build/core/config.mk文件,这个看着好像还比较靠谱,应该是管理配置相关的,打开之后,找到了java -Xmx3500m的配置项,哇,如获至宝!!


         这里说一下哈,它最原始的配置是3500,是我自己手动改为5500的。改完之后,再重新make一下,结果不对,还是一样报错,真是郁闷。源码编译不过,bug没办法处理,工作都停下了,不行,一定要解决这个问题才能继续。

         第二天来,在大群里一发,真是各种热心啊,好几个同事联系我,给予解决方案。当然,自己对这个问题产生的根本原因和最好的解决方案还没有完全搞清,但是问题解决了,所以把几种可能方案都列出来,方便大家遇到时能够得到一些帮助,要知道,发现问题但是手足无措时那种感觉真是难受。

         1:有的同事推荐将出错的模块单独编译一下,比如我当前的编译出错的是Note、UserManual、Music三个模块,就把它们单独编译一下,然后再make整体编译

         2:vim ~/.jack,然后将SERVER_NB_COMPILE=1 改为1,注意它的默认值为4

        SERVER_NB_COMPILE是控制多任务并行的控制编译器行为,经常会引起这个错误。SERVER_NB_COMPILE=4 Maximum number of parallel compilations allowed.  这个内存不足默认配置4,容易报这个问题。我这里的问题就是采用这种方案处理OK了。

         还需要多说一下,中途如果编译出错,千万不要make clean,而是修改配置后,继续make,这样就会继续之前的工作,如果你make clean后,那就相当于重新开始了,那就又要花大概三个小时了。

         大家如果想学习一下android的编译系统原理的话,可以去看看老罗的博客。老的博客每篇都是精品,讲的非常细致:

         Android编译系统简要介绍和学习计划

         Android编译系统环境初始化过程分析

         Android源代码编译命令m/mm/mmm/make分析

         Android系统镜像文件的打包过程分析

         从CM刷机过程和原理分析Android系统结构

         展示一下我的结果,哇哈哈哈哈,又可以开始干活了!!!

    展开全文
  • 自己动手编译Android源码(超详细) 涅槃1992 2016.06.20 02:12* 字数 43...

    自己动手编译Android源码(超详细)

    2016.06.20 02:12* 字数 4330 阅读 86819评论 89赞赏 7

    Android Studio代码调试一文中,简单的介绍了代码调试的一些技巧.现在我们来谈谈android源码编译的一些事.(俺认为,作为android developer人人都应该有一份自己Android源码,这样我们就可以随时对自己有疑惑的地方通过亲手调试来加强理解).

    本文使用最新的Ubuntu 16.04,请首先确保自己已经安装了Git.没安装的同学可以通过以下命令进行安装:

    sudo apt-get install git 
    git configglobal user.emailtest@test.com” 
    git config –global user.name “test”
    

    其中test@test.com为你自己的邮箱.

    简要说明

    android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4运行.下文也将按照该流程讲述.


    源码下载

    由于某墙的原因,这里我们采用国内的镜像源进行下载.
    目前,可用的镜像源一般是科大和清华的,具体使用差不多,这里我选择清华大学镜像进行说明.(参考:科大源,清华源)

    repo工具下载及安装

    通过执行以下命令实现repo工具的下载和安装

    mkdir ~/bin
    PATH=~/bin:$PATH
    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    chmod a+x ~/bin/repo
    

    补充说明
    这里,我来简单的介绍下repo工具,我们知道AOSP项目由不同的子项目组成,为了方便进行管理,Google采用Git对AOSP项目进行多仓库管理.在聊repo工具之前,我先带你来聊聊多仓库项目:

    我们有个非常庞大的项目Pre,该项目由很多个子项目R1,R2,...Rn等组成,为了方便管理和协同开发,我们为每个子项目创立自己的仓库,整个项目的结构如下:


    这里写图片描述

    将一个项目Pre进行分库后会遇到这么一个问题:如果我们想要创建Pre分支来做feature开发,这就意味着,我们需要到每个子项目中分别创建对应的分支,这个过程如果纯粹靠手工做,那简直是个灾难,利索当然我们会想写个自动化处理程序(我们假设这个工具叫做RepoUtil)来帮助我们解决这个问题.这个RepoUtil也会有版本管理之类的需求,因此我们也用Git对其管理,并为其创建对应的仓库.此时整个项目的结构如下:


    这里写图片描述

    这里RepoUtil知道整个项目Pre下的每个子项目(即维护子项目的列表),同时需要提供对这些子项目的管理功能,比如统一创建分支等.但是从"单一职责"角度来看,RepoUitl这个工具的功能过于复杂,我们完全可以将维护子项目列表这个功能抽取出来作为一个新项目sub_projects,因为子项目也会变化,因此,为其创建对应的仓库,并用Git管理,这样的化,RepoUtil只需要通过简单的对ub_projects进行依赖即可,此时整个项目的结构如下:


    这里写图片描述

    AOSP项目结构和我上文的描述非常类似.repo工具对应RepoUtil,mainfest对应sub_projects.
    总结一下:repo就是这么一种工具,由一系列python脚本组成,通过调用Git命令实现对AOSP项目的管理.

    建立源码文件夹

    熟悉Git的同学都应该知道,我们需要为项目在本地创建对应的仓库.同样,这里为了方便对代码进行管理,我们为其创建一个文件夹.这里我在当前用户目录下创建了source文件夹,后面所有的下载的源码和编译出的产物也都放在这里,命令如下:

    mkdir source
    cd source
    

    初始化仓库

    我们将上面的source文件夹作为仓库,现在需要来初始化这个仓库了.通过执行初始化仓库命令可以获取AOSP项目master上最新的代码并初始化该仓库,命令如下:

    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
    
    

    或者使用:

    repo init -u git://aosp.tuna.tsinghua.edu.cn/aosp/platform/manifest
    

    两者实现的效果一致,仅仅只是协议不同.
    如果执行该命令的过程中,如果提示无法连接到 gerrit.googlesource.com,那么我们只需要编辑 ~/bin/repo文件,找到REPO_URL这一行,然后将其内容修改为:

    REPO_URL = 'https://gerrit-google.tuna.tsinghua.edu.cn/git-repo'
    

    然后重新执行上述命令即可.

    补充说明
    不带参数的manifest命令用于获取master上最新的代码,但是可以通过-b参数指定获取某个特定的android版本,比如我们想要获取android-4.0.1_r1分支,那么命令如下:

    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.0.1_r1
    

    (AOSP项目当前所有的分支列表参看:分支列表)

    同步源码到本地

    初始化仓库之后,就可以开始正式同步代码到本地了,命令如下:

    repo sync
    

    以后如果需要同步最新的远程代码到本地,也只需要执行该命令即可.在同步过程中,如果因为网络原因中断,使用该命令继续同步即可.不出意外,5个小时便可以将全部源码同步到本地.所以呢,这个过程可以放在晚上睡觉期间完成.

    (提示:一定要确定代码完全同步了,不然在下面编译过程出现的错误会让你痛不欲生,不确定的童鞋可以多用repo sync同步几次)


    构建编译环境

    源码下载完成后,就可以构建编译环境了.在开始之前,我们先来看看一些编译要求:

    1. 硬件要求:
    64位的操作系统只能编译2.3.x以上的版本,如果你想要编译2.3.x以下的,那么需要32位的操作系统.
    磁盘空间越多越好,至少在100GB以上.意思就是,你可以去买个大点的硬盘了啊
    如果你想要在是在虚拟机运行linux,那么至少需要16GB的RAM/swap.
    (实际上,我非常不推荐在虚拟机中编译2.3.x以上的代码.)

    2. 软件要求:
    1. 操作系统要求
    AOSP开源中,主分支使用Ubuntu长期版本开发和测试的,因此也建议你使用Ubuntu进行编译,下面我们列出不同版本的的Ubuntu能够编译那些android版本:

    Android版本编译要求的Ubuntu最低版本
    Android 6.0至AOSP masterUbuntu 14.04
    Android 2.3.x至Android 5.xUbuntu 12.04
    Android 1.5至Android 2.2.xUbuntu 10.04

    2. JDK版本要求
    除了操作系统版本这个问题外,我们还需要关注JDK版本问题,为了方便,同样我们也列出的不同Android版本的源码需要用到的JDK版本:

    Android版本编译要求的JDK版本
    AOSP的Android主线OpenJDK 8
    Android 5.x至android 6.0OpenJDK 7
    Android 2.3.x至Android 4.4.xOracle JDK 6
    Android 1.5至Android 2.2.xOracle JDK 5

    更具体的可以参看:Google源码编译要求

    我现在在Ubuntu 16.04下编译AOSP主线代码,因此需要安装OpenJDK 8,执行命令如下:
    sudo apt-get install openjdk-8-jdk
    如果你需要在Ubuntu 14.04下编译AOSP主线代码,同样需要安装OpenJDK 8,此时需要执行如下命令:

    sudo apt-get update
    sudo apt-get install openjdk-8-jdk
    

    如果你要编译的是Android 5.x到android 6.0之间的系统版本,需要采用openjdk7.但是在Ubuntu 15.04及之后的版本的在线安装库中只支持openjdk8和openjdk9的安装.因此,如果你想要安装openjdk 7需要首先设置ppa:

    sudo add-apt-repository ppa:openjdk-r/ppa 
    sudo apt-get update
    

    然后再执行安装命令:

    sudo apt-get install openjdk-7-jdk 
    

    有时候,我们需要编译不同版本的android系统,就可能使用不同的jdk版本.关于jdk版本切换,可以使用如下命令:

    sudo update-alternative --config java
    sudo update-alternative --config javac
    

    3. 其他要求

    Google官方构建编译环境指南中已经说明了Ubuntu14.04,Ubuntu 12.04,Ubuntu 10.04需要添加的依赖,这里我们就不做介绍了.我原先以为,Ubuntu16.04的设置和Ubuntu14.04的依赖设置应该差不多,但是只能说too young too simple.
    下面是Ubuntu16.04中的依赖设置:

    sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
    sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
    sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
    sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
    sudo apt-get install git-core gnupg flex bison gperf build-essential  
    sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 
    sudo apt-get install libc6-dev-i386 
    sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
    sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
    sudo apt-get install lib32z-dev ccache
    

    (其中几个命令中参数是重复的,但不妨碍我们)

    初始化编译环境

    确保上述过程完成后,接下来我们需要初始化编译环境,命令如下:

    source build/envsetup.sh
    

    执行该命令结果如下:


    这里写图片描述

    不难发现该命令只是引入了其他执行脚本,至于这些脚本做什么,目前不在本文中细说.
    该命令执行成功后,我们会得到了一些有用的命令,比如最下面要用到的lunch命令.


    编译源码

    初始化编译环境之后,就进入源码编译阶段.这个阶段又包括两个阶段:选择编译目标和执行编译.

    选择编译目标

    通过lunch指令设置编译目标,所谓的编译目标就是生成的镜像要运行在什么样的设备上.这里我们设置的编译目标是aosp_arm64-eng,因此执行指令:

    lunch aosp_arm64-eng
    

    编译目标格式说明
    编译目标的格式:BUILD-BUILDTYPE,比如上面的aosp_arm-eng的BUILD是aosp_arm,BUILDTYPE是eng.

    什么是BUILD

    BUILD指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境.其中,aosp(Android Open Source Project)代表Android开源项目;arm表示系统是运行在arm架构的处理器上,arm64则是指64位arm架构;处理器,x86则表示x86架构的处理器;此外,还有一些单词代表了特定的Nexus设备,下面是常用的设备代码和编译目标,更多参考官方文档
    |受型号|设备代码|编译目标|
    |---|----|---|
    |Nexus 6P|angler|aosp_angler-userdebug|
    |Nexus 5X|bullhead|aosp_bullhead-userdebug|
    |Nexus 6|shamu|aosp_shamu-userdebug|
    |Nexus 5|hammerhead|aosp_hammerhead-userdebug|

    提示:如果你没有Nexus设备,那么通常选择arm或者x86即可

    什么是BUILDTYPE

    BUILD TYPE则指的是编译类型,通常有三种:
    -user:代表这是编译出的系统镜像是可以用来正式发布到市场的版本,其权限是被限制的(如,没有root权限,不鞥年dedug等)
    -userdebug:在user版本的基础上开放了root权限和debug权限.
    -eng:代表engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),此外还附带了许多debug工具

    了解编译目标的组成之后,我们就可以根据自己目前的情况选择了.那不知道编译目标怎么办?
    我们只需要执行不带参数的lunch指令,稍后,控制台会列出所有的编译目标,如下:


    这里写图片描述

    接着我们只需要输入相应的数字即可.

    来举个例子:你没有Nexus设备,只想编译完后运行看看,那么就可以选择aosp_arm-eng.
    (我在ubuntu 16.04(64位)中编译完成后启动虚拟机时,卡在黑屏,尝试编译aosp_arm64-eng解决.因此,这里我使用了aosp_arm64-eng)

    开始编译

    通过make指令进行代码编译,该指令通过-j参数来设置参与编译的线程数量,以提高编译速度.比如这里我们设置8个线程同时编译:

    make -j8
    

    需要注意的是,参与编译的线程并不是越多越好,通常是根据你机器cup的核心来确定:core*2,即当前cpu的核心的2倍.比如,我现在的笔记本是双核四线程的,因此根据公式,最快速的编译可以make -j8.
    (通过cat /proc/cpuinfo查看相关cpu信息)

    如果一切顺利的化,在几个小时之后,便可以编译完成.看到### make completed successfully (01:18:45(hh:mm:ss)) ###表示你编译成功了.


    运行模拟器

    在编译完成之后,就可以通过以下命令运行Android虚拟机了,命令如下:

    source build/envsetup.sh
    lunch(选择刚才你设置的目标版本,比如这里了我选择的是2)
    emulator
    

    如果你是在编译完后立刻运行虚拟机,由于我们之前已经执行过source及lunch命令了,因此现在你只需要执行命令就可以运行虚拟机:

    emulator
    

    不出意外,在等待一会之后,你会看到运行界面:


    这里写图片描述

    补充
    既然谈到了模拟器运行,这里我们顺便介绍模拟器运行所需要四个文件:

    1. Linux Kernel
    1. system.img
    2. userdate.img
    3. ramdisk.img

    如果你在使用lunch命令时选择的是aosp_arm-eng,那么在执行不带参数的emualtor命令时,Linux Kernel默认使用的是/source/prebuilds/qemu-kernel/arm/kernel-qemu目录下的kernel-qemu文件;而android镜像文件则是默认使用source/out/target/product/generic目录下的system.img,userdata.img和ramdisk.img,也就是我们刚刚编译出来的镜像文件.

    上面我在使用lunch命令时选择的是aosp_arm64-eng,因此linux默认使用的/source/prebuilds/qemu-kernel/arm64/kernel-qemu下的kernel-qemu,而其他文件则是使用的source/out/target/product/generic64目录下的system.img,userdata.img和ramdisk.img.
    当然,emulator指令允许你通过参数制定使用不同的文件,具体用法可以通过emulator --help查看


    模块编译

    除了通过make命令编译可以整个android源码外,Google也为我们提供了相应的命令来支持单独模块的编译.

    编译环境初始化(即执行source build/envsetup.sh)之后,我们可以得到一些有用的指令,除了上边用到的lunch,还有以下:

      - 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.
      - mmm: Builds all of the modules in the supplied directories.
      - cgrep: Greps on all local C/C++ files.
      - jgrep: Greps on all local Java files.
      - resgrep: Greps on all local res/*.xml files.
      - godir: Go to the directory containing a file.
    

    其中mmm指令就是用来编译指定目录.通常来说,每个目录只包含一个模块.比如这里我们要编译Launcher2模块,执行指令:

    mmm packages/apps/Launcher2/
    

    稍等一会之后,如果提示:
    ### make completed success fully ###
    即表示编译完成,此时在out/target/product/gereric/system/app就可以看到编译的Launcher2.apk文件了.

    重新打包系统镜像
    编译好指定模块后,如果我们想要将该模块对应的apk集成到系统镜像中,需要借助make snod指令重新打包系统镜像,这样我们新生成的system.img中就包含了刚才编译的Launcher2模块了.重启模拟器之后生效.

    单独安装模块
    我们在不断的修改某些模块,总不能每次编译完成后都要重新打包system.img,然后重启手机吧?有没有什么简单的方法呢?
    在编译完后,借助adb install命令直接将生成的apk文件安装到设备上即可,相比使用make snod,会节省很多事件.

    补充
    我们简单的来介绍out/target/product/generic/system目录下的常用目录:
    Android系统自带的apk文件都在out/target/product/generic/system/apk目录下;
    一些可执行文件(比如C编译的执行),放在out/target/product/generic/system/bin目录下;
    动态链接库放在out/target/product/generic/system/lib目录下;
    硬件抽象层文件都放在out/targer/product/generic/system/lib/hw目录下.


    SDK编译

    如果你需要自己编译SDK使用,很简单,只需要执行命令make sdk即可.


    错误集合

    在编译过程中,遇到的大部分错误都可以在google搜到解决方案.这里只列举几个常见的错误:
    错误一: You are attemping to build with the incorrect version.具体错误如下:

    这里写图片描述

    如果你认真看了构建环境的的要求,那么这个错误是可以避免的.当然,这个问题也很容易解决:安装openjdk 8,别忘了使用sudo update-alternative命令切换jdk版本.

    错误二: Out of memory error.具体错误如下:

    这里写图片描述

    这个错误比较常见,尤其是在编译AOSP主线代码时,常常会因为JVM heap size太小而导致该错误.
    此时有两种解决方法:
    方法一:
    在编译命令之前,修改prebuilts/sdk/tools/jack-admin文件,找到文件中的这一行:
    JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
    然后在该行添加-Xmx4096m,如:
    JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"
    然后再执行time make -8j

    方法二:
    在控制台执行以下命令:

    export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
    out/host/linux-x86/bin/jack-admin kill-server
    out/host/linux-x86/bin/jack-admin start-server
    

    如图:


    这里写图片描述

    执行完该命令后,再使用make命令继续编译.某些情况下,当你执行jack-admin kill-server时可能提示你命令不存在,此时去你去out/host/linux-x86/bin/目录下会发现不存在jack-admin文件.如果我是你,我就会重新repo sync下,然后从头来过.

    错误三:使用emulator时,虚拟机停在黑屏界面,点击无任何响应.此时,可能是kerner内核问题,解决方法如下:
    执行如下命令:

    ./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7 
    
    

    通过使用kernel-qemu-armv7内核 解决模拟器等待黑屏问题.而-partition-size 1024 则是解决警告: system partion siez adjusted to match image file (163 MB >66 MB)

    如果你一开始编译的版本是aosp_arm-eng,使用上述命令仍然不能解决等待黑屏问题时,不妨编译aosp_arm64-eng试试.


    结束吧

    到现在为止,你已经了解了整个android编译的流程.除此之外,我也简单的说明android源码的多仓库管理机制.下面,不妨自己动手尝试一下.

    展开全文
  • 本文说明如何在Ubuntu 16.04(64位)上编译Android最新主线代码,介绍如何下载代码、建立编译环境、编译代码。  实验编译的是2016-05-18的AOSP主线代码。 1、关于编译Android 参考:  ...

    本文说明如何在Ubuntu 16.04(64位)上编译Android最新主线代码,介绍如何下载代码、建立编译环境、编译代码。 
    实验编译的是2016-05-18的AOSP主线代码。

    1、关于编译Android

    参考: 
    https://source.android.com/source/requirements.html

    Android官网说明了编译Android的要求,下面是一些要点。

    Android版本 编译要求的Ubuntu最低版本
    Android 6.0 - AOSP master Ubuntu 14.04
    Android 2.3.x - Android 5.x Ubuntu 12.04
    Android 1.5 - Android 2.2.x Ubuntu 10.04
       
    Android版本 编译要求的JDK版本
    AOSP中的Android主线 Ubuntu - OpenJDK 8
    Android 5.x - Android 6.0 Ubuntu - OpenJDK 7
    Android 2.3.x - Android 4.4.x Ubuntu - Java JDK 6
    Android 1.5 - Android 2.2.x Ubuntu - Java JDK 5


    官网推荐使用Ubuntu 14.04(64位)编译Android源代码,没有限制Linux内核版本,也就是说,Ubuntu 14.04可以使用任何支持的内核版本。

    官网说明了Ubuntu 14.04/12.04/10.04上如何建立编译环境和编译代码。

    下面说明Ubuntu 16.04(64位)上如何编译AOSP主线代码。 
    Ubuntu 16.04(64位)上目前只能在线安装 OpenJDK 8 和 OpenJDK 9。

    2、下载Android主线源代码

    参考: 
    https://lug.ustc.edu.cn/wiki/mirrors/help/aosp 
    https://source.android.com/source/downloading.html

    从Android官网下载源代码很慢,因此使用国内镜像进行下载,方法如下。

    (1)安装Git并设置 
    sudo apt-get install git 
    git config –global user.email “test@test.com” 
    git config –global user.name “test”

    (2)修改 ~/bin/repo 
    REPO_URL = ‘https://gerrit-googlesource.lug.ustc.edu.cn/git-repo

    (3)初始化仓库 
    repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest

    (4)下载 
    repo sync

    2016-05-18的AOSP主线代码:源代码33G,压缩为tar.gz后24G。

    3、设置编译环境

    参考: 
    https://source.android.com/source/initializing.html#installing-required-packages-ubuntu-1404

    sudo apt-get update

    sudo apt-get install openjdk-8-jdk

    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 m4

    4、编译Android

    参考: 
    https://source.android.com/source/building.html

    (1)编译

    请先看下面的(2),增加 -Xmx4096M,然后执行下面的编译命令,否则会有编译错误。我试过 -Xmx2048m,仍有(2)中的错误。

    source build/envsetup.sh 
    lunch (选择1) 
    time make -j4 // 说明:根据实际CPU情况设置启动的job个数,参考链接原文中的说明。

    make clean 用于清除之前编译的可执行文件及配置文件,清除之后需要重新使用上面三个命令进行编译。

      计算机A 计算机B
    CPU Interl Core i5-4440 3.10GHz * 4 Intel Pentium G2030 3.00GHz * 2
    内存 8G 8G
    硬盘 976G 488G
    编译命令 make -j4 make -j4
    编译时间 85分钟 195分钟


    (2)编译错误解决方法

    如果出现编译错误: 
    GC overhead limit exceeded 
    Try increasing heap size with Java option ‘-Xmx’

    解决方法:http://blog.csdn.net/brightming/article/details/49763515

    修改 prebuilts/sdk/tools/jack-admin 
    在下面这行中,增加 -Xmx4096m

    <code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">JACK_SERVER_COMMAND=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"java -Djava.io.tmpdir=<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$TMPDIR</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$JACK_SERVER_VM_ARGUMENTS</span> -Xmx4096m -cp <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$LAUNCHER_JAR</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$LAUNCHER_NAME</span>"</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    然后再执行:time make -j4

    5、运行模拟器

    source build/envsetup.sh 
    lunch (选择1) 
    emulator

    远程桌面连接情况下,运行模拟器会失败,需要在物理机上运行。

    问题:物理机上运行模拟器,启动Android特别慢,不知是何原因。

    展开全文
  • 最近在看金泰延老师写的《Android 框架揭秘》一书,第一章就是下载并编译android源码,书中内容较为陈旧,所以不得不到网上收罗各种资料,最后总算是大功告成,现在总结如下。 1、安装git和repo并配置 安装git...

    最近在看金泰延老师写的《Android 框架揭秘》一书,第一章就是下载并编译android源码,书中内容较为陈旧,所以不得不到网上收罗各种资料,最后总算是大功告成,现在总结如下。

    1、安装git和repo并配置

    安装git通过下面命令实现

    sudo apt-get install git

    另外还需要配置好git的user.email和user.name,这个自己随便写就行了

    git config --global user.name "your name"
    git config --global user.email "XXX@XXX.com"

    然后由于我们是通过repo来拉取android源码的,git配置好后,还得安装配置repo

    git clone https://aosp.tuna.tsinghua.edu.cn/git-repo/
    chmod a+x git-repo/repo

    然后添加repo(路径目录如:~/git-repo/repo)到PATH环境变量

    export PATH=~/git-repo:$PATH

    然后到打开~/git-repo/repo文件,将REPO_URL替换为清华镜像地址,以避免下载android源码时可能出现的无法连接到 gerrit.googlesource.com问题。

    REPO_URL = 'https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

    2、下载andriod源码

    首先创建一个自己存放源码的目录,我是放在~/Android/source路径下的,然后cd到对应的路径下执行下面命令

    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

    然后执行如下命令可以查看可以下载的android源码分支,目前我看到的已经可以获取android-9.x的分支了。

    cd .repo/manifests.git/
    git branch -a

    这里同步android-8.1.0_r41分支并拉取对应分支源码

    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r41
    repo sync

    这个过程时间较长,可能需要几个小时,期间该干嘛干嘛。

    3、Ubuntu 18.04编译环境配置

    首先得配置java8

    sudo apt-get install openjdk-8-jdk
    sudo apt-get install openjdk-8-jre

    注意这里是配置openjdk,不要弄错了,我之前是按照一篇教程配置了android studio环境,结果配置的jdk不是openjdk,执行java -version时有如下提示
    这里写图片描述
    实际上在执行java -version有如下的openjdk提示时(版本号不一定相同),才算是jdk配置成功
    这里写图片描述
    然后配置在ubantu 18.04中编译android源码需要的一些依赖,这些依赖包在ubantu 16.04中编译android源码时也是需要的

    sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
    sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
    sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
    sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
    sudo apt-get install git-core gnupg flex bison gperf build-essential  
    sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
    sudo apt-get install libc6-dev-i386
    sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
    sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
    sudo apt-get install lib32z-dev ccache

    到这里编译环境配置就算是完成了。

    4、编译Android源码

    这里到了最关键也是最容易出问题的一步了,首先cd到应的源码目路,初始化编译环境

    . build/envsetup.sh

    初始化编译环境后,引入了一些执行脚本,其中就包括马上要使用的lunch指令。通过lunch指令可以设置编译目标,所谓的编译目标就是生成的镜像要运行在什么样的设备上。这里我们设置的编译目标是aosp_arm64-eng,因此执行指令

    lunch aosp_arm64-eng

    简单的说明下,aosp表示Android Open Source Project,arm64表示是使用arm64 cpu的设备,eng表示engineer版本,其直接开放了一些root等权限。当然直接使用lunch命令会列出所有可选的编译目标。

    最后,我们便可通过如下命令来开始编译andriod源码

    make -j8

    这里的j8表示可以开启8个线程来参与编译源码,这里指定的线程数一般应该遵从cpu内核数的2倍这个规律,可以通过cat /proc/cpuinfo查看相关cpu信息。

    5、编译错误集锦

    如果以为第四小节的三步走战略就可以直接编译出可用的Android image来那就too young啦,实际上在编译过程中,我遇到很多故障,同时由于编译过程需要话费很多时间,所以整个编译花费了我大把时间,这个童鞋们一定要作好心理准备。下面是我在编译过程遇到的问题以及解决办法总结

    故障1:You are attemping to build with the incorrect version
    这里写图片描述
    这个就是在编译高版本android源码时,可能出现的jdk版本问题,我之前是使用上面命令介绍的方式配置了openjdk却在java -version发现还是不是open jdk版本,究其原因竟是我在更之前配置android studio时在/etc/profile 中配置了另一个jdk版本导致该问题发生,后面在/etc/profile中删除对应配置就好了。

    故障2:Out of memory error
    这里写图片描述
    这个问题是因为编译过程中JVM heap size太小而导致的,解决办法比较简单

    export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
    ~/Android/source/prebuilts/sdk/tools/jack-admin kill-server
    ~/Android/source/prebuilts/sdk/tools/jack-admin start-server

    通过这个配置可以讲JVM heap size调整为4g,这个应该是够用的,这里我们看到了jack-admin工具,后面可能还会使用这个工具,所以这里直接建议配置jack-admin的环境变量

    export PATH=$PATH:~/Android/source/prebuilts/sdk/tools

    之后就可以直接使用如下命令来启动jack-admin了

    jack-admin start-server

    故障3:sizeof (_nl_value_type_LC_TIME[0]))’ ???
    这里写图片描述
    这里图片我是从其它博客哪里拷过来的,但是的确碰到这个故障,通过下面配置去除本地化配置解决

    export LC_ALL=C

    故障4:No Jack server running. Try ‘jack-admin start-server’
    这里写图片描述
    这个错误碰到的还不止一次,看到这个提示我们都知道是jack-admin没有启动的原因,重启便可

    jack-admin kill-server
    jack-admin start-server

    比较奇怪的是,有时自己明明开启了jack-admin,但是在编译的过程中,jack-admin却挂掉了,这个得多注意。

    我在编译过程中主要是遇到了以上几个故障,实际上其它博客上还有一些其它故障可以参考的,也只能在遇到具体故障的时候再百度google了,总之是编译android源码需要一定的耐心。

    6、运行模拟器

    在完成编译后,我们可以直接通过emulator命令来运行模拟器

    emulator

    运行模拟器实际上需要四个组件

    1、Linux Kernel
    2、system.img
    3、userdata.img
    4、ramdisk.img

    如果你在使用lunch命令时选择的是aosp_arm-eng,那么在执行不带参数的emualtor命令时,Linux Kernel默认使用的是/source/prebuilds/qemu-kernel/arm/kernel-qemu目录下的kernel-qemu文件。而android镜像文件则是默认使用source/out/target/product/generic目录下的system.img、userdata.img和ramdisk.img,也就是我们刚刚编译出来的镜像文件。

    上面我在使用lunch命令时选择的是aosp_arm64-eng,因此linux默认使用的/source/prebuilds/qemu-kernel/arm64/kernel-qemu下的kernel-qemu,而其他文件则是使用的source/out/target/product/generic64目录下的system.img、userdata.img和ramdisk.img。
    这里写图片描述
    在使用emulator命令后,正常的话,我们可以启动模拟器,我这里启动的模拟器信息如下
    这里写图片描述
    这里可以看出启动的是我们编译时指定的aosp_arm64-eng模拟器,实际上emulator还有很多其它指令可以选择,这个可以通过它的help命令来查看

    emulator -help

    7、单独编译模块及SDK

    除了通过make命令编译可以整个android源码外,Google也为我们提供了相应的命令来支持单独模块的编译。

    编译环境初始化(即执行. build/envsetup.sh)之后,我们可以得到一些有用的指令,除了上边用到的lunch,在envsetup.sh文件中我们还可以找到如下的指令
    这里写图片描述
    其中的mmm指令就可以用来编译指定模块,

    mmm packages/apps/StorageManager/

    稍等一会之后,如果提示编译完成,此时便可在out/target/product/gereric_arm64/system/priv-app就可以找到编译的StorageManager.apk文件了。

    这里写图片描述
    编译好指定模块后,如果我们想要将该模块对应的apk集成到系统镜像中,需要借助make snod指令重新打包系统镜像,这样我们新生成的system.img中就包含了刚才编译的Launcher2模块了,重启模拟器之后生效。

    我们在不断的修改某些模块,总不能每次编译完成后都要重新打包system.img,然后重启手机吧?有没有什么简单的方法呢?
    在编译完后,借助adb install命令直接将生成的apk文件安装到设备上即可,相比使用make snod,会节省很多时间。

    直接执行make是不包括make sdk的,如果要编译自己的sdk则十分简单,只需要执行如下命令便可

    . build/envsetup.sh
    lunch sdk-eng
    make sdk

    如果编译成功,不出意外,在out/host/linux-x86/sdk就可以看到了。
    补充
    我们简单的来介绍out/target/product/generic_arm64/system目录下的常用目录:
    Android系统自带的apk文件都在out/target/product/generic_arm64/system/priv-app目录下
    一些可执行文件(比如C编译的执行),放在out/target/product/generic_arm64/system/bin目录下
    动态链接库放在out/target/product/generic_arm64/system/lib目录下
    硬件抽象层文件都放在out/targer/product/generic_arm64/system/lib/hw目录下

    这里需要注意的就是由于我们这里编译的是aosp_arm64-eng编译目标,所以这里的路径中是generic_arm64,如果是编译的其它目标路径可能不一样,比如当编译的是aosp_arm-eng时,则路径中就是generic。

    到这里Ubantu18.04环境下编译android源码基本介绍就算完成了。

    参考文献

    1、自己动手编译Android 8.0源码
    2、Ubuntu 18.04编译Android8.1 automotive
    3、自己动手编译最新Android源码及SDK(Ubuntu)
    4、Linux Out of memory error
    5、 Android 编译命令
    6、通过清华大学镜像下载Android源码并编译源码
    7、Ubuntu环境中的Android源代码下载
    8、ERROR: No Jack server running

    展开全文
  • 出现这个错误是由于电脑内存不足,在命令行分别执行以下三条语句,然后继续编译 export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g" ./prebuilts/sdk/tools/jack-...

    出现这个错误是由于电脑内存不足,在命令行分别执行以下三条语句,然后继续编译

    export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"

    ./prebuilts/sdk/tools/jack-admin kill-server 
    ./prebuilts/sdk/tools/jack-admin start-server

    展开全文
  • 一、创建交换分区Swap在装完Linux系统之后自己去修改Swap分区的大小(两种方法)在安装完Linux系统后,swap分区太小怎么办,怎么可以扩大Swap分区呢?有两个办法,一个是从新建立swap分区,一个是增加swap分区。...
  • 在Android Studio代码调试一文中,简单的介绍了代码调试的一些技巧.现在我们来谈谈android源码编译的一些事.(俺认为,作为android developer...本文适用于以下以下编译途径: Ubuntu 16.04上编译Android 6.0.x 及以上版本.
  • 出现这个错误是由于电脑内存不足,在命令行分别执行以下三条语句,然后继续编译 export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g" ./prebuilts/sdk/tools/jack-admin ...
  • Ubuntu18.04 编译Android 8.1 源码出现的问题及解决笔记经过不断的尝试并经过一晚上的编译终于在ubuntu18.04的虚拟机内编译成功Android 8.1,下面我列举以下在编译项目是遇到的问题及解决办法错误一错误二错误三错误...
  • 在ubuntu 18.04编译android 8.1 2018.08.06 在看了许多教程后自己也动手实施,道路可以说简单也可以说难。 硬件要求: 越高越好,不建议在虚拟机内编译 内存越大越好,推荐200G,在这里就不赘述怎么安装ubuntu...
  • 作为android developer人人都应该有一份自己Android源码,这样我们就可以随时对自己有疑惑的地方通过亲手调试来加强理解。 android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4运行.
  • 这是系统第一次编译Android系统 发生错误 可能是因为容量不够导致的 后来通过VMware对他进行扩容,虽然在vmware的界面中已经显示最大支持40G,但是在ubuntu系统里面 却没有实际显示 再次关机重启 就出现了...
  • 正因为如此我着手使用android7.0的源码编译一个镜像,然后下载后运行成功,同样有点美中不足,就是应用太少(只有setting 和浏览器),安装软件很不方便,后面的正在学习和改进,下面将贴出我的android7.0编
  • 前提不需要SDK,不需要ADT,通过整个工程的编译都可以生成。为了在Eclipse中调试源码如Phone、MMS、Contact…… 由于以前都没接触过Java、Eclipse、ADT... 这些,在网上看了N多的文章,就这篇详细,所以贴出来共享,...
  • 安装git并且配置 sudo apt-get install git git config --global user.name "your name" git config --global user.email "XXX@XXX.com" 安装repo sudo apt-get install curl ...PATH=~/bin:$PATH
  • android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4模拟器运行 1.源码下载 首先确保自己已经安装了Git. sudo apt-get install git git config –global user.email “test@test.com” git config –...
  • 文章目录依赖安装编译error[error 01] java.lang.OutOfMemoryError编译启动emulator 依赖安装 下面下载的操作请大家参看我的另一篇文章《基于ubuntu20.04使用国内镜像下载android-10.0.0_r39源码》 sudo apt-get ...
  • 1准备Android编译环境 需要安装编译过程中的依赖的其他第三方库。 sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32...
1 2 3 4 5 ... 20
收藏数 4,686
精华内容 1,874
关键字:

xmx设置 编译android