编译AAOS镜像并导入Android Studio

网上一般的操作,是先创建一个正常的AVD,然后将自己编译生成的镜像,替换AVD中的文件。本文介绍一种更为优雅的做法(参考Android虚拟设备作为开发平台  |  Android Open Source Project)。

构建镜像包

下载代码:

mkdir AOSP
cd AOSP
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-11.0.0_r48
repo sync -d -c --no-tags -j80

编译:

. build/envsetup.sh
lunch aosp_car_x86_64-userdebug
make -j80

生成镜像包:

m emu_img_zip

注意,emu_img_zip只有在Android11之后才有,Android 11可参考如下修改:

修改device/generic/goldfish/Android.mk:

新增文件 tasks/emu_img_zip.mk

# Rules to generate a zip file that contains google emulator images
# and other files for distribution

ifeq ($(filter $(TARGET_PRODUCT), qemu_trusty_arm64),)
ifeq ($(filter $(MAKECMDGOALS), sdk win_sdk sdk_repo goog_emu_imgs),)
emulator_img_source_prop := $(TARGET_OUT_INTERMEDIATES)/source.properties
$(emulator_img_source_prop): $(PRODUCT_SDK_ADDON_SYS_IMG_SOURCE_PROP)
	@echo Generate $@
	$(hide) mkdir -p $(dir $@)
	$(hide) sed \
		-e 's/$${PLATFORM_VERSION}/$(PLATFORM_VERSION)/' \
		-e 's/$${PLATFORM_SDK_VERSION}/$(PLATFORM_SDK_VERSION)/' \
		-e 's/$${PLATFORM_VERSION_CODENAME}/$(subst REL,,$(PLATFORM_VERSION_CODENAME))/' \
		-e 's/$${TARGET_ARCH}/$(TARGET_ARCH)/' \
		-e 's/$${TARGET_CPU_ABI}/$(TARGET_CPU_ABI)/' \
		$< > $@ && sed -i -e '/^AndroidVersion.CodeName=\s*$$/d' $@

INTERNAL_EMULATOR_PACKAGE_FILES := \
        $(target_notice_file_txt) \
        $(emulator_img_source_prop) \
        $(PRODUCT_OUT)/system/build.prop \

ifneq ($(filter $(TARGET_PRODUCT), sdk_goog3_x86 sdk_goog3_x86_64 sdk_goog3_x86_arm),)
    INTERNAL_EMULATOR_PACKAGE_FILES += \
        $(HOST_OUT_EXECUTABLES)/dex2oats \
        $(HOST_OUT_EXECUTABLES)/dex2oatds
endif

ifeq ($(BUILD_QEMU_IMAGES),true)
ifeq ($(BOARD_AVB_ENABLE),true)
INTERNAL_EMULATOR_PACKAGE_FILES += \
        $(PRODUCT_OUT)/VerifiedBootParams.textproto
endif
endif

INTERNAL_EMULATOR_PACKAGE_SOURCE := $(PRODUCT_OUT)/emulator

INSTALLED_QEMU_SYSTEMIMAGE := $(PRODUCT_OUT)/system-qemu.img
FINAL_INSTALLED_QEMU_SYSTEMIMAGE := $(INTERNAL_EMULATOR_PACKAGE_SOURCE)/$(TARGET_CPU_ABI)/system.img
$(eval $(call copy-one-file,$(INSTALLED_QEMU_SYSTEMIMAGE),$(FINAL_INSTALLED_QEMU_SYSTEMIMAGE)))

INSTALLED_QEMU_RAMDISKIMAGE := $(PRODUCT_OUT)/ramdisk-qemu.img
FINAL_INSTALLED_QEMU_RAMDISKIMAGE := $(INTERNAL_EMULATOR_PACKAGE_SOURCE)/$(TARGET_CPU_ABI)/ramdisk.img
$(eval $(call copy-one-file,$(INSTALLED_QEMU_RAMDISKIMAGE),$(FINAL_INSTALLED_QEMU_RAMDISKIMAGE)))

