基于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
相关推荐
2501_9462309816 小时前
Cordova&OpenHarmony通知中心实现
android·javascript
csj5017 小时前
安卓基础之《(9)—中级控件(3)文本输入》
android
Elastic 中国社区官方博客19 小时前
Elasticsearch:在 X-mas 吃一些更健康的东西
android·大数据·数据库·人工智能·elasticsearch·搜索引擎·全文检索
2501_9462309820 小时前
Cordova&OpenHarmony提醒管理系统实现
android·javascript
shaominjin1231 天前
Jetpack Compose 实践入门:从环境搭建到待办列表实现
android
冬奇Lab1 天前
稳定性性能系列之二——ANR机制深度解析:从触发到上报
android·性能优化·debug
江上清风山间明月1 天前
Android BIND_NOTIFICATION_LISTENER_SERVICE 权限详解
android·notification·service·bind·listener
Lei活在当下1 天前
【日常知识积累】Kotlin let 函数、inline 函数以及 DSL
android·kotlin·编程语言
世界美景1 天前
一种基于 ART 内存特征的 LSPosed/Xposed/分身环境 完美检测方案
android·安全·安卓·xposed
2501_946230981 天前
Cordova&OpenHarmony外观主题设置
android·javascript