信创系统问题解决笔记

news/2024/11/19 21:31:25/文章来源:https://www.cnblogs.com/cherishui/p/18347173

本文记述解决信创系统显示问题过程经历,描述遇到的各种问题以及解决方法。

问题描述

测试反馈,在信创系统上,部分界面字体显示异常,表现为内容越界、文字区域显示为小空格,如下图所示:

image.png

初步分析是字体原因,具体情况需要更进一步分析。

问题复现

测试团队的信创测试环境有UOSKylin两个系统,为了不干扰测试团队的测试,选择在本地虚拟机上搭建相同信创环境。

  1. 安装信创系统
    安装UOS系统很顺利,安装Kylin遇到问题。载入镜像之后,虚拟机一直停留在光标闪烁界面,无法进入后续安装流程。经过查阅资料,猜测可能是Vmware版本太低,本地Vmware是版本是12.0.2,准备升级虚拟机

  2. 安装新版虚拟机之前,需要删除旧版本。通过控制版本删除旧版本失败,提示需要什么msi才能卸载,原始安装包早就删掉,无法通过控制面板删除,无奈之下,只好手动删除Vmware安装目录加清理注册表。

  3. 因为本机是Win7,支持Win7Vmware最高版本是 VMware-workstation-full-15.5.6-16341506.exe,于是哼哧哼哧去下载,在安装过程中,提示需要 tools-linux.msi 文件,这就很奇怪,在网上找了半天,下载了多个版本的vmware-tools在里面都没找到 tools-linux.msi ,为什么安装时还要依赖其他文件呢?又在网上搜索解决方案,最后通过下载Windows官方卸载工具 MicrosoftProgram_Install_and_Uninstall.meta,把涉及到Vmware的组件都卸载,然后清理注册表,重启电脑后再次安装新版Vmware,终于安装成功,Kylin系统也顺利安装。

  4. 启动程序。因为信创环境是基于Linux开发的,exe格式的不能直接运行。系统自带的wine是64位,它无法启动32位程序。要么编译64位程序,要么运行32位的wine。

    • 尝试编译64位程序。发现相关依赖的组件不支持64位编译,放弃
    • 尝试运行32位wine。在网上搜索一圈,编译32位的wine,安装流程来走,遇到各种各样的问题,最终放弃。
  5. 回想起测试人员是运行原生包来测试,而我这边是通过wine启动运行,这两者是不是存在区别呢?通过测试对比发现,果然存在区别,同样的操作,在原生包启动和通过wine启动,表现不一样。

    • 转换思路,要么将开发环境的exe打包成新创环境的格式,要么通过第三方启动器运行。
      方法1: 自己打包。咨询了运维同事,将程序打包成deb需要知道各种依赖的情况,较为复杂,不走这条路
      方法2:通过第三方运行期运行。经过调研得知,在UOS系统中,可通过应用商店下载 wine运行器,运行界面如下图:

    image.png

    Kylin系统上,可通过 CrossOver(功能和wine类似)运行,运行界面如下图:

    image.png

    万事俱备,只欠东风。

预备知识

  1. Windows字体基础概念以及绘制方法

  2. GDI+在绘制文字时,遇到不支持的字符会如何处理? GDI+DrawString包含字体回滚机制,当所选字体无法支持显示字符时,会选择其他系统字体来显示,当没有font fallback 发生时,会显示空白方框。

  3. Wine介绍,它将Windows API调用动态翻译成POSIX调用。这是Wine使用手册,Wine分为32位和64位,32位只能启动32位程序,64位只能启动64位程序。还有一种支持WoW64机制Wine,运行同时运行32位和64位程序,具体可参考wine实用经验教程

  4. 通过wine运行器启动和 wine ./xxx.exe 启动,两者展示效果不同。通过对比发现是启动Wine的命令行有区别。

    • 显示正常的 WINEPREFIX=~/xx wine xx.exe
    • 显示不正常的 wine xx.exe
      经过搜索和验证,发现是不同容器中的字体不同导致的。
  5. wine命令行启动参数介绍

    • WINEARCH=winxx,指定Windows架构,可设置为Win32或者Win64.
    • WINEPREFIX=路径 指定程序运行容器环境,wine使用虚拟C驱动器,默认路径为 ~/.wine,程序启动后,会在 WINEPREFIX 路径下创建 drive_c/ 等文件夹和文件。要安装一个windows程序,一般在设置好 WINEPREFIXWINARCH 后,再运行程序。
  6. winetricks方便用户配置wine环境,可安装基础DLL、运行库之类的。通过 WINEPREFIX=路径 winecfg 来配置特定路径的容器。一般来说,为每个windows程序建立独立容器,这样各类兼容包、字体和调用的dll都不会相互影响,移植和删除更灵活。