INSTALLED_QEMU_VENDORIMAGE := $(PRODUCT_OUT)/vendor-qemu.img
FINAL_INSTALLED_QEMU_VENDORIMAGE := $(INTERNAL_EMULATOR_PACKAGE_SOURCE)/$(TARGET_CPU_ABI)/vendor.img
$(eval $(call copy-one-file,$(INSTALLED_QEMU_VENDORIMAGE),$(FINAL_INSTALLED_QEMU_VENDORIMAGE)))


INTERNAL_EMULATOR_PACKAGE_FILES += device/generic/goldfish/data/etc/encryptionkey.img
INTERNAL_EMULATOR_PACKAGE_FILES += device/generic/goldfish/data/etc/userdata.img

INTERNAL_EMULATOR_FEATURE_DIR := .
ifneq ($(filter sdk_phone64_% sdk_gphone64_%, $(TARGET_PRODUCT)),)
INTERNAL_EMULATOR_FEATURE_DIR := 64bit
endif

ifeq ($(TARGET_BUILD_VARIANT),user)
INTERNAL_EMULATOR_PACKAGE_FILES += device/generic/goldfish/data/etc/google/$(INTERNAL_EMULATOR_FEATURE_DIR)/user/advancedFeatures.ini
ifeq ($(TARGET_ARCH),arm64)
INTERNAL_EMULATOR_PACKAGE_FILES += device/generic/goldfish/data/etc/google/$(INTERNAL_EMULATOR_FEATURE_DIR)/user/arm64/advancedFeatures.ini
endif
else
INTERNAL_EMULATOR_PACKAGE_FILES += device/generic/goldfish/data/etc/google/$(INTERNAL_EMULATOR_FEATURE_DIR)/userdebug/advancedFeatures.ini
ifeq ($(TARGET_ARCH),arm64)
INTERNAL_EMULATOR_PACKAGE_FILES += device/generic/goldfish/data/etc/google/$(INTERNAL_EMULATOR_FEATURE_DIR)/userdebug/arm64/advancedFeatures.ini
endif
endif



name := sdk-repo-linux-system-images-$(FILE_NAME_TAG)


INTERNAL_EMULATOR_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip

ifeq ($(TARGET_ARCH), x86)
EMULATOR_KERNEL_ARCH := x86_64
EMULATOR_KERNEL_DIST_NAME := kernel-ranchu-64
else
ifeq ($(TARGET_ARCH), x86_64)
EMULATOR_KERNEL_ARCH := $(TARGET_ARCH)
EMULATOR_KERNEL_DIST_NAME := kernel-ranchu
# quick workaround for Android 11
EMULATOR_KERNEL_FILE := $(PRODUCT_OUT)/$(EMULATOR_KERNEL_DIST_NAME)
else
ifeq ($(TARGET_ARCH), arm64)
EMULATOR_KERNEL_ARCH := $(TARGET_ARCH)
EMULATOR_KERNEL_DIST_NAME := kernel-ranchu
else
ifeq ($(TARGET_ARCH), arm)
EMULATOR_KERNEL_ARCH := $(TARGET_ARCH)
EMULATOR_KERNEL_DIST_NAME := kernel-ranchu
EMULATOR_KERNEL_VERSION := 3.18
EMULATOR_KERNEL_FILE := prebuilts/qemu-kernel/$(EMULATOR_KERNEL_ARCH)/$(EMULATOR_KERNEL_VERSION)/kernel-qemu2
else
$(error unsupported arch: $(TARGET_ARCH))
endif # arm
endif # arm64
endif # x86_64
endif # x86

