Android源码编译

作者: lengyan_zhao | 来源:发表于2017-08-25 14:34 被阅读309次

    linux环境下编译安卓源码,是每个Android开发者深入学习Android系统以及源码所要必须掌握的。接下来我会将详细介绍Android源码的编译过程。

    编译环境搭建

    安装Ubuntu系统

    我使用的是Ubuntu15.10操作系统64位,12.1.1的VMare虚拟机,在虚拟机上创建新的虚拟机配置如下(主要的配置图):

    选择操作系统

    选择对应的操作系统类别,根据自己安装的系统类别进行配置;

    虚拟机信息配置

    虚拟机名称自定义;
    位置表示创建虚拟机的存储位置(选择硬盘空间足够大的,因为接下来需要分配虚拟内存);

    配置虚拟内存

    内存大小很重要,android5.X下载完整源码需要将近50G的大小,而且还不包括编译需要的内存大小(也将近50多G);

    添加安装镜像文件

    配置安装的镜像文件,然后启动该虚拟机,简单配置一些信息,就会完成系统安装;

    注意:根据Android Source中对于操作系统的要求:
    Android 通常是在 GNU/Linux 或 Mac OS 操作系统中进行编译。您也可以使用虚拟机在不支持的系统(例如 Windows)中编译 Android。

    • GNU/Linux
      Android 6.0 (Marshmallow) - AOSP master:Ubuntu 14.04 (Trusty)
      Android 2.3.x (Gingerbread) - Android 5.x (Lollipop):Ubuntu 12.04 (Precise)
      Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu 10.04 (Lucid)

    • Mac OS (Intel/x86)
      Android 6.0 (Marshmallow) - AOSP master:Mac OS v10.10 (Yosemite) 或更高版本,具有 Xcode 4.5.2 和命令行工具
      Android 5.x (Lollipop):Mac OS v10.8 (Mountain Lion),具有 Xcode 4.5.2 和命令行工具
      Android 4.1.x-4.3.x (Jelly Bean) - Android 4.4.x (KitKat):Mac OS v10.6 (Snow Leopard) 或 Mac OS X v10.7 (Lion),以及 Xcode 4.2(Apple 的开发者工具)
      Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich):Mac OS v10.5 (Leopard) 或 Mac OS X v10.6 (Snow Leopard),以及 Mac OS X v10.5 SDK

    Android Source参考

    可以访问Android Source,参考对应的配置要求和配置过程;
    以下内容是Android Source中,对于编译环境的一些要求:

    安装配置JDK
    • 安装JDK
      根据上面的java套件的要求,我们将安装OpenJdk7.首先更新系统程序,然后再执行安装OpenJdk7的安装命令
      更新程序包

    sudo apt-get update

    安装OpenJdk7:

    sudo apt-get install openjdk-7-jdk

    • 配置JDK环境(这篇文章不需要配置,暂时不做配置)
    安装编译的依赖包

    sudo apt-get install bison g++-multilib git gperf libxml2-utils make python-networkx zlib1g-dev:i386 zip

    sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386

    上面的执行命令中原本是有mingw32软件包的,但是实际安装过程却“无法定位mingw32”,接下来单独安装mingw32;

    sudo gedit /etc/apt/sources.list
    //在sources.list末尾添加,保存
    deb http://us.archive.ubuntu.com/ubuntu trusty main universe
    sudo apt-get update
    sudo apt-get install mingw32
    按照上面的操作就可以成功安装mingw32;
    sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

    配置USB使用权限

    在 GNU/Linux 系统中,尤其是在 Ubuntu 系统中,默认情况下普通用户无法直接使用 USB 设备。您需要对系统进行配置以允许使用此类设备。
    建议您以 root 用户的身份在 /etc/udev/rules.d/51-android.rules
    下创建一个文件。
    为此,请运行以下命令来下载本网站附带的 51-android.txt 文件,对其进行修改以包含您的用户名,然后将其放到正确位置:

    wget -S -O - http://source.android.com/source/51-android.txt | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules

    以上命令由于需要翻墙可能无法执行成功,但是可以在网上下载51-android.txt文件,然后配置到自己的服务器上然后替换命令上的url就可以正确执行;
    这些新规则会在下次插入设备时生效。因此,您可能需要先拔下设备,然后再将其插到计算机上。

    执行以下命令完成配置,使新改动的规则生效:

    sudo udevadm control --reload-rules

    安装repo

    repo是GIT的管理工具,有效的实现单个项目下可以包含多个git子项目并且实现项目之间的依赖调用关系配置,而且repo封装了多个git的命令,进而实现创建分支,查看分支,删除分支等等;由于Android项目包含多个子项目工程,使用repo可以有效的实现AOSP的管理;所以下载Android源码需要安装repo,接下来我们来看看repo的安装过程。
    首先,创建需要存放repo的文件夹,然后执行以下命令来cloen对应的项目:

    git clone https://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/

    切换到新创建的目录下,我们会看到新增加的文件夹git-repo.git,接下来将文件夹git-repo.git下的repo文件复制到~/bin/repo到该文件:

    cp git-repo.git/repo ~/bin/repo

    给~/bin/repo这个文件授权为可执行文件

    chmod a+x ~/bin/repo

    修改~/bin/repo文件中的REPO_URL值

    sudo vi ~/bin/repo

    REPO_URL="https://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/"

    配置.bashrc

    vi ~/.brashrc

    添加内容:

    export PATH=~/bin:$PATH

    安装ccache

    ccache是c/c++在编译过程中的缓存依赖包,通过设置ccache可以提高c/c++编译的效率;一般缓存设置的大小为50G;

    sudo apt-get install ccache
    source ~/.bashrc

    配置缓存大小:

    prebuilts/misc/linux-x86/ccache/ccache -M 50G

    至此,环境已经搭建完成。

    下载源码

    • 先初始化repo目录,

    mkdir aosp
    cd aosp

    执行命令:

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

    执行过程出现


    SecureCRT

    需要配置git config

    git config --global user.name "your name"
    git config --global user.email "your email"

    • 同步代码

    repo sync

    编译源码

    首先配置执行环境

    cd aosp
    . build/envsetup.sh

    配置缓存:

    cd aosp
    prebuilts/misc/linux-x86/ccache/ccache -M 50G

    选择编译目标包:

    lauch

    You're building on Linux
    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. aosp_hammerhead-userdebug
    8. aosp_mako-userdebug
    9. mini_emulator_x86_64-userdebug
    10. mini_emulator_mips-userdebug
    11. m_e_arm-userdebug
    12. mini_emulator_x86-userdebug
    13. mini_emulator_arm64-userdebug
    14. aosp_manta-userdebug
    15. aosp_shamu-userdebug
    16. aosp_tilapia-userdebug
    17. full_fugu-userdebug
    18. aosp_fugu-userdebug
    19. aosp_grouper-userdebug
    20. aosp_flo-userdebug
    21. aosp_deb-userdebug
    Which would you like? [aosp_arm-eng] 1
    ============================================
    PLATFORM_VERSION_CODENAME=REL
    PLATFORM_VERSION=5.0.2
    TARGET_PRODUCT=aosp_arm
    TARGET_BUILD_VARIANT=eng
    TARGET_BUILD_TYPE=release
    TARGET_BUILD_APPS=
    TARGET_ARCH=arm
    TARGET_ARCH_VARIANT=armv7-a
    TARGET_CPU_VARIANT=generic
    TARGET_2ND_ARCH=
    TARGET_2ND_ARCH_VARIANT=
    TARGET_2ND_CPU_VARIANT=
    HOST_ARCH=x86_64
    HOST_OS=linux
    HOST_OS_EXTRA=Linux-4.2.0-42-generic-x86_64-with-Ubuntu-15.10-wily
    HOST_BUILD_TYPE=release
    BUILD_ID=LRX22G
    OUT_DIR=out
    ============================================

    其中1是通用型的,这个得根据自己的硬件环境来决定的。

    执行编译命令

    make -j4

    1.make后面可以更参数:如你的机器时双核,每核双线程的话,使用make -j4,这样速度更快,但编译时使用的内存也更多
    2.make失败或停止后,可以使用make -k 继续编译

    模拟器测试

    完成编译之后,查看源码以及编译生成的out文件夹大小



    编译完成的默认输出文件out,接下来启动模拟器查看

    cd aosp
    emulator &

    如果出现以下问题,即“未找到命令”



    解决办法:
    可将如下环境变量重新初始化一遍(也就是每次重新进入系统运行的时候,都需要初始化一遍),lunch后面的参数要与你编译的ROM选项一致。

    . build/envsetup.sh
    lunch aosp_arm-eng

    aosp_arm-eng 上面编译是的选择,必须保持一致;

    接下来继续执行启动模拟器命令:

    emulator &

    执行结果:


    操作模拟器查看对应的Android版本信息是否和编译的版本一致(选择编译版本android_5.0.2_r):


    编译过程的问题

    1.由于源代码和javadoc中的类,方法,属性不一致,导致报错



    解决办法,google 给了两个选择::

    • 在你添加的API或者变量前面,增加javadoc 注释@hide。但是要注意的是,并不是简单写个@hide 或者 /@hide/ 就可以了,这些都是错误的javadoc注释格式,标准的javadoc都是这样的 /** */ 而且对于 format 变量 应该加上 { }。所以我们应该这样写 /** {@hide} */
    • 你就是想要生成的javadoc里面出现这个方法或者变量,你必须输入:

    make update-api

    但是如果修改的是google没有开放出来的类,比如RIL,PhoneFactory,就不会出现这个问题,
    实际上我并没有去修改源码,所以我估计可能是Android源码和javadoc存在一些差异导致的,所以我按照第二种方法去解决,执行完之后会在out/target/common/docs/doc-common-check 目录下创建文件current.txt和removed.txt,通过标记需要跳过的方法来实现编译通过;
    2.clang++的问题

    clang++: error: unable to execute command: Killed
    clang++: error: clang frontend command failed due to signal (use -v to see invocation)
    clang version 3.5
    Target: i386--linux-gnu
    Thread model: posix
    clang++: note: diagnostic msg: PLEASE submit a bug report to http://llvm.org/bugs/ and include the crash backtrace, preprocessed source, and associated run script.
    clang++: note: diagnostic msg:


    PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
    Preprocessed source(s) and associated run script(s) are located at:
    clang++: note: diagnostic msg: /tmp/android_system_OsConstants-6e651d.cpp
    clang++: note: diagnostic msg: /tmp/android_system_OsConstants-6e651d.sh
    clang++: note: diagnostic msg:


    host C: libbacktrace_libc++ <= system/core/libbacktrace/thread_utils.c
    make: *** [out/host/linux-x86/obj32/SHARED_LIBRARIES/libjavacore_intermediates/luni/src/main/native/android_system_OsConstants.o] 错误 254
    make: *** 正在等待未完成的任务....

    make failed to build some targets (26:09 (mm:ss))

    • 原因:
      这是swap区不够大的原因。导致clang++ kernel opps
    • 解决方法:
      请加大分区:
      sudo fallocate -l 6G /swapfile
      sudo chmod 600 /swapfile
      sudo mkswap /swapfile
      sudo swapon /swapfile
      开机自动挂载swap:
      使用 vi 或 nano 在 /etc/fstab 文件底部添加如下内容:
      /swapfile none swap sw 0 0

    总结

    至此,进过三到四天的白天黑夜,我们的整个Android5.0.2_r版本的源码就全部编译完成。我们也可以尝试连接真机设备进行刷机烧录操作,同时也可以使用源码进行frameworks层的开发,可以针对frameworks模块单独编译烧录,实现framework自定义开发。针对真机烧录和framework层的开发,后续将跟进。这篇文章主要是将整个android源码编译过程详情展示,亲身体验搭建环境和编译过程,参看网上的资料整理出现来的,下面会将参考的博客一一列出,所以是站在巨人肩上实现的,欢迎大家反馈以及指正批评

    参考资料:

    相关文章

      网友评论

        本文标题:Android源码编译

        本文链接:https://www.haomeiwen.com/subject/qgkqdxtx.html