当前位置: 首页 > news >正文

实战多屏Wallpaper壁纸显示及出现黑屏问题bug分析-学员作业

背景:

在大家看了上一篇google官方对于多屏壁纸这块的介绍后

安卓Wallpaper壁纸部分对多屏的支持-Google官方文档介绍

可能还是对于壁纸支持多屏这块没有相关的实战性的认知,所以本文就开始带大家来进行部分解读和实战。

壁纸多屏显示原理文档解读:

原文:
开发者可以通过在 WallpaperInfo XML 定义中提供 android:supportsMultipleDisplays=“true” 来声明对壁纸功能的支持。壁纸开发者还可以使用 WallpaperService.Engine#getDisplayContext() 中的显示上下文来加载素材资源。
框架会为每个屏幕创建一个 WallpaperService.Engine 实例,因此每个引擎都有自己的 surface 和显示上下文。开发者需要确保每个引擎都能够根据 VSYNC 以不同的帧频独立绘制。

上面这段说明可以得出以下几点:
1、在自定义动态壁纸时候,是有单独的xml可以来配置壁纸相关属性,可以通过
android:supportsMultipleDisplays=“true” 这个属性来告诉系统当前壁纸是支持多屏显示的

那么自定义壁纸又是如何识别当前运行于哪个屏幕?然后针对不同的屏幕绘制不同的资源和内容呢?

2、因为自定义壁纸本身就是继承WallpaperService重写一个壁纸服务,每个服务可以通过WallpaperService.Engine#getDisplayContext() 方法获取到自己在不同的屏幕,简单说就是WallpaperService有自己context,可以通过context获取到自己的Display,也就是多个屏幕会有多个WallpaperService而且Service中可以识别自己对应的display,这样就可以差异识别。

比如看看自定义壁纸中绘制可以绘制自己的DisplayID来作为区分
在这里插入图片描述
那么真的就像官方文档中说的那么顺利么?

作业准备:

源码环境:aosp15测试,预计aosp14,aosp13应该也一样可以

第一步

首先得准备一个自定义的动态壁纸,具体大家可以直接源码中寻找demo拿来用也可以,源码位置:

动态壁纸参考案例1

aosp源码路径

development/samples/CubeLiveWallpaper

动态壁纸参考案例2

aosp源码路径

development/samples/MultiDisplay

第二步

拿到demo后大家记得要按照官方要求进行配置:
按照上面google官方文档说的
壁纸支持多屏显示最核心的步骤就是在如下xml中加上android:supportsMultipleDisplays="true"的属性

<?xml version="1.0" encoding="UTF-8"?><wallpaperxmlns:android="http://schemas.android.com/apk/res/android"android:description="@string/wallpaper_description"android:supportsMultipleDisplays="true"/>

ps:如果不设置android:supportsMultipleDisplays=“true”,那么在多屏情况下设置壁纸会如何呢?
在这里插入图片描述主屏幕 显示正常自定义壁纸,副屏慕显示原生静态壁纸

发现结果就是主屏幕显示动态壁纸,但是副屏幕显示静态壁纸。

AndroidManifest.xml中声明这个Service是属于WallpaperService的

<serviceandroid:name=".wallpaper.SampleWallpaper"android:permission="android.permission.BIND_WALLPAPER"android:exported="true"><intent-filter><action android:name="android.service.wallpaper.WallpaperService"></action></intent-filter><meta-dataandroid:name="android.service.wallpaper"android:resource="@xml/wallpaper"></meta-data>
</service>

上面代码准备好以后既可以开始编译,安装运行验证效果了。

第三步

编译好自定义壁纸apk,然后进行adb install这个apk

mmm development/samples/MultiDisplay/adb install -r out/target/product/emu64x/system/app/MultiDisplay/MultiDisplay.apk

第四步
桌面设置自定义壁纸操作部分:
桌面长按点击出现壁纸相关设置按钮
在这里插入图片描述
点击后进行选着壁纸画面,这里最好建立多安几个自定义壁纸

在这里插入图片描述

选择我们自己写壁纸服务进行设置成壁纸
在这里插入图片描述

第四步

查看设置的壁纸运行现象,运行设置动态壁纸后出现如下现象:

在这里插入图片描述
明显发现主屏幕正常显示自定义壁纸,但是副屏显示为黑屏。那么到底为啥黑屏呢?这部分就是留给各位学员朋友的课程作业啦。

作业要求:

1、剖析出android:supportsMultipleDisplays="true"的原理

2、根据上面作业步骤,复现出设置自定义壁纸后,主屏正常副屏黑屏现象

3、分析黑屏现象的初步原因

4、深入追踪分析出黑屏的根本原因,并考虑相关的修复方案

5、尽量修复方案不要考虑修改系统framework框架代码,可以自己自定义壁纸的app来解决

更多framework实战开发干货,请关注下面“千里马学框架”

http://www.xdnf.cn/news/1290817.html

相关文章:

  • 从0开始配置conda环境并在PyCharm中使用
  • 基于Apache Flink的实时数据处理架构设计与高可用性实战经验分享
  • Flink中的窗口
  • 解决程序连不上RabbitMQ:Attempting to connect to/access to vhost虚拟主机挂了的排错与恢复
  • Windows也能用!Claude Code硬核指南
  • 【报错解决】Conda - Downloaded bytes did not match Content-Length
  • Java零基础笔记16(Java编程核心:存储读写数据方案—File文件操作、IO流、IO框架)
  • 搜索引擎核心机制解析
  • 5.0.9.1 C# wpf通过WindowsFormsHost嵌入windows media player(AxInterop.WMPLib)
  • C# WPF本地Deepseek部署
  • 集成电路学习:什么是CV计算机视觉
  • IPA1299至为芯替代TI ADS1299的脑机接口芯片
  • 网络安全合规6--服务器安全检测和防御技术
  • 高级IO(五种IO模型介绍)
  • Spring、Spring MVC、Spring Boot与Spring Cloud的扩展点全面梳理
  • Spring Boot 集成 机器人指令中枢ROS2工业机械臂控制网关
  • 从“存得对”到“存得准”:MySQL 数据类型与约束全景指南
  • 算法题打卡力扣第11题:盛最多水的容器(mid)
  • 音视频处理新纪元:12款AI模型的语音转录和视频理解能力横评
  • 洛谷 P2607 [ZJOI2008] 骑士-提高+/省选-
  • 从钢板内部应力视角,重新认识护栏板矫平机
  • 猫头虎AI分享| 智谱开源了为 RL scaling 设计的 LLM post‑training 框架用于GLM-4.5强化学习训练:slime
  • 深入解析C语言嵌套结构体的内存管理与操作实践
  • 基于CNN与Transformer的无人机应急救援网络异常流量检测
  • 在前端js中使用jsPDF或react-to-pdf生成pdf文件时,不使用默认下载,而是存储到服务器
  • SQL详细语法教程(一)--数据定义语言(DDL)
  • Android SurfaceView TextureView
  • 【Qt开发】常用控件(三) -> geometry
  • kernel pwn 入门(四) ret2dir详细
  • 大模型推理框架vLLM 中的Prompt缓存实现原理