基于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
相关推荐
啃火龙果的兔子29 分钟前
android studio运行下载gradle特别慢怎么处理
android·ide·android studio
qq_2965446539 分钟前
安卓手机投屏电脑端教程,手机投屏教程,可以手机和电脑互传文件。电脑管理手机文件和APP等操作
android·智能手机·电脑
我的offer在哪里1 小时前
MySQL 高频细节问题(覆盖性能、存储、运维、故障排查,补充前文未深入的核心细节)
android·运维·mysql
qq_717410011 小时前
删除设置-声音-有来电时响铃并振动,手机铃声
android
dazhong20121 小时前
Android Studio 安装之历史版本下载问题解决
android·ide·android studio
灰度少爷1 小时前
安卓手机投屏软件——QtScrcpy!
android·智能手机·安卓手机投屏软件
2501_915918411 小时前
iOS CPU 使用率深度分析,多工具协同定位高占用瓶颈的工程化方法
android·ios·小程序·https·uni-app·iphone·webview
啃火龙果的兔子2 小时前
android studio first run : unable to sccess android sdk add-on list
android·ide·android studio
2501_915106322 小时前
如何防止资源文件被替换?一套针对 iOS App 的多层资源安全方案
android·安全·ios·小程序·uni-app·iphone·webview
元气小嘉2 小时前
小程序开发中ios和安卓问题
android·ios