Android双屏异显另辟蹊径---minui的移植

本文深入解析了MinUI在Android系统中作为轻量级绘图工具的作用,特别是在实现双屏异显功能方面的应用。通过移植MinUI并结合framebuffer驱动,实现了在不启动主绘图进程的情况下,于副屏展示独立界面,适用于关机充电动画、自动测试程序等场景,有效缩短开机时间和节省电量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

minui介绍

minui是Android自带的一个画图工具,可以绘制一些简单的图形和图像,显示png图片,显示字符串等。

在Android设备中譬如,关机充电动画,自动测试程序,recovery模式界面等都是用minui绘制界面,进行人机交互,完成一些必要的功能。其优点是在不启动Android surfaceflinger等主要绘图进程的情况下,实现基于基本Linux显示框架下的显示功能,起到开机时间短,节约电量等功能。

下面介绍一下通过仿照关机充电应用程序,写的一个小屏显示进程。Android默认支持一个主屏,Android N以后退出双屏异显的接口api,但是这里并不是通过创建两个displaydevice来实现双屏显示而是通过另外启动一个进程,使用minui将第二个屏的显示数据推送到第二个屏上(小屏,也叫副屏)。移植minui的工作就变得不可绕开了。

minui代码分析

从关机充电应用程序那里复制一套minui的代码:

https://i-blog.csdnimg.cn/blog_migrate/47b508f9ebf79967852b1db0d03e6009.png

https://i-blog.csdnimg.cn/blog_migrate/098d04d856d6c406f4d55798e3db15a5.png

minui的画图和显示接口在另外一篇文章中会有介绍:https://blog.youkuaiyun.com/eliot_shao/article/details/78597522 

下面也会有一个实例来应用。

minui移植必要代码分析:

graphics.c

https://i-blog.csdnimg.cn/blog_migrate/c0ab160b49c30baaf67e417d9c2fe2c0.png

minui驱动接口有两个,一个使用adf框架的显示接口,一个是使用framebuffer的显示框架,因为对framebuffer了解比较多,遂使用framebuffer的方式来实现驱动。

graphics_fbdev.c

这里会打开驱动层对应的framebuffer节点。

所以我们下一步是创建一个framebuffer子系统节点和必要的信息。

在驱动层创建一个framebuffer驱动,可以仿照其他显示驱动实例。

framebuffer驱动实现

framebuffer驱动主要内容:

1、

struct fb_info *info;

info = framebuffer_alloc(sizeof(u32) * 256, &dev->dev);

2、

size = PAGE_ALIGN(size);

mem = vmalloc_32(size);

3、info->screen_base = (char __iomem *)videomemory;

    vfb_fix.smem_start = (unsigned long) videomemory;

    vfb_fix.smem_len = videomemorysize;

4、 info->fix = vfb_fix;

    info->flags = FBINFO_FLAG_DEFAULT;

    retval = register_framebuffer(info);

5、

驱动的主要内容包括framebuffer申请,一块连续的虚拟内存的申请,fb_info的填充,注册framebuffer,重写fb_ops的blank函数(SPI驱动这里略过)。

minui应用测试程序及效果

现在minui的驱动部分已经写好了,编译进去执行adb可以看到对应的/dev/graphics/fb0(fb1)的接口,下面写一个简单的minui应用程序测试一下:

显示效果:

为了能正常编译minui应用程序,需要修改android.mk文件。

如下:

总结

至此,minui从应用到显示打通,可以显示自定义界面,和主屏互不干扰,实现双屏异显。但是这种显示只能显示较为简单的界面,或者第二人机交互界面 在一些需要双显示的系统中解决一些重要的问题。

### 在 Taro 框架中引入和使用 `mp-html` 组件 #### 安装依赖包 为了能够在 Taro 项目中使用 `mp-html` 组件,首先需要安装相应的 npm 包。执行以下命令来完成安装: ```bash npm install @minui/mp-html --save ``` #### 修改配置文件 在项目的根目录下找到 `config/index.js` 文件,并按照需求修改配置项以支持自定义组件的注册。 对于希望全局注册的情况,可以在 `frameworkType === 'React' || frameworkType === 'Vue'` 下添加如下代码片段[^1]: ```javascript const config = { // ... mini: { postcss: { pxtransform: { enable: true, config: {}, }, url: { enable: true, config: { limit: 8 * 1024, // 设定转换尺寸上限 }, }, cssModules: { enable: false, // 默认为 false,如需使用 css modules 功能则设置为 true config: { namingPattern: 'module', // 转换模式,取值有 global/module generateScopedName: '[name]__[local]___[hash:base64:5]', }, }, }, usingComponents: { "mp-html": "@minui/mp-html/dist/mixin" // 注册 mp-html 组件 } }, }; ``` 如果仅限于局部页面或组件内使用,则可以直接在对应的 `.json` 配置文件里声明该第三方组件路径即可[^3]。 #### 使用 `mp-html` 组件 当完成了上述准备工作之后,在具体的业务逻辑层面上就可以像操作原生标签一样轻松调用了。下面给出一段简单的例子说明如何渲染 HTML 字符串到视图上。 ##### React 版本 ```jsx import React from 'react'; import './index.less'; export default class Index extends React.Component { render() { const htmlStr = '<p style="color:red">这是一段红色的文字</p>'; return ( <View className='index'> <MpHtml content={htmlStr} /> </View> ); } } ``` ##### Vue 版本 ```vue <template> <view class="container"> <mp-html :content="htmlContent"></mp-html> </view> </template> <script> export default { data () { return { htmlContent: `<p style="color:green;">这段文字会显示成绿色。</p>` }; } }; </script> ``` 注意:由于不同平台间可能存在样式解析差异等问题,因此建议尽可能简化传入的内容结构复杂度;另外还需留意部分 CSS 属性可能不会被完全兼容处理[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值