编译、运行源码

Reference


软、硬件环境

  1. PC

  2. 手机

    Pixel XL 欧版 32GB 银色


构建编译环境

安装 Git 并配置用户名、密码

在命令行运行:

$ sudo apt-get install git 
$ git config --global user.email "[email protected]"
$ git config --global user.name "xx"

安装 JDK

在命令行运行:

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

安装依赖

在命令行运行:

$ 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

下载源码

安装 Repo 工具

Repo 工具通过调用 Git 命令实现对 AOSP 的管理。

  1. 确保主目录下有一个 bin/ 目录,并且该目录包含在路径中

    在命令行运行:

    $ mkdir ~/bin
    $ PATH=~/bin:$PATH
    
  2. 下载 Repo 工具,并确保它可执行

    在命令行运行:

    $ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    $ chmod a+x ~/bin/repo
    
  3. 注意!以下 URL 不可用:

    $ curl https://storage-googleapis.lug.ustc.edu.cn/git-repo-downloads/repo > ~/bin/repo
    

    否则会报错:

    line 1: html: No such file or directory
    line 2: syntax error near unexpected token `<'
    line 2: `<head><title>301 Moved Permanently</title></hea'>
    
  4. 如果下载失败,原因是未翻墙,可在别处下载好并复制到特定目录中

    在命令行运行:

    $ cp repo ~/bin
    

同步源码

  1. 下载初始化包

    在命令行运行:

    $ wget https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
    
  2. 解压缩下载的 tar 文件

    在命令行运行:

    $ tar xf aosp-latest.tar
    
  3. 进入 aosp 目录

    在命令行运行:

    $ cd aosp
    
  4. 修改 repo 文件

    在命令行运行:

    $ sudo gedit ~/bin/repo
    

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

    否则同步源码树时会报错:

    fatal: unable to access 'https://gerrit.googlesource.com/git-repo/': Failed to connect to gerrit.googlesource.com port 443: Connection timed out
    fatal: unable to access 'https://gerrit.googlesource.com/git-repo/': Failed to connect to gerrit.googlesource.com port 443: Connection timed out
    error: Cannot fetch repo
    
  5. 查询版本

    登录源代码标记和细分版本查看,比如 Pixel XL 最新的是 android-7.1.1_r26。

  6. 设置获取的源码的版本

    在命令行运行:

    $ repo init -b android-7.1.1_r26
    
  7. 同步源码树

    在命令行运行:

    $ repo sync
    
  8. 同步完成后 aosp 会显示内容


编译源码

设置环境

  1. 执行 envsetup.sh 脚本

    在命令行运行:

    $ source build/envsetup.sh
    

设置目标

  1. 获取目标

    目标就是生成的镜像要运行在什么样的设备上。

    登录选择设备编译系统查看,BUILD 为 aosp_x86_64 对应 Intel 平台的模拟器,BUILD 为 aosp_marlin 对应 Pixel XL。

    BUILD 包含 arm,表示系统运行在 arm 架构的处理器上,arm64 表示系统运行在 64 位 arm 架构的处理器上。x86mips 同理。

    BUILDTYPE 是 user,表示编译出的系统镜像是可以用来正式发布到市场的版本,没有 root 权限和 debug 权限。userdebug 表示有 root 权限和 debug 权限。eng 表示系统镜像是开发版,有最大的权限。

    在命令行运行:

    $ lunch
    

    会打印出所有目标,通过输入序号可以选择目标:

    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. full_fugu-userdebug
         8. aosp_fugu-userdebug
         9. car_emu_arm64-userdebug
         10. car_emu_arm-userdebug
         11. car_emu_x86_64-userdebug
         12. car_emu_x86-userdebug
         13. mini_emulator_arm64-userdebug
         14. m_e_arm-userdebug
         15. m_e_mips64-eng
         16. m_e_mips-userdebug
         17. mini_emulator_x86_64-userdebug
         18. mini_emulator_x86-userdebug
         19. uml-userdebug
         20. aosp_dragon-userdebug
         21. aosp_dragon-eng
         22. aosp_marlin-userdebug
         23. aosp_marlin_svelte-userdebug
         24. aosp_sailfish-userdebug
         25. aosp_angler-userdebug
         26. aosp_bullhead-userdebug
         27. aosp_bullhead_svelte-userdebug
         28. hikey-userdebug
         29. hikey960-userdebug
    
    Which would you like? [aosp_arm-eng] 6
    
    ============================================
    PLATFORM_VERSION_CODENAME=P
    PLATFORM_VERSION=P
    TARGET_PRODUCT=aosp_x86_64
    TARGET_BUILD_VARIANT=eng
    TARGET_BUILD_TYPE=release
    TARGET_PLATFORM_VERSION=PPR1
    TARGET_BUILD_APPS=
    TARGET_ARCH=x86_64
    TARGET_ARCH_VARIANT=x86_64
    TARGET_CPU_VARIANT=
    TARGET_2ND_ARCH=x86
    TARGET_2ND_ARCH_VARIANT=x86_64
    TARGET_2ND_CPU_VARIANT=
    HOST_ARCH=x86_64
    HOST_2ND_ARCH=x86
    HOST_OS=linux
    HOST_OS_EXTRA=Linux-4.4.0-59-generic-x86_64-Ubuntu-16.04.1-LTS
    HOST_CROSS_OS=windows
    HOST_CROSS_ARCH=x86
    HOST_CROSS_2ND_ARCH=x86_64
    HOST_BUILD_TYPE=release
    BUILD_ID=OC
    OUT_DIR=out
    AUX_OS_VARIANT_LIST=
    ============================================
    
  2. 也可以直接选择目标

    在命令行运行:

    $ lunch aosp_x86_64-eng
    
  3. 设置 8 个线程参与编译,并开始编译

    在命令行运行:

    $ make -j8
    

    当看到#### build completed successfully (01:45:47 (hh:mm:ss)) ####即表示编译成功,括号内为编译共计耗时。


