Android系统开发--3.Android源码编译

1. 编译

上一篇我们已经安装好 docker 编译环境了, 接下来我们就可以用来编译 Android 源码了。
进入 docker 环境,然后

1
2
3
4
cd ~/source/android-8.1
source build/envsetup.sh
lunch aosp_x86-eng
make -j8

编译过程中可能会遇到 java 版本不对的问题,这个镜像默认的 java 版本是 java1.6, 如果要编译 android4.4 以上的源码的话,需要修改 java 的版本。建议修改 build/envsetup.sh 里面的 set_java_home 函数,比如

1
2
3
4
function set_java_home() {
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
}

/usr/lib/jvm 路径下已经安装了 1.6, 1.7, 1.8 三个版本的 java 了。

修改完后,继续编译。

如果选择的是其它 product 进行编译的话,可能会出现另外一个错误:

1
2
3
host C: libsepol <= external/selinux/libsepol/src/assertion.c
error: ro.build.fingerprint cannot exceed 91 bytes: Android/mini_emulator_arm64/mini-emulator-armv7-a-neon:6.0.1/MOB31E/builder09031221:userdebug/test-keys (103)
make: *** [out/target/product/mini-emulator-armv7-a-neon/obj/ETC/system_build_prop_intermediates/build.prop] Error 1

搜索一下,就有解决方案了,修改 build/tools/post_process_props.py 中的 PROP_VALUE_MAX 值为 128。
继续编译。大概一个半小时才编译完,接下来我们尝试用虚拟机跑一下刚刚编译好的系统。

2. 验证

2.1 宿主机为 linux 环境

在宿主机上执行以下命令

1
2
3
4
cd ~/source/android-8.1
source build/envsetup.sh
lunch aosp_x86-eng
emulator

我们在宿主机上执行 source-lunch 的目的是为了让 lunch 帮我们配置好运行 emulator 所需要的环境变量。这样 emulator 才能正常地运行起来。

第一次启动比较慢,等个几分钟,虚拟机就启动完成了。
到 Settings –> about phone –> build number 里面查看一下系统编译信息。
可以看到是我们刚刚编译的系统了。

2.2 宿主机为 windows 环境

实际上我们大部分同学的宿主机是 windows 环境, 使用 ssh 连上 ubuntu 服务器进行编译的,通过 samba 共享文件的。
这种情况就没办法使用上一小节提到的方法了。
我们换个思路,使用 Android Sdk 里面的 emulator 。具体操作步骤如下

  • 打开 AndroidStudio –> AVD Manager
  • 新建虚拟机,注意选择的系统版本要与我们的源码版本一致, 这里我们选择的系统版本是 Android 8.1,创建完成后, 会在 C:\Users\$user.android\avd 下生成虚拟机的配置文件
  • 替换系统镜像
  • 启动虚拟机

其中 替换系统镜像 这一步有两种方法:
方法1:把 out 目录的 ramdisk.img, system-qemu.img, vendor-qemu.img, userdata-qemu.img system/build.pro 这几个文件替换到 AndroidSdk/system-images/android-27/google_apis_playstore/x86 目录下的 ramdisk.img, system.img, vendor.img, userdata.img, build.prop 这几个文件就行。

方法2:
修改 .android/avd/Nexus_5X_API_27.avd/config.ini 文件, 修改其中 image.sysdir.1 的值为androidPath/out/target/product/generic_pure,
把 system-qemu.img, vendor-qemu.img 这几个镜像重命名为 system.img, vendor.img,
把 generic_pure/system/build.prop 复制到 generic_pure/build.prop

这种方法在 linux 下也是适用的, 在高分屏电脑上,使用源码里面的 emulator 显示会错位,目前还不知道是哪里的配置有问题,所以我使用的是上面提到的方法 2。