$(INTERNAL_EMULATOR_PACKAGE_TARGET): $(INTERNAL_EMULATOR_PACKAGE_FILES) $(FINAL_INSTALLED_QEMU_SYSTEMIMAGE) $(FINAL_INSTALLED_QEMU_RAMDISKIMAGE) $(FINAL_INSTALLED_QEMU_VENDORIMAGE) $(EMULATOR_KERNEL_FILE)
	@echo "Package: $@"
	$(hide) mkdir -p $(INTERNAL_EMULATOR_PACKAGE_SOURCE)/$(TARGET_CPU_ABI)
	$(hide) $(foreach f,$(INTERNAL_EMULATOR_PACKAGE_FILES), $(ACP) $(f) $(INTERNAL_EMULATOR_PACKAGE_SOURCE)/$(TARGET_CPU_ABI)/$(notdir $(f));)
	$(hide) ($(ACP) $(EMULATOR_KERNEL_FILE) $(INTERNAL_EMULATOR_PACKAGE_SOURCE)/$(TARGET_CPU_ABI)/${EMULATOR_KERNEL_DIST_NAME})
	$(hide) $(ACP) -r $(PRODUCT_OUT)/data $(INTERNAL_EMULATOR_PACKAGE_SOURCE)/$(TARGET_CPU_ABI)
	$(hide) $(SOONG_ZIP) -o $@ -C $(INTERNAL_EMULATOR_PACKAGE_SOURCE) -D $(INTERNAL_EMULATOR_PACKAGE_SOURCE)/$(TARGET_CPU_ABI)

.PHONY: emu_img_zip
emu_img_zip: $(INTERNAL_EMULATOR_PACKAGE_TARGET)

endif
endif

附件提供下载,来自

Adapt emu_img_zip.mk for Android 11 (1661582) · Gerrit Code Review (googlesource.com)

最后得到out/target/product/generic_car_x86_64/sdk-repo-linux-system-images-eng.xxx.zip

到这一步,已经完成了AAOS的镜像包制作了,下面介绍如何将其优雅地导入Android Studio使用

导入Studio

一、创建镜像描述文件sys-imgs.xml(名字随意),这一步很重要,官网的说法有点复杂了

<?xml version='1.0' encoding='utf-8'?>
<sys-img:sdk-sys-img xmlns:sys-img="http://schemas.android.com/sdk/android/repo/sys-img2/01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<license id="android-sdk-license" type="text">bala bala</license>
	<channel id="channel-0">stable</channel>
	<remotePackage path="system-images;android-30;android-automotive;x86_64">
		<type-details xsi:type="sys-img:sysImgDetailsType">
			<api-level>30</api-level>
			<tag>
				<id>android-automotive-playstore</id>
				<display>Automotive with My Build</display>
			</tag>
			<vendor>
				<id>xxx</id>
				<display>My Automotive Build.</display>
			</vendor>
			<abi>x86_64</abi>
		</type-details>
		<revision>
			<major>3</major>
		</revision>
		<display-name>Android Automotive with My System Image</display-name>
		<uses-license ref="android-sdk-license"/>
		<channelRef ref="channel-0"/>
		<archives>
			<archive>
				<complete>
					<size>812734292</size>
					<checksum>e2fe42d741dd7eaaf56ccaba80560f35fd7dc650</checksum>
					<url>file:///C:/Android/build-images/sdk-repo-linux-system-images-eng.xxx.zip</url>
				</complete>
			</archive>
		</archives>
	</remotePackage>
</sys-img:sdk-sys-img>

这里要注意几点:

  • tag下的id字段,如果设置成android-automotive-playstore,在创建AVD时,必须选择Playstore类型的配置
  • archive/complete下
    • size使用刚刚构建镜像的大小,单位字节
    • checksum使用shasum命令计算
    • url使用生成的zip包的路径,可以本地文件也可以http
  • <remotePackage path="system-images;android-30;android-automotive;x86_64">按照实际的API版本、ABI来填写
  • 其他的就可以按照自己的心情随意填写了

二、在Tools>SDK manager>SDK Update Sites中,添加一个自定义站点。

sys-imgs就是之前创建的描述文件,这里使用了本地路径,如果要供多人使用,可以保存到可公开访问的http服务器中

三、Tools>Device manager,新增一个AVD(可以复用官方的配置文件,用来定义屏幕尺寸、内存大小等):

在X86 Images镜像里面,刷新几下,就可以看到自己构建的镜像了。

跟其他镜像一样的下载即可,最后点击Next创建一个AVD,最后Finish即可:

如此,属于你自己的AVD就运行起来了,Enjoy it.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值