运行

在模拟器中运行

  1. 如果不是刚刚执行过编译,则需要在命令行运行:

    $ source build/envsetup.sh
    $ lunch aosp_x86_64-eng
    
  2. 运行

    在命令行运行:

    $ emulator -memory 2048 -partition-size 4096
    

    运行成功:

配置参数

  1. 增加 system/data 分区大小

    在命令行运行:

    $ emulator -partition-size 4096
    

    否则会报错:

    emulator: WARNING: system partition size adjusted to match image file (2048 MB > 200 MB)
    emulator: WARNING: data partition size adjusted to match image file (550 MB > 200 MB)
    
  2. 增加 RAM 大小

    在命令行运行:

    $ emulator -memory 2048
    

    否则会报错:

    emulator: WARNING: Increasing RAM size to 1GB
    

    设置成功:

模拟器运行所需要的 4 个文件包括:Linux Kernelsystem.imguserdate.imgramdisk.img

aosp_arm-eng 使用的是 prebuilds/qemu-kernel/arm/kernel-qemu 目录中的 Linux Kernel,out/target/product/generic 目录中的 system.imguserdate.imgramdisk.img

aosp_arm64-eng 使用的是 prebuilds/qemu-kernel/arm64/kernel-qemu 目录中的 Linux Kernel,out/target/product/generic64 目录中的 system.imguserdate.imgramdisk.img

模块编译

  1. 编译 Launcher2 模块

    在命令行运行:

    $ mmm packages/apps/Launcher2/
    

    编译生成的 apk 文件位置:

    out/target/product/对应平台的generic文件夹/data/app/LauncherRotationStressTest/LauncherRotationStressTest.apk
    

    TODO

    1. 执行 mmm packages/apps/Launcher2/ 应该生成 out/target/product/gereric/system/app/Launcher2.apk,但是实际生成的是 out/target/product/generic_x86_64/data/app/LauncherRotationStressTest/LauncherRotationStressTest.apk,经查询,该文件对应的是 Launcher3。
  2. 编译 Launcher3 模块

    在命令行运行:

    $ mma packages/apps/Launcher3/
    

    不能使用 mmm packages/apps/Launcher3/,否则会报错:

    ninja: error: 'out/host/linux-x86/framework/host-libprotobuf-java-nano.jar', needed by 'out/host/common/obj/JAVA_LIBRARIES/launcher_proto_lib_intermediates/classes-full-debug.jar', missing and no known rule to make it
    build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed
    

    TODO

    1. 找不到 apk 文件。
  3. 安装 apk 文件

    在命令行运行(比如 64 位 Intel 平台):

    adb install out/target/product/generic_x86_64/data/app/LauncherRotationStressTest/LauncherRotationStressTest.apk
    
  4. 重新打包 apk 文件到系统镜像中

    在命令行运行:

    make snod
    

系统自带应用的 apk 文件的位置: out/target/product/对应平台的generic文件夹/system/app

可执行文件的位置: out/target/product/对应平台的generic文件夹/system/bin

动态链接库文件的位置: out/target/product/对应平台的generic文件夹/system/lib

硬件抽象层文件的位置: out/target/product/对应平台的generic文件夹/system/lib/hw


本文标题:编译、运行源码

文章作者:魏超

发布时间:2017年10月15日 - 14:10

最后更新:2018年12月07日 - 19:12

原始链接:http://www.weichao.io/2017/10/15/编译、运行源码/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

---------------------本文结束---------------------