解决尝试

考虑显示异常可能是字体问题后,有如下解决思路。
思路一:当遇到字体不可用时,在本机找另一个可用的字体
思路二:手动安装字体

思路一细化流程:
1. 找出本机当前安装的所有字体
2. 用每种字体都输出相同信息,查看是否显示异常。
3. 找到判断字体显示异常的依据,并将显示正常的字体保存起来。
4. 使用配置字体时,如果发现字体不可用,就从3)种的字体集合中取1个。

结论1:相同内容,会因为输出字体的不同,显示宽度和高度有所区别。
结论2:枚举得到的本机的所有字体,也存在部分字体显示不正常情况
结论3:当所选字体无法显示特定字符时,不同字体表现不一样。有的表现为输出空白小方块,有的显示乱码,还有的中文输出空白小方块,数字正确显示。
结论4:通过对比显示正常和不正常的字体信息,没找到区分字体显示正确与否的依据。最初找到字体的lfCharSet属性,相关定义如下:

image.png

显示正确的值为0,显示错误的值为2。这个区别在Windows系统是可行的,但在信创系统上不行。

尝试通过函数 GetFontLanguageInfo 获得字体信息,用其返回值来区分,测试结果让人失望。

此路不通。

思路二细化流程:
1. 通过wine命令行启动程序,安装字体很麻烦。因此,选择第三方运行器启动。
2. 在本地构建带调试信息的Release版本程序,通过 beyongcompare文件夹同步同步到信创共享目录,因为共享目录读写权限的问题,无法新建文件,需要再从信创共享目录拷贝到信创本地目录,可通过 rsync 或者 beyongcompare文件夹同步实现。
3. 在启动之前,通过第三方运行器安装字体,经过对比验证,发现安装字体的实质就是将下载的字体文件拷贝到到运行容器C盘的Windows\Fonts目录中。

最终,字体显示问题,通过安装缺失字体的方式解决。

小结

此问题花费了将近1个星期,在本地将信创验证环境搭建好,为后续相关问题的解决打下基础,在此小结。

  • 基础环境搭建
    • Win7系统最高可安装 VMware 15.5.6.如果是Win10Win11,可以安装更高版本的 VMware
    • 信创系统安装。安装UOS家庭版,安装Kylin社区版,不要乱升级内核和系统,够用就行。
  • 调试环境搭建
    • 待调试程序构建为Release版本,增加调试信息
    • 安装samba服务,以便从window访问到信创共享目录
    • 使用BeyondCompare的文件夹同步功能或者 rsync的增量拷贝功能同步程序
    • UOS系统使用wine启动器Kylin系统使用CrossOver,不建议从源码编译32位的wine,太繁琐且很难成功。
    • 字体问题,从第三方启动器下载字体,或者从本地Windows系统的 Windows/Fonts 目录中拷贝所有字体
  • 调试手段
    • 打印日志。在网络共享路径,会因权限问题打印失败,因此需要同步到信创本地再打印。为提高效率,可屏蔽不相关日志输出,给日志增加关键字,便于后续定位分析。
    • 弹框提示。在关键路径上,可用弹框提示的方式来指示程序运行路径和状态信息。
    • 系统配置文件要调整为对应环境的配置,不能用windows的环境配置跑在信创环境上。这一点坑了笔者很多时间。介绍下是如何区分不同系统的,方法很简单,在本地增加OSVersion配置项,发布打包时,Windows系统中填 Windows,UOS系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/779281.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件包含的skill

关于文件包含 🚩php7 segment fault特性原理:php代码中使用php://filter的strip_tags过滤器,可以让php执行的时候直接出现Segment Fault,这样php的垃圾回收机制就不会继续执行,导致POST的文件会保存在系统的缓存目录下不会被删除,不像phpinfo上传的文件很快就会被删除,…

