《信息技术应用创新工程建设规范第11部分-迁移适配通用技术要求(DB43-T 2258-2021).pdf》由会员分享,可在线阅读,更多相关《信息技术应用创新工程建设规范第11部分-迁移适配通用技术要求(DB43-T 2258-2021).pdf(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、信息技术应用创新工程建设规范第11部分:迁移适配通用技术要求Engineering specification for the Application Innovation Project of Information TechnologyPart 11:General technical requirements of migration and adaptation 43湖南省地方标准ICSCCS 01.140.20L 70DB43/T 22582021 发 布湖南省市场监督管理局2021-12发布-292022-03实施-29DB43/T 22582021 I 目 次 前言 引言 1 范
2、围 1 2 规范性引用文件 1 3 术语和定义 1 4 缩略语 1 5 应用软件迁移适配要求 2 5.1 迁移适配评估 2 5.2 编译型应用软件迁移适配实施要求 2 5.3 解释型应用软件迁移适配实施要求 3 5.4 存储位置要求 3 5.5 权限要求 3 5.6 安装脚本要求 3 5.7 兼容性要求 4 5.8 功能验证 4 5.9 性能优化 4 6 编译型内核驱动软件迁移适配要求 5 6.1 迁移适配评估 5 6.2 迁移适配实施要求 5 6.3 功能验证 6 6.4 性能优化 6 附录 A(规范性)Qt 开发环境迁移 7 附录 B(规范性)Gtk 开发环境迁移 11 附录 C(规范性)
3、Python 开发环境迁移 14 附录 D(资料性)驱动软件迁移适配的软件分析方法 15 DB43/T 22582021 II DB43/T 22582021 III 前 言 本文件按照 GB/T 1.12020标准化工作导则 第 1 部分:标准化文件的结构和起草规则的规定起草。请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别专利的责任。信息技术应用创新工程建设规范分为以下几个部分:第 1 部分:台式微型计算机通用技术要求;第 2 部分:便携式微型计算机通用技术要求;第 3 部分:服务器通用技术要求;第 4 部分:操作系统通用技术要求;第 5 部分:操作系统硬件兼容性通用技术要求
4、;第 6 部分:操作系统软件兼容性通用技术要求;第 7 部分:办公套件通用技术要求;第 8 部分:电子公文通用技术要求;第 9 部分:驱动开发通用技术要求;第 10 部分:应用开发通用技术要求;第 11 部分:迁移适配通用技术要求;第 12 部分:国产化信息系统建设质量管理规范;第 13 部分:国产化信息系统运行维护规范;第 14 部分:国产化信息系统建设验收规范;第 15 部分:云计算通用技术要求。本部分为第 11 部分。本部分由湖南省国家密码管理局提出。本部分由湖南省工业和信息化厅归口。本部分起草单位:银河麒麟软件(长沙)有限公司、中国人民解放军国防科技大学、飞腾信息技术有限公司、湖南湘江
5、鲲鹏信息科技有限责任公司、湖南中软信息系统有限公司、湖南长城科技信息有限公司、湖南国科微电子股份有限公司、长沙景嘉微电子股份有限公司、珠海金山办公软件有限公司、鹏城实验室。本部分主要起草人:魏立峰、吴庆波、张铎、孙立明、彭欢、蒋林轩、战茅、王晓川、朱浩、王静、谌志华、蔡威、张月、韩光、吕超、董昱、曹泽文、孙洪桥、付志鹏。DB43/T 22582021 IV DB43/T 22582021 V 引 言 湖南省为深入贯彻国家网络强国战略,全面落实中央有关文件精神,部署开展湖南省信息技术应用创新工程建设,保障全省各级党政机关关键信息基础设施信息安全和信息系统安全可靠运行。针对自主可控产品体系初具规模
6、,但相关产品和工程实施标准规范还很缺乏的现状,为了规范工程建设,加速工程进度,扩大建设结果,同时有力提升自主可控产业发展水平,确保信息安全,由湖南省国家密码管理局作为业务主管单位、湖南省工业和信息化厅作为技术归口单位,由中国人民解放军国防科技大学、中国电子信息产业集团有限公司等单位与湖南省合作制定了 信息技术应用创新工程建设规范 地方标准。信息技术应用创新工程建设规范主要由自主可控核心产品、典型应用、工程管理等方面的规范组成,重点解决应用创新工程建设当中产品选型、应用开发、工程实施等基础环节的实际问题,可为应用创新工程的用户使用单位、集成建设单位和相关产品研制单位,在产品和应用规范化、软硬件兼
7、容适配、工程实施标准等方面提供一般性指引。信息技术应用创新工程建设规范 未来将根据自主可控产业和应用创新工程的发展变化进行相应的必要调整和补充。DB43/T 22582021 VI DB43/T 22582021 1 信息技术应用创新工程建设规范 第 11 部分:迁移适配通用技术要求 1 范围 本文件规定了应用软件程序和设备驱动程序在不同操作系统之间迁移适配的技术要求,应用软件迁移适配要求包括开发环境迁移适配、代码重编译、运行环境迁移适配、存储位置、权限、安装脚本和兼容性要求,设备驱动程序迁移适配包括代码设计、代码适配、代码重编译、打包、内核兼容性等要求,并提出迁移后的功能验证和性能优化要求。
8、本文件适用于指导信息技术应用创新工程建设中应用软件和设备驱动程序在不同操作系统上的迁移适配工作,也为应用软件和设备驱动程序迁移后的软件测试提供指导。2 规范性引用文件 下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款。其中,注日期的引用文件,仅该日期对应的版本适用于本文件;不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。DB43/T 1777.62020 信息技术应用创新工程建设规范 第 6 部分:操作系统软件兼容性通用技术要求 DB43/T 22602021 信息技术应用创新工程建设规范第 9 部分:驱动开发通用技术要求 DB43/T 22592021 信息技术
9、应用创新工程建设规范 第 10 部分:应用开发通用技术要求 3 术语和定义 下列术语和定义适用于本文件。3.1 动态链接库 dynamic link library 是一种不可执行的二进制程序文件,它允许程序共享执行特殊任务所必需的代码和其他资源。3.2 驱动程序 driver 驱动程序是硬件厂商根据操作系统编写的配置文件,操作系统通过驱动来与控制设备和进行通信。3.3 版本魔术信息 vermagic information 版本魔术信息是一个描述内核版本号以及基础内核配置的字符串。4 缩略语 下列缩略语适用于本文件:DB43/T 22582021 2 CRC:循环冗余校验(Cyclic Re
10、dundancy Check)DKMS:动态内核模块支持(Dynamic Kernel Module Support)GDK:图形开发工具包(Graphics Development Kit)GPU:图形处理器(Graphics Processing Unit)GTK:跨多种平台的图形工具包(GIMP Toolkit)5 应用软件迁移适配要求 5.1 迁移适配评估 在迁移适配工作开始之前,应按以下要求进行迁移适配评估:a)迁移软件源码分析:分析迁移软件的主要功能和模块组成,建立功能模块与功能实现的映射关系;b)基础运行环境分析:分析迁移软件所在源平台和目标平台的开发环境、运行环境、开发规范以及
11、处理器指令集的差异,评估这些差异对迁移软件代码的影响;c)第三方软件栈分析:分析目标平台上的第三方软件栈(包括数据库、中间件、办公套件、浏览器等)数据、二次开发接口、操作习惯等是否兼容,确定可以重用、需要迁移改造的功能模块和代码段范围,确定迁移适配的技术路线;d)迁移适配工作量评估:根据迁移适配可能的技术路线,从技术方案和管理实施等角度评估不同组合的迁移工作量、复杂度和成本;e)迁移环境准备:主要包括硬件设备、操作系统以及调试工具等的准备和部署。5.2 编译型应用软件迁移适配实施要求 5.2.1 开发环境迁移适配要求 a)应分析应用软件的架构和实现技术、与操作系统平台的耦合度和依赖度,确定迁移
12、所涉及的各类系统机制;b)将与系统调用无关的部分代码进行剥离,在国产操作系统环境下重建工程,重用代码;c)根据软件分析中运行环境、开发环境和接口的差异进行代码修改,实现与原系统相同的软件功能,例如 Qt 项目迁移,当前主要从 Qt4 迁移到 Qt5,具体迁移参照表应符合附录 A 的规定;Gtk 迁移主要从 gtk2 迁移到 gtk3,具体内容应符合附录 B 的规定。5.2.2 代码重编译要求 代码重新编译时,应对编译脚本和编译选项进行移植,将编译脚本和编译选项更改为目标体系结构支持的编译脚本和编译选项。生成软件包时,命名和打包规范应按照 DB43/T 1777.62020 中 6.5 节要求执
13、行。5.2.3 运行环境迁移适配要求 应用软件运行前应确认所依赖的第三方运行库是否存在,如缺少对应的动态链接库,应针对不同的操作系统查找和安装动态链接库对应的软件包。在采用 Deb 格式软件包的操作系统中,可通过执行“apt-file search 动态库名”的方式来查找指定的动态链接库所对应的软件包;在采用 RPM 格式软件包的操作系统中,可通过“yum whatprovides 动态库名”的方式来查找指定的动态链接库所对应的软件包。找到对应的动态库包之后,可通过操作系统DB43/T 22582021 3 厂商提供的软件源进行下载和安装。如已安装动态链接库软件包但是链接地址错误,可以通过将动
14、态链接库所在的目录路径添加到LD_LIBRARY_PATH 环境变量或者系统指定的链接库配置文件/etc/ld.so.conf 的方式进行修复。5.3 解释型应用软件迁移适配实施要求 解释型应用软件可在操作系统环境下直接运行,具有较好的跨平台可移植性,大部分软件无需修改源代码,迁移工作量相对较小。但针对以下情况,应进行少量修改并重新编译:a)当目标平台和移植前的环境不一致时,则需根据版本差异,修改源代码中库和接口的调用相关部分,例如 Python 应用程序,目前主要从 python2 迁移到 python3,迁移后应注意语法变化和迁移时宜使用的工具,应符合附件 C 的要求;b)如果通过 JNI
15、 或其他形式调用的库是采用 C/C+等编译型语言开发,则被调用库的代码需按照 5.2 节重新编译或修改;c)对软件运行需要的第三方软件栈,包括第三方国产数据库、中间件、办公套件、浏览器等软件栈进行迁移和替换;d)系统运行时如缺少对应的动态链接库,则需要针对不同的国产操作系统,按照 5.2.3 节寻找和安装对应的动态库包。5.4 存储位置要求 应用软件可执行程序、动态库、配置文件、数据文件、缓存文件的存储位置,应符合 DB43/T 22592021 第 6 章的要求。5.5 权限要求 5.5.1 权限分离要求 具有前端交互逻辑的应用软件的可执行程序,应以普通用户权限运行,不应使用 sudo、pk
16、exec 等命令来提权运行。具有前端交互逻辑的应用软件的可执行程序,如果需要特权态执行某些操作,应使用前后端分离的方式实现,通过 dbus 等技术与后端具有管理员权限的服务端通讯,实现相关功能。5.5.2 权限提升要求时用户鉴别要求 前端应用程序使用 dbus 等技术与后端具备管理员权限的服务通讯时,应使用 policykit 等技术进行身份鉴别,用于确定用户是否具备该项行为的权限。5.6 安装脚本要求 a)宜将维护者脚本作为软件包的一部分,当安装、升级、移除软件包时,软件包管理系统会自动执行这些脚本;b)维护者脚本应是可执行文件,以#!符号开头,且这些脚本应是可读的,可被任何人执行,不应全局
17、可写;c)包管理系统可查看维护者脚本的退出状态,如果脚本运行错误,应返回一个非零值;如果脚本运行正常,应返回零值;d)用户与软件包通过维护者脚本中的配置文件进行交互时,应先安装一个配置脚本作为控制信息文件;e)升级软件包时,包管理系统将调用旧版本和新版本软件包中的脚本组合,用户应检查参数DB43/T 22582021 4 以保证正确性;f)在软件包解压之前应先为正在被升级的包停止相关服务,然后完成所需的配置工作;在移除软件包之前,应先停止一个软件包的相关进程,然后修改相关文件或连接,和/或卸载软件包所创建的文件;g)维护者脚本调用的程序不应在程序名前添加路径,其路径会设置在 PATH 环境变量
18、中。5.7 兼容性要求 5.7.1 与操作系统解耦要求 应用软件不应依赖操作系统提供的任何动态链接库(除基础 C 库外)。应用软件不应直接修改操作系统提供的配置文件,宜通过操作系统提供的接口来修改。部分系统配置可通过新增高优先级配置文件来进行配置覆盖,新增的配置文件以“两位数字-应用名.conf”的形式命名。5.7.2 动态库依赖自包含要求 应用软件所使用的动态链接库应尽量独立于操作系统,应用软件所依赖的动态链接库(除基础 C库外)应放置在自设置的 lib 目录中。5.8 功能验证 应用软件迁移适配后,应进行以下功能验证:a)按照应用软件的功能点逐一进行功能测试,保证迁移后的系统与原有系统功能
19、一致;b)检查迁移后应用软件的用户界面,是否符合通用规范,是否符合美观性和易用性;c)检查迁移后应用软件的安全性,是否与原有系统具有相同的安全性;d)检查迁移后应用软件的容错性,是否与原有系统具有相同的容错性;e)检查应用软件在不同平台的安装配置能力,检查在不同平台、不同配置下应用软件的适配性;f)与原有系统集成适配验证;g)用户使用场景验证。5.9 性能优化 迁移适配时,应通过数据采集、瓶颈分析、问题定位、策略优化、修改验证 5 个过程的多次迭代进行性能优化,使应用软件迁移后的性能不低于迁移前的性能。迁移过程包含以下内容:a)数据采集:通过设置 Web 会话、线程、CPU、I/O、网络、内存
20、等数据采集点,持续采集应用软件的运行数据,同时根据性能指标评估体系,对应用软件性能指标采集性能评估数据;b)瓶颈分析:对采集到的数据开展分析,对耗时较多部分,运用时间切片工具进行分析,找出消耗量大的资源;c)问题定位:使用运行监控分析工具分析资源消耗较大的原因,可从线程、内存等层面逐步定位问题;d)策略优化:建立用于性能优化的专家知识库,提供系统性建议,为快速解决问题提供依据和建议方案;e)修改验证:实施建议方案并进行效果验证,确保问题得到解决;f)宜通过 loadrunner、JMeter 等性能测试工具分析应用软件的性能,分析比对找出瓶颈并进行优化。DB43/T 22582021 5 6
21、编译型内核驱动软件迁移适配要求 6.1 迁移适配评估 在迁移适配工作开始之前,应按以下要求进行迁移适配评估:a)软件分析:应从适配性、规范性以及体系结构相关代码三个方面进行分析,初步得到了代码的移植范围。具体的软件分析方法见附录 D;b)技术路线选定:应根据软件分析的成果,按照尽量少地对驱动程序进行修改的原则设计迁移技术路线,以满足驱动的兼容性要求;c)工作量评估:应结合关键性、性能、复杂处理、体系结构支持等对工作量进行加权,获取较为科学的工作量,并根据这个工作量以及工作计划要求来合理配置研发人员和测试人员;d)迁移环境准备:主要包括硬件设备、操作系统以及测试验证工具的准备和部署。6.2 迁移
22、适配实施要求 6.2.1 代码设计要求 驱动程序宜进行合理的代码层次分离,分为内核框架层和核心代码逻辑层,其中内核框架层实现驱动程序内核与 Linux 内核进行对接的部分,调用 Linux 提供的 API 接口函数和数据结构,这部分随着内核的升级而变化,需要重编译;核心代码逻辑层实现驱动程序的核心功能,比如读硬件寄存器的操作、核心算法等,通过内核框架层代码挂接入 Linux 内核。6.2.2 代码编写要求 代码编写应符合以下适配要求:a)驱动程序中应加入驱动签名,增加作者和许可证等签名信息;b)应根据内核和相关依赖模块的接口变化模块校验信息和模块版本控制信息,修改驱动程序接口,保证符号表、模块
23、校验信息和模块版本控制信息等与当前系统的匹配;c)应对驱动程序代码中的体系结构相关指令、嵌入式汇编函数和编译宏进行替换。为了保证 Linux 内核升级时驱动程序内部调用的符号可用,应遵循 DB43/T 2260.12021 中 5.1节规定的原则。6.2.3 代码重编译要求 代码重新编译时,应对编译脚本和编译选项进行移植,将编译脚本和编译选项更改为目标体系结构支持的编译脚本和编译选项。6.2.4 打包要求 为了减少 Linux 内核升级导致设备驱动程序重新编译的工作量,驱动程序打包时宜采用 DKMS 内核模块打包方式,内核模块打包应符合 DB43/T 22602021 中第 6.6 节要求。6
24、.2.5 内核兼容性要求 6.2.5.1 导出符号的 CRC 信息 设备驱动程序所使用的导出符号的 CRC 信息应与内核中所记录的对应符号的 CRC 信息保持一致,以确保设备驱动程序和内核的兼容性。DB43/T 22582021 6 6.2.5.2 多内核版本兼容 若识别驱动程序需同时兼容多个内核版本,驱动程序中应包含对所兼容的内核版本的相关判断逻辑。6.3 功能验证 驱动程序迁移适配后,应进行以下功能验证:a)按照驱动程序的功能点逐一进行功能测试,保证迁移后的驱动与原有功能一致;b)检查内核能否正常加载驱动程序;c)检查驱动程序在不同平台的安装配置能力,检查在不同平台、不同配置下驱动程序的适
25、配性;d)若发现问题,应跟踪系统日志,分析问题产生的原因并进行相应的修改,然后进行回归测试,直到通过所有的功能测试。6.4 性能优化 迁移适配时,应根据应用场景和体系结构对操作系统参数配置进行优化,包含以下内容:a)在工作场景(比如高速网卡的高并发访问、GPU 显卡的实时虚拟化等)下,应对通用场景下的默认系统参数重新进行优化配置;b)宜通过修改内核源码目录下 etc 目录中的配置文件 sysctl.conf 来实现配置优化;c)针对特定的国产处理器,宜根据处理器的拓扑、核数、工作频率等,对设备、驱动程序、应用软件等的工作方式进行针对性优化;d)宜利用 ftrace、kprobe、kgdb、sy
26、stemtap 等内核调试工具分析驱动程序代码的执行效率,分析比对找出瓶颈并进行优化。DB43/T 22582021 7 附 录 A(规范性)Qt 开发环境迁移 Qt 项目迁移前应配置项目所需的 Qt 模块,包括提供 GUI 程序基本功能的 qtbase 基础模块,提供渲染和创建 svg 文件功能的 qtsvg,以及提供脚本化机制的 qtscript 等扩展模块。Qt 迁移应包括头文件迁移、函数迁移、类迁移、常量迁移、模块迁移、webkit 头文件迁移和 webkit类迁移。A.1 Qt 头文件迁移 Qt4 和 Qt5 的头文件迁移参照表见表 A.1。表 A.1 头文件迁移参照表 Qt4Qt4
27、 Qt5Qt5 QtGui QtWidgets QtWebKit QtWebKitWidgets QWorkspace QMdiArea A.2 Qt 函数迁移 Qt4 和 Qt5 的函数迁移参照表见表 A.2,Qt5 缺失的函数应修改迁移软件源代码实现程序逻辑。表 A.2 函数迁移参照表 模块名模块名 Qt4Qt4 Qt5Qt5 QtCore qInstallMsgHandler()qInstallMessageHandler()QAction:setSoftKeyRole()无 QAction:softKeyRole()无 QChar:joining()QChar:joiningType(
28、)QCoreApplication:setEventFilter()QCoreApplication:installNativeEventFilter()QApplication:type()无 QAbstractItemModel:setRoleNames()QAbstractItemModel:roleNames()QDate:setYMD()QDate:setDate()Qt GUI QDesktopServices:storageLocation()QStandardPaths:writableLocation()QDesktopServices:displayName()QStand
29、ardPaths:displayName()QPixmap:grabWindow()QPixmap:grabWidget()QScreen:grabWindow()commitData()QGuiApplication:commitDataRequest()QWidget*widget()QObject*target()DB43/T 22582021 8 表 A.2 函数迁移参照表(续)模块名模块名 Qt4Qt4 Qt5Qt5 Qt Widgets QInputDialog:getInteger()QInputDialog:getInt()QHeaderView:setMovable(bool
30、 movable)QHeaderView:setSectionsMovable()QHeaderView:isMovable()QHeaderView:sectionsMovable()QHeaderView:setClickable(bool clickable)QHeaderView:setSectionsClickable()QHeaderView:isClickable()QHeaderView:sectionsClickable()QHeaderView:setResizeMode(int logicalindex,ResizeMode mode)QHeaderView:setSec
31、tionResizeMode()QHeaderView:resizeMode(int logicalindex)QHeaderView:sectionResizeMode()Qt Network QNetworkConfiguration:bearerName()QNetworkConfiguration:bearerTypeName()QSslCertificate:isValid()QSslCertificate:isBlacklisted()QSslCertificate:alternateSubjectNames()QSslCertificate:subjectAlternativeN
32、ames()Qt Test QTest:qt_snprintf()QByteArray:qsnprintf()QTest:qWaitForWindowShown()QTest:qWaitForWindowExposed()Qt Global qMacVersion()QSysInfo:macVersion()QSysInfo:MacintoshVersion Qt:escape()QString:toHtmlEscaped()A.3 Qt 类迁移 Qt4 和 Qt5 类迁移见表 A.3。表 A.3 类迁移参照表 模块名模块名 Qt4Qt4 Qt5Qt5 QtCore QSystemLocale
33、 QLocale QPointer QWeakPointer Qt GUI QIconEngineV2 QIconEngine Qt Widgets QProxyModel QAbstractProxyModel Qt Network QHttp QHttpHeader,QHttpResponseHeader,QHttpRequestHeader QNetworkAccessManager QFtp QUrlInfo QNetworkAccessManager Qt OpenGL QGLPixelBuffer QOpenGLFramebufferObject A.4 Qt 常量迁移 Qt4 和
34、 Qt5 常量迁移见表 A.4,Qt5 缺失的常量应修改迁移软件源代码实现程序逻辑。DB43/T 22582021 9 表 A.4 常量迁移参照表 模块名模块名 Qt4Qt4 Qt5Qt5 QtCore Qt:WFlags Qt:WindowFlags QAction:SoftKeyRole 无 Qt:WA_MergeSoftkeys 无 Qt:WA_MergeSoftkeysRecursively 无 Qt:WindowSoftkeysVisibleHint 无 Qt:WindowSoftkeysRespondHint 无 QChar:Joining QChar:JoiningType QE
35、vent:AccessibilityPrepare 无 QEvent:AccessibilityHelp 无 QEvent:AccessibilityDescription 无 QDir:convertSeparators()QDir:toNativeSeparators()QDir:NoDotAndDotDot QDir:NoDot QDir:NoDotDot A.5 Qt 模块迁移 Qt4 和 Qt5 模块迁移见表 A.5。表 A.5 模块迁移参照表 Qt4Qt4 Qt5Qt5 QtCore QtCore QtConcurrent QtGui QtGui QtWidgets A.6 web
36、kit 头文件迁移 webkit 到 webengine 头文件迁移见表 A.6。表 A.6 webkit 到 webengine 头文件迁移参照表 Qt WebKitQt WebKit Qt WebEngineQt WebEngine QWebHistory QWebEngineHistory QWebHistoryItem QWebEngineHistoryItem QWebPage QWebEnginePage QWebView QWebEngineView A.7 webkit 类迁移 webkit 到 webengine 类迁移对照见表 A.7。DB43/T 22582021 10
37、表 A.7 webkit 到 webengine 类迁移参照表 Qt WebKitQt WebKit Qt WebEngineQt WebEngine QWebHistory QWebEngineHistory QWebHistoryItem QWebEngineHistoryItem QWebPage QWebFrame QWebEnginePage QWebView QWebEngineView DB43/T 22582021 11 附 录 B(规范性)Gtk 开发环境迁移 B.1 开发者在已有的 gtk2 项目中应做的适配 a)开发者不得引用无效头文件 gtk3 规定的可引用的头文件见表
38、 B.1。表 B.1 gtk3 中可引用的头文件 头文件名头文件名 用途用途 gtk/gtk.h GTK gtk/gtkx.h X 类 widgets GtkSocket 和 GtkPlug gtk/gtkunixprint.h 底层的、UNIX 的打印函数 gdk/gdk.h GDK gdk/gdkx.h X11 的 GDK 函数 gdk/gdkwin32.h Windows 的 GDK 函数 使用 make CFLAGS+=-DGTK_DISABLE_SINGLE_INCLUDES去除无效头文件。b)应去除已弃用符号 使用 make CFLAGS+=-DGDK_DISABLE_DEPREC
39、ATED-DGTK_DISABLE_DEPRECATED定义去除已弃用符号。c)应使用已有的访问接口,不得直接访问 gtk 对象 使用 make CFLAGS+=-DGSEAL_ENABLE去除无效接口。d)应把 GDK_ 替换为 GDK_KEY_ e)应通过 GIO 打开外部程序 f)应通过 cairo 进行绘制 GdkGC 和 GdkImage 对象不能继续使用。g)其他 1)开发者不应继续使用 GdkBitmap 位图操作,宜使用 cairo_mask()实现相同效果;2)开发者不应继续使用 gdk_draw_drawable(),宜使用 cairo_push_group()实现相同效果
40、;3)开发者应使用 pango_cairo_show_layout()替换 gdk_draw_layout_with_colors();4)开发者应使用pango_cairo_layout_path()和cairo_fill()替换gdk_draw_layout_with_colors()。B.2 开发者将程序代码向 gtk3 迁移应做的适配 a)开发者应使用 get_preferred_width/height 替换 size_request;b)开发者应使用以下 cairo 接口进行 GDK 功能替换,见表 B.2;DB43/T 22582021 12 表 B.2 替换 GDK 功能的 c
41、airo 接口 GDKGDK cairocairo GdkRegion cairo_region_t GdkRectangle cairo_rectangle_int_t gdk_rectangle_intersect()函数一致 gdk_rectangle_union()函数一致 gdk_region_new()cairo_region_create()gdk_region_copy()cairo_region_copy()gdk_region_destroy()cairo_region_destroy()gdk_region_rectangle()cairo_region_create_r
42、ectangle()gdk_region_get_clipbox()cairo_region_get_extents()gdk_region_get_rectangles()cairo_region_num_rectangles()和cairo_region_get_rectangle()gdk_region_empty()cairo_region_is_empty()gdk_region_equal()cairo_region_equal()gdk_region_point_in()cairo_region_contains_point()gdk_region_rect_in()cairo_
43、region_contains_rectangle()gdk_region_offset()cairo_region_translate()gdk_region_union_with_rect()cairo_region_union_rectangle()gdk_region_intersect()cairo_region_intersect()gdk_region_union()cairo_region_union()gdk_region_subtract()cairo_region_subtract()gdk_region_xor()cairo_region_xor()gdk_region
44、_shrink()无 gdk_region_polygon()无,使用 cairo 路径替代 c)开发者应使用 cairo surfaces 替换 GdkPixmap 对象和相关函数;d)开发者应使用 GdkVisual 处理图层信息,替换 GdkColormap 和其相关函数;e)开发者应使用 cairo_surface 或 GdkPixBufGdk 替换 GDKDrawable、GdkPixmap 以及 GdkImage,GdkWindow 类中可以替换 GdkDrawable 相关的函数见表 B.3。表 B.3 GdkWindow 类中替换 GdkDrawable 相关的函数 GDK 2
45、.xGDK 2.x GDK 3GDK 3 gdk_drawable_get_visual()gdk_window_get_visual()gdk_drawable_get_size()gdk_window_get_width()和 gdk_window_get_height()gdk_pixbuf_get_from_drawable()gdk_pixbuf_get_from_window()gdk_drawable_get_clip_region()gdk_window_get_clip_region()gdk_drawable_get_visible_region()gdk_window_g
46、et_visible_region()DB43/T 22582021 13 f)开发者应使用通用接口gdk_window_add_filter()过滤事件,替换gdk_add_client_message_filter()和 gdk_display_add_client_message_filter();g)开发者宜通过添加来使用 GtkPlug 与 GtkSocket 组件;h)开发者应使用 cairo_t 替代 GtkWidget:draw 信号;i)开发者应使用 gtk_orientable_set_orientation()和 gtk_progress_bar_set_inverted
47、()替换 gtk_progress_bar_set_orientation()来设置 GtkProgressBar 进度条,当前进度条的方向值见表 B.4。表 B.4 当前进度条的方向值 GTK+2.xGTK+2.x GTK+3GTK+3 GtkProgressBarOrientation GtkOrientation 倒转 GTK_PROGRESS_LEFT_TO_RIGHT GTK_ORIENTATION_HORIZONTAL FALSE GTK_PROGRESS_RIGHT_TO_LEFT GTK_ORIENTATION_HORIZONTAL TRUE GTK_PROGRESS_TOP_
48、TO_BOTTOM GTK_ORIENTATION_VERTICAL FALSE GTK_PROGRESS_BOTTOM_TO_TOP GTK_ORIENTATION_VERTICAL TRUE j)开发者应通过 GtkBox expand 和 GtkBox fill 扩大和填充标志,默认值已由原来的“水平”和“垂直”变成了“从不”和“自动”;k)开发者不应使用 GtkObject 类,若已有代码中有从 GtkObject 类中继承的对象,需要进行调整;l)GtkEntryCompletion 信号“match-selected”和“cursor-on-match”在 gtk2 中的错误已被修
49、复,如涉及相关代码,开发者需要进行相应调整;m)开发者宜使用 gtk_window_set_has_resize_grip()和 gtk_window_get_has_resize_grip()替换 gtk_statusbar_set_has_resize_grip()和 gtk_statusbar_get_has_resize_grip();n)开发者应在正确的位置安装 gtk+的模块,gtk+2.x 的位置是 libdir/gtk-2.0 及其子目录,gtk+3 的位置是 libdir/gtk-3.0 及其子目录,如使用 GTK+3 链接到 libgtk 2.x 的模块,将导致错误。DB4
50、3/T 22582021 14 附 录 C(规范性)Python 开发环境迁移 应用程序从 python2 迁移到 python3,语法变化见表 C.1。表 C.1 python2 到 python3 迁移参照表 Python2Python2 Python3Python3 关键字 print 和 exec 函数 print()和 exec()字符串类型分为 unicode 和非 unicode 两类 所有字符串均为 unicode 类 long 类型 无 运算符 无 has_key()函数 无 keys()方法返回一个list获取一个dict对象的所有keys keys()返回值的结果不再是预