编译可以运行在 Macbook M1 上的模拟器镜像

894 阅读2分钟

版权声明

凡未经作者授权,任何媒体、网站及个人不得转载、复制、重制、改动、展示或使用局部或全部的内容或服务。如果已转载,请自行删除。同时,我们保留进一步追究相关行为主体的法律责任的权利。

© 2023 小酥肉不加辣,All rights reserved.

本文基于 AOSP android13-release 分支代码修改

目前标准版本的 Android SDK 不包含可以运行在 Macbook M1 上的 Android Automotive OS 模拟器镜像,本文主要讲解如何修改 AOSP 中的源码达到可以自主编译模拟器镜像的步骤。

新增 mk 文件

在 device/generic/goldfish/car 目录下新增 sdk_car64_arm64.mk,内容为

#
# Copyright (C) 2016 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

PRODUCT_PACKAGE_OVERLAYS := device/generic/car/common/overlay

$(call inherit-product, device/generic/car/emulator/aosp_car_emulator.mk)
$(call inherit-product, device/generic/goldfish/64bitonly/product/sdk_phone64_arm64.mk)

PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := false

EMULATOR_VENDOR_NO_SOUND := true
PRODUCT_NAME := sdk_car64_arm64
PRODUCT_DEVICE := emulator64_arm64
PRODUCT_BRAND := Android
PRODUCT_MODEL := Car on arm64 only emulator

相比sdk_car_arm64.mk,重点是将 $(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_arm64.mk) 替换为 $(call inherit-product, device/generic/goldfish/64bitonly/product/sdk_phone64_arm64.mk)

Apple M1 只能运行 64bit only 的 arm64 模拟器,因此需要继承 arm64 手机模拟器的 64bit only 配置文件。Car 是继承 Phone 的,目前 Car 中的类库没有完全 64 位化,所以我们可以临时借助手机的类库来达到编译目的。

新增编译选项

AndroidProducts.mk 文件是在执行 lunch 时列出的所有选项,在其中增加 sdk_car64_arm64-userdebug 选项和对应的 mk 文件路径。

  • device/generic/goldfish/car/AndroidProducts.mk
diff --git a/car/AndroidProducts.mk b/car/AndroidProducts.mk
index 803a4c1..3efa5e8 100644
--- a/car/AndroidProducts.mk
+++ b/car/AndroidProducts.mk
@@ -16,6 +16,7 @@

 PRODUCT_MAKEFILES := \
     $(LOCAL_DIR)/sdk_car_arm64.mk \
+    $(LOCAL_DIR)/sdk_car64_arm64.mk \
     $(LOCAL_DIR)/sdk_car_arm.mk \
     $(LOCAL_DIR)/sdk_car_portrait_x86_64.mk \
     $(LOCAL_DIR)/sdk_car_x86.mk \
@@ -24,6 +25,7 @@ PRODUCT_MAKEFILES := \
 COMMON_LUNCH_CHOICES := \
     sdk_car_arm-userdebug \
     sdk_car_arm64-userdebug \
+    sdk_car64_arm64-userdebug \
     sdk_car_portrait_x86_64-userdebug \
     sdk_car_x86-userdebug \
     sdk_car_x86_64-userdebug \

编译

lunch 时选择新添加的 sdk_car64_arm64-userdebug

使用 m 命令重新编译整个项目。

使用 make emu_img_zip 编译模拟器镜像。

编译好的镜像文件在 out/target/product/emulator64_arm64/sdk-repo-linux-system-images-eng.$(whoami).zip

将生成的 zip 文件复制出来,解压之后替换本地 SDK 中的镜像 ~/Library/Android/sdk/system-images/android-33/android-automotive/arm64-v8a,选择这个镜像创建模拟器。