fiddler - 对模拟器app抓包配置

1.fiddler部分 tools》options 中, 这几个配置勾选跟我的一致,端口使用8888然后导出证书 会导出到桌面 然后pc授信证书 然后重启fiddler2.模拟器部分 将证书拉入模拟器,然后点击证书安装,输入的名称可以随便写 然后打开wlan,对wifi的修改代理为手动 【模拟器有些是长按,…

OSGI

OSGI 基础概述 概述:OSGI是Open Services Gateway initiative的缩写,叫做开放服务网关协议,通常可能指OSGi联盟、OSGi标准或者OSGi框架。 OSGI:OSGI联盟现在将OSGI定义为一种技术,该技术是指一系列用于定义Java动态化组件系统的标准。这些标准通过为大型分布式系统以及嵌入…

5-7折优惠电影票API接口,微客云提供电影票api

正规对接途径和考虑因素 API供应商:一些大型的在线票务平台 :如猫眼、淘票票等,如果能与他们达成合作,可能获得稳定且正规的接口,但通常门槛较高(主要面向一些大型的、正规的、有一定规模和背景的商业伙伴,且有严格的审核流程和商务合作流程等)。 影院院线自己 :如果是…

直接内存作用

1.直接内存不由JVM内存管理,是来源于java NIO向操作系统申请而来的。 当把磁盘文件复制到内存中 JVM通过NIO直接访问数据。(起到了优化系统性能,避免了复制到java堆空间) 每天坚持,终会抵达!

不能在此路径中使用此配置节,如果在父级别上锁定了该节,便会出现这种情况的解决办法

原文链接:https://www.pageadmin.net/help/96.cshtml 问题描述:打开网站一直提示“不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny")” 具体如下图:问题分析:出现这个错误是因为 IIS 7 采…

删库了不用跑路!binlog恢复数据实操

各位道友大家好呀! 想必道友们或多或少都听说过MySQL的binlog的作用,它记录了数据库整个的生命周期,可用于恢复数据或者从库同步数据。 那么如果发生了数据库误删,具体该怎样恢复数据呢? 下面就以一个例子来给道友们演示一下,让我们开始吧!do it! 数据备份 首先,数据库…

2024美团官方霸王餐API接口

在数字化日益深入的今天,餐饮行业正经历着一场前所未有的变革。作为行业内的领军企业,美团不断推出创新服务以优化用户体验,提升商家运营效率。其中,2024年美团官方推出的霸王餐API接口便是这一趋势下的重要产物。本文将从接口的背景、功能、优势、应用场景以及未来展望等方…

聊数据:你需要脱口而出的105个必备词汇!

1.数据:是指任何以电子或者其他方式对信息的记录。(《中华人民共和国数据安全法》第三条)2.数据处理:包括数据的收集、存储、使用、加工、传输、提供、公开等。(《(中华人民共和国数据安全法》第三条)3.数据安全:是指通过采取必要措施,确保数据处于有效保护和合法利用…

企业业务前端监控实践

监控的背景和意义 在现代前端开发中,接入监控系统是一个很重要的环节,它可以帮助开发者、产品、运营了解应用的性能表现,用户的实际体验以及潜在的错误和问题,从而进一步优化用户体验,帮助产品升级迭代。 背景 •应用复杂性增加:随着单页应用(SPA)和渐进式网页应用(PW…

不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault=Deny),或者是通过包含 oveoverrideMode....

原文链接:https://www.cnblogs.com/wwssgg/p/17984105 今天运行项目的时候出现了这个错误.... 查了一下解决的方法。 具体方案如下:1、先确认安装IIS的时候有没有装Asp.Net,如果没安装的话,安装上即可。(XTHS:采用这步,就可以了!) 2、IIS 采用了更安全的 web.config …

最佳实践:解读GaussDB(DWS) 统计信息自动收集方案

摘要:现在商用优化器大多都是基于统计信息进行查询代价评估,因此统计信息是否实时且准确对查询影响很大,特别是分布式数据库场景。本文详细介绍GaussDB(DWS)如何实现了一种轻量、实时、准确的统计信息自动收集方案。 本文分享自华为云社区《【最佳实践】GaussDB(DWS) 统计信…