基于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
相关推荐
suki_lynn3 小时前
Facebook 引流脚本:功能、风险与合规使用指南
android·云计算
帅锅锅0074 小时前
Android 源码学习之init进程
android·架构·操作系统
聆风吟º4 小时前
【Spring Boot 报错已解决】Spring Boot开发避坑指南:Hibernate实体类主键配置详解与异常修复
android·spring boot·hibernate
APP出海5 小时前
Google政策大更新:涉及金融(个人贷款),社交约会与游戏(未成年人相关),健康等所有类别App
android·游戏·金融·产品运营·产品经理
全栈软件开发6 小时前
音频在线剪切助手网页版源码
android·音视频
2501_915909066 小时前
Flutter 应用怎么加固,多工具组合的工程化实战(Flutter 加固/Dart 混淆/IPA 成品加固/Ipa Guard + CI)
android·flutter·ios·ci/cd·小程序·uni-app·iphone
qq_717410016 小时前
添加快速点击设置-关于设备-版本号弹出仿android13彩蛋
android
KdanMin6 小时前
Android MediaCodec 硬编解码实战:从Camera预览到H264流与回环渲染
android·开发语言