背景:android11源码中,emulator启动的模拟器不支持android tv,所以想着自己创建一个之吃emulator的android tv产品,下面就是最小创建步骤:
1.在源码的device目录下创建文件夹custom,在其下新建文件夹,以产品名称命名,如tv2206,之后在tv2206下创建如下五个文件
bash
Android.mk
AndroidProducts.mk
BoardConfig.mk
device.mk
tv2206.mk
2.五个文件的内容参照device/google/atv/products/aosp_tv_x86.mk文件所配置
bash
# Android.mk
LOCAL_PATH := $(call my-dir)
include $(call all-makefiles-under,$(LOCAL_PATH))
bash
# AndroidProducts.mk
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/tv2206.mk
COMMON_LUNCH_CHOICES := \
tv2206-eng \
tv2206-userdebug \
tv2206-user
bash
# BoardConfig.mk(拷贝于build/make/target/board/generic_x86/BoardConfig.mk)
TARGET_CPU_ABI := x86
TARGET_ARCH := x86
TARGET_ARCH_VARIANT := x86
TARGET_PRELINK_MODULE := false
include build/make/target/board/BoardConfigGsiCommon.mk
include build/make/target/board/BoardConfigEmuCommon.mk
# Resize to 4G to accomodate ASAN and CTS
BOARD_USERDATAIMAGE_PARTITION_SIZE := 4294967296
BOARD_SEPOLICY_DIRS += device/generic/goldfish/sepolicy/x86
# Wifi.
BOARD_WLAN_DEVICE := emulator
BOARD_HOSTAPD_DRIVER := NL80211
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_simulated
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_simulated
WPA_SUPPLICANT_VERSION := VER_0_8_X
WIFI_DRIVER_FW_PATH_PARAM := "/dev/null"
WIFI_DRIVER_FW_PATH_STA := "/dev/null"
WIFI_DRIVER_FW_PATH_AP := "/dev/null"
bash
# device.mk(拷贝于build/make/target/board/generic_x86/device.mk)
PRODUCT_SOONG_NAMESPACES += device/generic/goldfish # for libwifi-hal-emu
PRODUCT_SOONG_NAMESPACES += device/generic/goldfish-opengl # for goldfish deps.
ifdef NET_ETH0_STARTONBOOT
PRODUCT_PROPERTY_OVERRIDES += net.eth0.startonboot=1
endif
# Ensure we package the BIOS files too.
PRODUCT_HOST_PACKAGES += \
bios.bin \
vgabios-cirrus.bin \
bash
# tv2206.mk(参照device/google/atv/products/aosp_tv_x86.mk)
PRODUCT_USE_DYNAMIC_PARTITIONS := true
$(call inherit-product, device/google/atv/products/atv_mainline_system.mk)
# Enable mainline checking for excat this product name
ifeq (tv2206,$(TARGET_PRODUCT))
PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed
endif
#
# All components inherited here go to system_ext image
#
$(call inherit-product, device/google/atv/products/atv_system_ext.mk)
# Packages required for ATV GSI
PRODUCT_PACKAGES += \
FrameworkPackageStubs \
TvProvision
#
# All components inherited here go to product image
#
$(call inherit-product, device/google/atv/products/atv_product.mk)
# Packages required for ATV GSI
PRODUCT_PACKAGES += \
LatinIMEGoogleTvPrebuilt \
TvSampleLeanbackLauncher
#
# All components inherited here go to vendor image
#
$(call inherit-product, device/google/atv/products/atv_emulator_vendor.mk)
$(call inherit-product-if-exists, device/generic/goldfish/x86-vendor.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/board/generic_x86/device.mk)
ifeq (tv2206,$(TARGET_PRODUCT))
$(call inherit-product, $(SRC_TARGET_DIR)/product/gsi_release.mk)
endif
$(call inherit-product, device/custom/tv2206/device.mk)
PRODUCT_NAME := tv2206
PRODUCT_DEVICE := tv2206
PRODUCT_BRAND := Android
PRODUCT_MODEL := tv2206
3.执行编译
bash
source build/envsetup.sh
lunch tv2206-eng
make
4.启动模拟器
bash
emulator -verbose -writable-system -selinux permissive -logcat '*:D' -show-kernel -shell
5.集成内置应用
在tv2206目录下创建文件夹apps,在里面创建文件Android.mk,内容如下:
bash
LOCAL_PATH := $(call my-dir)
include $(call all-makefiles-under,$(LOCAL_PATH))
这之后就可以在apps下面创建要集成的app目录了,比如我继承了谷歌服务框架,那么就创建文件夹 GoogleServiceFramework,在下面就可以写一个Android.mk,来定义要编译的应用模块,然后将apk放在此目录,在tv2206.mk中添加PRODUCT_PACKAGES += GoogleServiceFramework,大功告成。
bash
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := GoogleServiceFramework
LOCAL_PACKAGE_NAME := com.google.android.gsf
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_PRIVILEGED_MODULE := true
LOCAL_MODULE_TAGS := optional
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_SRC_FILES := ${LOCAL_MODULE}.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
include $(BUILD_PREBUILT)
6.若集成的系统应用有申请特殊权限,开机运行会报错,可以先禁用特权应用权限检查
修改文件device/generic/goldfish/vendor.mk
bash
#PRODUCT_PROPERTY_OVERRIDES += ro.control_privapp_permissions=enforce
PRODUCT_PROPERTY_OVERRIDES += ro.control_privapp_permissions=disable