android 12编译环境搭建

这是android系列的第一篇,介绍android 开发环境的搭建和调试过程。下面在ubuntu20.04下演示环境搭建的过程。

安装android 12环境依赖

环境依赖参考文档: 搭建编译环境

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

android 12源码下载

下载repo工具

repo工具下载

AOSP代码通过git进行管理,使用repo管理多个git仓库,下载代码前需要下载repo工具。
对于ubuntu,在ubuntu的软件源中有repo工具,可以直接通过apt安装:

# Debian/Ubuntu.
$ sudo apt-get install repo

或者通过执行下面的脚本进行安装:

$ mkdir -p ~/.bin
$ PATH="${HOME}/.bin:${PATH}"
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
$ chmod a+rx ~/.bin/repo
国内repo工具修改

由于国内无法google服务器下载AOSP代码,所以需要修改repo工具从国内镜像服务器下载。
例如:从科大源下载,通过vim工具修改repo脚本中的REPO_URL为 https://gerrit-googlesource.proxy.ustclug.org/git-repo

vim ~/.bin/repo

添加143行:

 140 # repo default configuration
 141 #
 142 REPO_URL = os.environ.get('REPO_URL', None)
 143 REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
 144 if not REPO_URL:
 145   REPO_URL = 'https://gerrit.googlesource.com/git-repo'
 146 REPO_REV = os.environ.get('REPO_REV')
 147 if not REPO_REV:
 148   REPO_REV = 'stable'

repo命令参考文档:repo

代码下载

国内无法直接访问,可以使用清华源或者科大的AOSP源。

下面以下载android12 r3代码为例说明:

  1. 创建android12_12.1.0.r3目录,并进入
  2. 初始化代码仓
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b  android-12.1.0_r3

如果要下载其他分支的代码,修改-b参数即可。
分支信息参考android分支说明.

  1. 同步代码
    androi代码较大,同步代码会耗时比较久,建议PC上至少有200G可用空间。下面是同步代码的命令,使用8线程同步。
repo sync -c -j8

代码下载参考文档: 代码下载

代码编译

编译分为初始化编译环境、选择编译产品、编译三个步骤:

  1. 初始化编译环境
source build/envsetup.sh

build/envsetup.sh是个shell脚本,此脚本中定义了android编译、代码搜索、文件搜索、目录之间跳转等非常有用的命令。由于android代码量大,目录比较深,有这些命令大大提高了效率,详细说明请查看此文件,或输入hmm命令查看帮助。

  1. 选择产品
    使用lunch选择要编译的产品,此文档中以编译x86_x64 emulator模拟器镜像为例进行说明。

(1). 修改AndroidProduct.mk使支持x86_x64镜像编译
由于android12 默认lunch默认选不到模拟器镜像,所以首先需要修改mk。
修改build/make/target/product/AndroidProducts.mk文件,添加sdk_phone_x86_64-eng支持

diff --git a/target/product/AndroidProducts.mk b/target/product/AndroidProducts.mk
index 7d9d90e92a..419cccb80a 100644
--- a/target/product/AndroidProducts.mk
+++ b/target/product/AndroidProducts.mk
@@ -84,3 +84,4 @@ COMMON_LUNCH_CHOICES := \
     aosp_arm-eng \
     aosp_x86_64-eng \
     aosp_x86-eng \
+    sdk_phone_x86_64-eng \

参考修改.

(2). 执行lunch命令选择产品

lunch sdk_phone_x86_64-eng
  1. 执行编译
    输入m命令直接开始编译,也可以手动指定编译的线程。
~/code/android12_12.1.0.r3$ m
build/make/core/soong_config.mk:195: warning: BOARD_PLAT_PUBLIC_SEPOLICY_DIR has been deprecated. Use SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS instead.
build/make/core/soong_config.mk:196: warning: BOARD_PLAT_PRIVATE_SEPOLICY_DIR has been deprecated. Use SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS instead.

编译完成之后,输出如下:

......
#### build completed successfully (29:45 (mm:ss)) ####

编译生成的镜像,在out/target/product/emulator_x86_64路径下,生成的镜像如下:

out/target/product/emulator_x86_64$ ls -ah *.img
cache.img          product.img        ramdisk.img               super_empty.img  system_ext-qemu.img  userdata.img       vendor_boot-debug.img         vendor.img
dtb.img            product-qemu.img   ramdisk-qemu.img          super.img        system.img           userdata-qemu.img  vendor_boot.img               vendor-qemu.img
encryptionkey.img  ramdisk-debug.img  ramdisk-test-harness.img  system_ext.img   system-qemu.img      vbmeta.img  

模拟器执行

编译成功之后,直接在编译窗口输入emulator命令,即可启动android模拟器,并且模拟器使用的镜像是刚编译的镜像。

/code/android12_12.1.0.r3/out/target/product/emulator_x86_64$ emulator
emulator: Android emulator version 30.9.0.0 (build_id 7651928) (CL:N/A)
2022-04-21 15:06:36.680 bluetooth - /buildbot/src/android/emu-master-dev/system/bt/vendor_libs/test_vendor_lib/model/setup/device_boutique.cc:33 - Register: Registering beacon_swarm
2022-04-21 15:06:36.680 bluetooth - /buildbot/src/android/emu-master-dev/system/bt/vendor_libs/test_vendor_lib/model/setup/device_boutique.cc:33 - Register: Registering beacon

执行效果如下:
android模拟器
注意:

  1. 此处的emulator命令是代码编译时,source build/envsetup.sh和lunch设置的命令,emulator的实际位置在android源码的prebuilts/android-emulator下面:
~/code/android12_12.1.0.r3/out/target/product/emulator_x86_64$ which emulator
/home/zdm/code/android12_12.1.0.r3/prebuilts/android-emulator/linux-x86_64/emulator
  1. 如果执行模拟器时出现下面的错误
mulator: ERROR: Running multiple emulators with the same AVD is an experimental feature.
Please use -read-only flag to enable this feature.

表示已经有模拟器在运行了,或者是由于模拟器异常退出导致,删除下面两个lock文件即可正常:

$ croot
$ cd out/target/product/emulator_x86_64
$ ls *.lock
hardware-qemu.ini.lock  multiinstance.lock

模拟器命令参考手册

编译模拟器内核相关

https://gabrio-tognozzi.medium.com/run-android-emulator-with-a-custom-kernel-547287ef708c
https://blog.csdn.net/ldswfun/article/details/119786846
https://download.csdn.net/learn/35479/529617?spm=1002.2001.3001.4157
android调试等等
http://www.juneleo.cn/47a3736f9762/
https://www.cxyzjd.com/article/u013541140/52221290

参考文档

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