基于AOSP11创建一个能用emulator启动的android tv产品

背景: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
相关推荐
Kapaseker14 小时前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
黄林晴15 小时前
Android17 为什么重写 MessageQueue
android
阿巴斯甜1 天前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker2 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95272 天前
Andorid Google 登录接入文档
android
黄林晴2 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab2 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android