CN111880805A - 软件项目的包文件生成方法及装置、设备、存储介质 - Google Patents
软件项目的包文件生成方法及装置、设备、存储介质 Download PDFInfo
- Publication number
- CN111880805A CN111880805A CN202010702946.8A CN202010702946A CN111880805A CN 111880805 A CN111880805 A CN 111880805A CN 202010702946 A CN202010702946 A CN 202010702946A CN 111880805 A CN111880805 A CN 111880805A
- Authority
- CN
- China
- Prior art keywords
- file
- code
- code file
- software project
- package
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/602—Providing cryptographic facilities or services
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Health & Medical Sciences (AREA)
- Bioethics (AREA)
- General Health & Medical Sciences (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Stored Programmes (AREA)
Abstract
本申请的实施例揭示了一种软件项目的包文件生成方法、装置、设备以及计算机可读存储介质。该方法包括:获取软件项目所包含的文件目录;从所述软件项目的入口代码文件开始,递归查找所述文件目录中具有引入关系的代码文件;将查找到的代码文件进行合并处理,生成目标代码文件,并根据所述入口代码文件中含有的入口参数在所述目标代码文件中添加入口函数;对所述目标代码文件进行编译处理,获得所述软件项目对应的包文件。本申请实施例的技术方案不会泄露软件项目中含有的文件目录结构,极大地增强了软件项目的隐私性和安全性。
Description
技术领域
本申请涉及数据处理技术领域,具体涉及一种项目文件的包文件生成方法及装置、设备和计算机可读存储介质。
背景技术
在软件项目的外发场景中,例如将开发好的软件项目发布到开源项目共享平台,为避免软件项目的源代码泄露,需要对软件项目加密后再进行外发,因此如何提升软件项目外发的安全性,是本领域的技术人员需要不断探索的问题。
发明内容
为提升软件项目外发的安全性,本申请的实施例提供一种软件项目的包文件生成方法及装置、设备、计算机可读存储介质。
其中,本申请所采用的技术方案为:
一种软件项目的包文件生成方法,包括:获取软件项目所包含的文件目录;从所述软件项目的入口代码文件开始,递归查找所述文件目录中具有引入关系的代码文件;将查找到的代码文件进行合并处理,生成目标代码文件,并根据所述入口代码文件中含有的入口参数在所述目标代码文件中添加入口函数;对所述目标代码文件进行编译处理,获得所述软件项目对应的包文件。
一种软件项目的包文件生成装置,包括:信息获取模块,用于获取软件项目所包含的文件目录;递归查找模块,用于从所述软件项目的入口代码文件开始,递归查找所述文件目录中具有引入关系的代码文件;文件合并模块,用于将查找到的代码文件进行合并处理,生成目标代码文件,并根据所述入口代码文件中含有的入口参数在所述目标代码文件中添加入口函数;文件编译模块,用于对所述目标代码文件进行编译处理,获得所述软件项目对应的包文件。
一种软件项目的包文件生成设备,包括处理器及存储器,所述存储器上存储有计算机可读指令,所述计算机可读指令被所述处理器执行时实现如上所述的软件项目的包文件生成方法。
一种计算机可读存储介质,其上存储有计算机可读指令,当所述计算机可读指令被计算机的处理器执行时,使计算机执行如上所述的软件项目的包文件生成方法。
在上述技术方案中,所生成的软件项目对应的包文件是通过对目标代码文件进行编译处理得到的,由于目标代码文件是由软件项目的文件目录中具有引入关系的代码文件合并处理得到的,目标代码文件是一个独立的代码文件,因此,在对目标代码文件进行编译处理所得到的包文件进行外发时,则不会泄露软件项目中含有的文件目录结构,极大地增强了软件项目的保密性和安全性。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术者来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
图1是本申请涉及的一种实施环境的示意图;
图2是根据一示例性实施例示出的一种软件项目的包文件生成方法的流程图;
图3是一示例性的软件项目的文件目录的示意图;
图4是图2所示实施例中的步骤150在一示例性实施例的流程图;
图5是图2所示实施例中的步骤150在另一示例性实施例的流程图;
图6是根据另一示例性实施例示出的一种软件项目的包文件生成方法的流程图;
图7是根据另一示例性实施例示出的一种软件项目的包文件生成方法的流程图;
图8是图7所示实施例中步骤430在一个示例性实施例的流程图;
图9是图7所示实施例中步骤430在另一个示例性实施例的流程图;
图10是一示例性实施例中生成字典文件的流程图;
图11是软件项目的包文件生成方法在一示例性的应用场景中的流程图;
图12是根据一示例性实施例示出的一种软件项目的包文件生成装置的框图;
图13是根据一示例性实施例示出的一种软件项目的包文件生成设备的结构示意图。
具体实施方式
这里将详细地对示例性实施例执行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
请参阅图1,图1是本申请涉及的一种实施环境的示意图。
如图1所示,该实施环境为一软件代码的打包和发布系统,具体包括终端100、代码处理服务器200、开源项目共享平台服务器300和开源项目共享平台客户端400。
开发人员在终端100中完成软件项目的代码开发后,将开发好的整个软件项目发送至代码处理服务器200。
代码处理服务器200接收到终端100发送的软件项目后,则从软件项目的入口代码文件开始,递归查找软件项目的文件目录中具有引入关系的代码文件,并将查找到的代码文件进行合并处理,生成目标代码文件。并且,还根据入口代码文件中含有的入口参数在目标代码文件中添加入口函数,然后对目标代码文件进行编译处理,得到软件项目对应的包文件。
代码处理服务器200还将得到的包文件发送至开源项目共享平台服器 300进行存储,以实现软件项目的开源。当用户想要使用软件项目时,则在开源项目共享平台客户端400中进行操作,以调用开源项目共享平台服务器 300中存储的软件项目的包文件中的入口函数,进而启动执行软件项目,实现软件项目的软件功能。
需要说明的是,本实施环境中的终端100和开源项目共享平台客户端 400具体可以是台式计算机、笔记本电脑、平板电脑、智能手机等设备;代码处理服务器200和开源项目共享平台服务器300具体可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN(Content Delivery Network,内容分发网络)、以及大数据和人工智能平台等基础云计算服务的云服务器,在此不进行限制。
如前所述的,在软件项目的外发场景中,为避免软件项目的源代码泄露,需要对软件项目加密后再进行外发。
本领域通用的加密方法是,将软件项目的文件目录下的各个代码文件中的代码内容分别进行加密,例如将各个代码文件中的代码内容编译为加密格式,但互联网上有很多的解密方案都可以对加密格式进行反编译处理,因此软件项目外发的安全性较低。
为提升软件项目外发的安全性,基于本申请的一方面提出一种软件项目的包文件生成方法,通过先将软件项目中具有引入关系的代码文件合并为一个目标代码文件,以隐藏原软件项目中含有的多级文件目录结构,并在目标代码文件中添加入口函数,最后对所得到的目标代码文件进行编译处理,以生成软件项目对应的包文件。
在需要对软件项目进行外发时,外发软件项目对应的包文件即可。而当用户想要使用外发的软件项目时,调用软件项目的包文件中的入口函数即可启动执行软件项目,并实现软件项目的软件功能。
由于软件项目的包文件是对独立的目标代码文件进行编译得到的,因此外发的包文件不会泄露软件项目的文件组织结构,能够避免对手通过软件项目的多级目录名以及文件名来推测出软件项目的有关信息,并且,即使对包文件进行反编译处理,也不会得到软件项目的文件组织结构,进而能够极大程度地保证了软件项目外发的安全性。
下面将通过具体的实施例对本申请提出的软件项目的包文件生成方法进行详细描述:
请参阅图2,图2是根据一示例性实施例示出的一种软件项目的包文件生成方法的流程图。该方法可以适用于图1所示的实施环境,例如由图1所示实施环境中的代码处理服务器200具体执行。
如图2所示,在一示例性实施例中,该方法至少包括如下步骤:
步骤110,获取软件项目所包含的文件目录。
首先需要说明的是,本申请实施例中的软件项目是指开发人员进行软件代码编写所形成的项目文件,其包含多层级的文件目录,具体的软件代码以代码文件的形式存放在多层级的文件目录下。
如图3所示,在一示例性的软件项目的文件目录中,最上层目录为该示例性的软件项目的根目录,该根目录下含有多个层级的子目录,并且子目录下可以含有一个或者多个代码文件。应当理解的是,本实施例描述的“多个”是指至少两个。
由于软件项目的包文件需要根据软件项目的文件组织结构以及具体的软件代码进行生成,因此,本实施例需要获取软件项目所包含的文件目录。
步骤130,从软件项目的入口代码文件开始,递归查找文件目录中具有引入关系的代码文件。
其中,入口代码文件也是软件项目的文件目录下的代码文件,其作为软件项目中可以直接执行的接口层文件,可以被外部软件直接进行调用,以启动执行整个软件项目。
软件项目中的各个代码文件存于文件目录下,使得软件项目在执行时需要具体执行文件目录下的代码文件。代码文件中还可以含有关于引入文件目录下的其它代码文件的引入描述,使得代码文件在执行时具体需要执行其它代码文件的引入操作。例如,如果软件项目的入口代码文件在执行时需要引入代码文件A,代码文件A在执行时需要引入代码文件C,代码文件C在执行时需要引入代码文件D。
由此,本实施例从软件项目的入口代码文件开始,可以递归查找到文件目录中具有引入关系的各个代码文件,例如查找到前述示例中的代码文件A、代码文件C和代码文件D。
并且基于查找到的各个代码文件之间的引入关系,可以得到软件项目执行时对应的代码文件引入逻辑,例如在前述示例中,该示例性的软件项目的代码文件引入逻辑为“入口代码文件←代码文件A←代码文件C←代码文件 D”,其中“←”表示引入的含义。因此,基于软件项目对应的代码文件引入逻辑,依次执行软件项目的文件目录下的相应代码文件,即能够实现软件目标的软件功能。
步骤150,将查找到的代码文件进行合并处理,生成目标代码文件,并根据入口代码文件中含有的入口参数在目标代码文件中添加入口函数。
在本实施例中,将查找到的代码文件进行合并处理,是将查找到的各个代码文件合并为一个独立的目标代码文件。基于此,目标代码文件中不含有软件项目的文件组织结构,使得外发场景下能够避免泄露软件项目的文件组织结构,保证软件项目外发的安全。
代码文件合并至目标代码文件中,仍保留了原代码文件之间的引用关系,以使得通知执行目标代码文件即可实现软件项目的软件功能。
此外,由于软件项目的入口代码文件并未合并至目标代码文件中,导致目标代码文件中不含有入口信息,将目标代码文件进行外发后,用户无法进行目标代码文件的使用,因此还需要在目标代码文件中添加入口函数,以使用户直接调用目标代码文件的入口函数即可启动执行软件项目。
具体来说,当目标代码文件的入口函数被调用后,按照软件项目对应的代码文件引入逻辑,依次执行目标代码文件中经由合并处理的各个代码文件,并实现软件项目的软件功能,由此即可将具有多层级的文件目录的软件项目合并为一个独立的代码文件。
需要说明的是,软件项目的入口代码文件中含有的入口参数是指软件项目需要暴露给用户使用的类和函数等参数,基于这些入口参数,即可以在目标代码文件中生成目标代码文件的入口函数。
步骤170,对目标代码文件进行编译处理,获得软件项目对应的包文件。
由上述内容可知,目标代码文件仅是隐藏了软件项目的文件组织结构,为进一步提升软件项目外发的安全性,本实施例还对目标代码文件进行编译处理,以将目标代码文件中的软件代码进行加密。
例如在一些实施例中,由于二进制机器代码(例如使用C/C++语言编写的计算机代码)不容易被反编译,加密性更高,如果软件项目是使用非二进制级别的机器语言(例如使用Python语言、Java语言等编写的计算机代码)编写得到的,则可以将目标代码文件编译为二进制机器码级别的包文件。或者也可以将目标代码文件编译为动态共享库文件(即“.so”格式的文件)。
在其它的一些实施例中,还可以对目标代码文件进行多次编译处理,例如先将目标代码文件编译为二进制机器码级别的加密文件,再将得到的二进制机器码级别的加密文件编译为动态共享库文件,使得所得到的包文件具有更高的安全性,难以进行反编译处理。
本实施例所编译得到的包文件具有极高的隐私性和安全性,在软件项目的外发场景中,可以将软件项目对应的包文件进行外发,例如将生成的包文件发布至开源项目共享平台,以使得外部软件通过调用该包文件中的入口函数启动执行软件项目,因此本实施例提供的方法针对软件实现了多级目录加密,能够满足于软件项目的外发场景对于源代码安全性的要求。
图4是图2所示实施例中的步骤150在一示例性实施例的流程图。如图4 所示,步骤150中将查找到的代码文件进行合并处理,并生成目标代码文件的过程具体可以包括如下步骤:
步骤151,根据定义的装饰器函数,将查找到的代码文件装饰为伪模块函数。
首先需要说明的是,由于目标代码文件为一独立的代码文件,一个代码文件中不能同时存在多个代码文件,基于此,为了将步骤130中查找到的各个代码文件合并至目标代码文件中,则需要将各个代码文件在目标代码文件中的存在形式更改为以伪模块函数的形式存在。目标代码文件在执行时,则进行不同伪模块函数之间的调用。
在本实施例中,装饰器函数即是作用于将各个代码文件装饰为目标代码文件中的伪模块函数。在一个实施例中,伪模块函数应当具有函数名和函数体,装饰器函数即用于根据步骤130中查找到的各个代码文件生成相应代码文件的函数名以及函数体,由此得到相应的伪模块函数。
示例性的,可以将相应代码文件的包名作为各个伪模块函数的函数名,各个伪模块函数的函数体为相应代码文件中的所有代码。由于代码文件的包名与代码文件在软件项目中的目录位置以及自身的文件名有关,因此不同的代码文件所对应的伪模块函数名是互不相同的。基于不同的伪模块函数名,能够保证目标代码文件在执行时,不同伪模块函数之间的调用过程不会出错,进而保证外发的软件项目的包文件的可靠性。各个伪模块函数的函数体则可以直接从相应的代码文件中复制得到。
另外,由于各个代码文件中含有关于其它代码文件的引入描述,将各个代码文件装饰为目标代码文件中的伪模块函数后,函数体中关于其它代码文件的引入描述无法正常执行,因此还需要将伪模块函数中关于代码文件的引入描述替换为关于代码文件所对应的伪模块函数的调用描述。例如,仍假设软件项目中的代码文件A需要引入代码文件C,并且对代码文件A装饰得到伪模块函数A,对代码文件C装饰得到伪模块函数C,因此需要将伪模块函数A的函数体中关于引入代码文件C的代码部分更改为调用伪模块函数C的相应代码描述。
由此,本实施例通过装饰器函数将步骤130中查找到的各个代码文件装饰为伪模块函数,使得各个伪模块函数中的代码逻辑与函数的使用逻辑是相匹配的,能够保证目标代码文件中含有的软件代码的正确性。
步骤153,将装饰器函数以及装饰得到的伪模块函数合并至目标代码文件中,目标代码文件中的伪模块函数在被执行时引入目标代码文件中的其它伪模块函数。
应当理解,本实施例将装饰器函数以及装饰得到的伪模块函数合并至目标代码文件中是基于代码层面的合并操作,在功能层面即是实现将各个代码文件对应的伪模块函数进行合并。
本实施例通过装饰器函数所进行的代码文件装饰,以将具有引入关系的各个代码文件装饰为伪模块函数,并且还对伪模块函数中含有的关于代码文件的引入描述进行适应性调整,在将装饰得到的伪模块函数合并至目标代码文件之后,目标代码文件中的执行逻辑是合理的,因此能够保证软件项目外发的可靠性。
在其它的一些实施例中,软件项目含有的代码文件中可能还含有特殊引入描述,该特殊引入描述只能位于软件文件内源代码的顶部,例如在使用 Python语言编写的Python项目中,根据Python语言的规则,关于“_future_.py”文件的引入描述只能置于代码文件(即格式为“.py”的文件)所含有的源代码的顶部。因此,在合并得到的目标代码文件中,需要将伪模块函数中含有的特殊引入描述删除,并将删除的特殊引入描述添加至目标代码文件中的源代码顶部,进而保证目标代码文件的执行逻辑的准确性。
在另一示例性的实施例中,软件项目的每个目录下还可能具有目录文件,在此目录文件的作用下,使得相应目录下的各个代码文件则为可以被引入的文件包。
例如在Python项目中,每个目录下的目录文件为“_init_.py”文件,当Python项目中的任意一个代码文件被引入时,默认引入相应代码文件的所有父级目录下的“_init_.py”文件。
如图5所示,本实施例为保证目标代码文件中的各个伪模块函数能够被其它的伪模块函数正常调用,在使用装饰器函数进行各个代码文件的装饰时,还需要执行以下步骤:
步骤210,从软件项目中查找伪模块函数对应的代码文件的所有父级目录下的目录文件;
步骤230,将查找到的目录文件所对应的代码内容添加到伪模块函数的函数体中。
在本实施例中,从软件项目中查找伪模块函数对应的代码文件的所有父级目录下的目录文件之后,将这些目录文件添加到伪模块函数的函数体中,使得目标代码文件中的伪模块函数在被调用时,能够依赖于函数体中含有的目录文件对应的代码内容实现正常调用,进一步保证了目标代码文件的执行逻辑与软件项目的执行逻辑是相匹配的,并使得最终外发的软件项目对应的包文件是可靠的。
在另外的实施例中,软件项目的代码文件之间的引入方式可能对相关代码文件的合并造成影响,因此在对软件项目中具有引入关系的代码文件进行合并处理之前,还需要对软件项目进行预处理。
例如在一个具体的实施例中,如图6所示,对软件项目进行预处理的过程可以包括如下步骤:
步骤310,遍历查找文件目录中的代码文件之间的引入方式;
步骤330,如果查找到第一代码文件以相对路径的方式引入了第二代码文件,则将相对路径替换为第二代码文件在文件目录中的绝对路径。
首先需要说明的时,本实施例描述的第一代码文件是软件项目中发起代码文件引入的代码文件,第二代码文件是软件项目中被引入的代码文件,第一代码文件与第二代码文件是基于引入关系相对而言的,并非表示对软件项目中的某个具体代码文件的限制。
相对路径用于描述软件项目中的两个代码文件之间所在目录之间的相对关系,根据其中一个代码文件所在的目录位置以及另一代码文件的相对路径,即可以在软件项目中查找到另一代码文件。绝对路径用于描述软件项目中的任一个代码文件与软件项目的根目录之间的相对关系,由于软件项目的根目录是固定的,因此根据代码文件的绝对路径可以在软件项目中准确查找到此代码文件。
第一代码文件以相对路径的方式引入第二代码文件是指,第一代码文件中关于引入第二代码文件的代码部分含有第二代码文件相对第一代码文件的相对路径的引入。
例如在Python项目中,第一代码文件可以通过“from.a import x”语句或者“from..a import x”语句来描述从第二代码文件中引入x(x可以是一个类、一个函数或者变量等),其中“.”表示第一代码文件所在的目录,“..”表示第一代码文件所在目录的上层目录,因此“.a”表示在第一代码文件所在目录下的“a.py”文件中引入x,“..a”表示在第一代码文件所在目录的上层目录下的“a.py”文件中引入x。由此,“.a”以及“..a”即为第二代码文件相对第一代码文件的相对路径。
由于后续在执行具有引入关系的代码文件的合并处理时,需要将多个代码文件合并成一个独立的目标代码文件,各个代码文件中含有的相对路径失效,从而导致目标代码文件中含有的伪模块函数之间无法进行调用。因此,本实施例需要将第一代码文件中含有的相对路径替换为第二代码文件在软件项目中的绝对路径。
仍以Python项目为示例,如果第一代码文件中存在“from.a import x”语句,第二代码文件“a.py”的绝对路径为“path/to”,则将第一代码文件中的“from.a import x”语句替换为“from path.to.a import x”。如果第二代码文件“a.py”位于软件项目的path目录下,则将“from.a import x”语句替换为“from path.a import x”。
由此,基于本实施例提出的方法,能够保证合并得到的目标代码文件中含有的各个伪模块函数与软件项目中的代码文件相对应,各个伪模块函数之间即可正常进行调用。
在另一个具体的实施例中,如图7所示,对软件项目进行预处理的过程可以包括如下步骤:
步骤410,遍历查找文件目录中的代码文件之间的引入方式;
步骤430,如果查找到第三代码文件以概括性引入的方式引入了第四代码文件中的所有代码参数,则将概括性引入替换为第四代码文件中的所有代码参数的真实引入。
首先说明的是,与上述实施例中的第一代码文件和第二代码文件同理,本实施例中的第三代码文件和第四代码文件也是基于代码文件之间的引入关系相对而言的,并非表示对软件项目中的某个具体代码文件的限制。
第三代码文件以概括性引入的方式引入第四代码文件中的所有代码参数是指,第三代码文件中关于引入第四代码文件的代码部分含有关于第四代码文件中的所有代码参数的概括性描述。
仍以Python项目为示例,假设第三代码文件中含有“from.a import*”语句,表示在第三代码文件中引入第四代码文件“a.py”中的类、函数、变量等所有代码参数,因此“*”为第三代码文件中含有的概括性引入。
由于后续在执行具有引入关系的代码文件的合并处理时,需要将多个代码文件合并成一个独立的目标代码文件,并且各个代码文件转换为目标代码文件中的伪模块函数,伪模块函数在执行时无法识别代码内容中的概括性引入,因此需要将第三代码文件中含有的概括性引入替换为关于第四代码文件中的所有代码参数的真实引入。例如在上述的Python项目示例中,将第三代码文件中含有的概括性引入替换为关于第四代码文件中的所有代码参数的真实引入,具体是将“from.a import*”语句中的“*”替换为第四代码文件“a.py”中的所有代码参数。
由此,基于本实施例提出的方法,进一步能够保证合并得到的目标代码文件中含有的各个伪模块函数之间可以正常进行调用。
图8是图7所示实施例中步骤430在一个示例性实施例的流程图。如图8 所示,将第三代码文件中含有的概括性引入替换为第四代码文件中的所有代码参数的真实引入的过程可以包括如下步骤:
步骤431,获取第四代码文件对应的包名,该包名含有所述第四代码文件在软件项目中的文件路径。
如前所述的,第四代码文件的包名与第四代码文件在软件项目中的目录位置以及自身文件名有关,因此基于第四代码文件的包名,可以确定第四代码文件在软件项目中的文件路径。
步骤433,根据该文件路径,从软件项目中查找第四文件中含有的所有代码参数,并将第三代码文件中关于概括性引入的代码部分替换为查找到的所有代码参数。
在本实施例中,根据第四代码文件对应的包名在软件项目中查找四代码文件中含有的所有代码参数,再将查找到的所有代码参数对第三代码文件中关于概括性引入的代码部分进行替换,由此实现第三代码文件中含有的概括性引入的替换。
在另外的实施例中,如图9所示,将第三代码文件中含有的概括性引入替换为第四代码文件中的所有代码参数的真实引入的过程,还可以包括如下步骤:
步骤432,获取第四代码文件对应的包名。
步骤434,基于第四代码文件的包名,在字典文件中查找与该包名相关联的数组信息,该数组信息对应于第四代码文件中的所有代码参数。
在本实施例中,字典文件中存储有第四代码文件中含有的所有代码参数,这些代码参数以数组形式存储,并与第四代码文件的包名相关联,因此本实施例基于第四代码文件的包名,可以在字典文件中查找到第四代码文件中的所有代码参数。
步骤436,将第三代码文件中关于概括性引入的代码部分替换为数组信息对应的所有代码参数。
在字典文件中查找到第四代码文件中的所有代码参数之后,即可根据查找到的所有代码参数对第三代码文件中关于概括性引入的代码部分进行替换,从而保证合并得到的目标代码文件中含有的各个伪模块函数之间可以正常进行调用。
由此,在本实施例提供的方法中,基于字典文件,可以方便地查找到第四代码文件中的所有代码参数,以及方便地进行将第三代码文件中关于概括性引入的替换,十分适用于软件项目中含有复杂的代码文件引入的场景。
在另一示例性的实施例中,如图10所示,字典文件可以通过如下步骤获得:
步骤510,将软件项目含有的各个第四代码文件所对应的包名加入预设集合。
如前所述的,第四代码文件是软件项目中被引入至其它代码文件中的代码文件,引入第四代码文件的代码文件即称为第三代码文件,因此第四代码文件与第三代码文件是相对应的。在实际的应用场景中,软件项目中通常含有多个第四代码文件。
步骤530,在软件项目中查找预设集合中的各个包名对应的第四代码文件所含有的内建数组,该内建数组中含有第四代码文件中的所有代码参数。
仍如前所述的,基于第四代码文件的包名,可以在软件项目中准确地查找到第四代码文件,从而可以从第四代码文件中代码内容中获取得到第四代码文件中的所有代码参数。
如果第四代码文件中含有的所有代码参数以内建数组的形式存储于第四代码文件中,直接获取该内建数组即可得到第四代码文件中的所有代码参数。如果第四代码文件中不含有内建数组,则可以根据第四代码文件中的所有代码参数构建内建数组,然后获取构建的内建数组。
例如在上述的Python项目示例中,内建数组具体可以描述为“_all_”。如果第四代码文件“a.py”中含有Parser类和Detction类,以及含有 ParserType变量,第四代码文件的内建数组则可以表示为“_all=[′Parser′,′Detction′,′ParserType′]”。
步骤550,将各个包名作为键,以及将针对各个包名查找到的所有代码参数作为键对应的值存入字典文件中。
在本实施例中,将各个第四代码文件的包名作为键,并将相应的第四代码文件中的所有代码参数作为键对应的值存入字典文件中,即可使得后续在执行所有代码参数的查找时,能够很方便地查找第四代码文件含有的所有代码参数。
并且在本实施例提出的方法中,由于字典文件中含有软件项目中的所有第四代码文件的包名以及所有代码参数之间的关联关系,如果软件项目中存在同一代码文件分别被引入不同的其它代码文件的情况,当针对该引入的代码文件获取所有代码参数时,无需每次都从软件项目中查找所有代码参数,极大地降低了进行概括性引入的替换所需的资源损耗。
为便于理解前述实施例中描述的软件项目的包文件生成过程,下面以一个具体的应用场景作为示例对软件项目的包文件生成过程进行详细描述。
在该示例性的应用场景中,通过对Python项目进行打包处理,最终得到一个“.so”格式的动态共享库文件,该动态共享库文件是基于一个单独的“merged.py”文件编译得到的,隐藏了Python项目含有的多层级的文件组织结构。当具有Python项目外发需求时,将此动态共享库文件外发即可,不会避免泄露Python项目中的文件组织结构,因此能够极大地提升Python 项目外发的安全性。
如图11所示,在获取到Python项目的文件目录后,根据步骤11~步骤 22所描述的内容生成Python项目对应的动态共享库文件。
具体的,先遍历Python项目中的每个“.py”格式的代码文件,可以获取得到每个被引入的代码文件相对Python项目的根目录的路径,在将此路径转换为以句号分割的绝对路径之后,将被引入的文件的相对路径替换为绝对路径。例如,如果代码文件“a.py”相对根目录的路径为“path/to”,则将“from.a import x”语句替换为“from path.to.a import x”。基于此过程,可以保证合并得到的目标代码文件(即图11所示的merged.py文件)中生成的伪模块函数能够与Python项目中的代码文件一一对应。
完成所有代码文件中含有的相对路径描述的替换后,还针对含有星号 (*)的引入部分进行处理。具体的,在获取所有星号(*)对应的被引入代码文件的包名之后,将这些包名加入集合中,并遍历集合中所有包名对应的代码文件,获取代码文件中所有的变量/函数/类名,并生成字典。在字典中,各个被引入代码文件的包名与各个被引入代码文件中所有的变量/ 函数/类名以键值对形式进行存储。因此,根据被引入代码文件的包名,可以在字典中查找到其含有的所有代码参数,并根据查找到的所有代码参数将星号(*)替换成实际的代码参数。基于此过程,可以保证合并得到的目标代码文件中生成的伪模块函数之间可以正常地进行调用。
以上过程均可以是视为是对Python项目的预处理过程。完成预处理后,则从入口文件开始,递归查找每个代码文件所引入的代码文件,以得到 Python项目运行时各个代码文件之件的引入关系。然后根据定义的Python 装饰器,将查找到的各个代码文件装饰成伪模块函数,并将原生的关于代码文件的引入机制转换为伪模块函数之间的调用机制。各个伪模块函数的函数名为相应代码文件的包名,函数体为相应代码文件中的代码内容。将装饰器以及伪模块函数合并到merged.py文件中,并在merged.py文件中添加入口函数,而对比代码文件中引入的代码内容需要置于merged.py文件的源代码顶部,还需要将这部分引入置于merged.py文件的源代码顶部,并在相应的伪模块函数的内容中删除这部分引入,如此即可得到一个独立的目标代码文件。通过调用目标代码的引入函数,即可执行此目标代码文件,以实现Python项目的软件功能。
最后,使用Cython工具将merged.py文件编译为动态共享库文件,即可得到Python项目对应的包文件。Cython工具的具体编译过程是先将 merged.py文件编译为一个“.c”格式的文件,再将这个“.c”格式的文件编译为动态共享库文件,相当于针对merged.py文件实现二进制机器码级别的加密处理,并且还加密了Python项目的文件组织结构,所得到的动态共享库文件很难反编译成Python项目的源代码,也不会泄露Python项目的文件组织结构,对Python项目的源代码的保密性极高。
如果Python项目用于进行模型训练,并且入口函数为train函数,在将动态共享库文件发布到开源项目共享平台之后,用户通过“from merged import train”语句即可开启Python项目的模型训练过程。
图12是根据一示例性实施例示出的一种软件项目的包文件生成装置的框图。该装置具体可以加载在图1所示实施环境中的代码处理服务器200中,具体包括信息获取模块610、递归查找模块630、文件合并模块650和文件编译模块670。
信息获取模块610用于获取软件项目所包含的文件目录。递归查找模块 630用于从软件项目的入口代码文件开始,递归查找文件目录中具有引入关系的代码文件。文件合并模块650用于将查找到的代码文件进行合并处理,生成目标代码文件,并根据入口代码文件中含有的入口参数在目标代码文件中添加入口函数。文件编译模块670用于对目标代码文件进行编译处理,获得软件项目对应的包文件。
在另一示例性实施例中,文件合并模块650包括函数装饰单元和函数何合并单元。函数装饰单元用于根据定义的装饰器函数,将查找到的代码文件装饰为伪模块函数。函数合并单元用于将装饰器函数以及装饰得到的伪模块函数合并至目标代码文件中,所述目标代码文件中的伪模块函数在被执行时引入目标代码文件中的其它伪模块函数。
在另一示例性实施例中,函数装饰单元包括函数生成子单元和描述替换子单元。函数生成子单元用于生成查找到的各个代码文件所对应的伪模块函数,伪模块函数的函数名为相应代码文件的包名,伪模块函数的函数体为相应代码文件中的所有代码。描述替换子单元用于将伪模块函数中关于代码文件的引入描述替换为关于代码文件所对应伪模块函数的调用描述。
在另一示例性实施例中,函数装饰单元还包括目录文件获取子单元和目录文件添加子单元。目录文件获取子单元用于从软件项目中查找伪模块函数对应的代码文件的所有父级目录下的目录文件。目录文件添加子单元用于将查找到的目录文件所对应的代码内容添加到伪模块函数的函数体中。
在另一示例性实施例中,文件合并模块650还包括特殊引入确定单元和特殊引入处理单元。特殊引入确定单元用于确定伪模块函数中含有的特殊引入描述。特殊引入处理单元用于将特殊引入描述从伪模块函数中删除,并将特殊引入描述添加至目标代码文件中的源代码顶部。
在另一示例性实施例中,该装置还包括文件遍历模块和路径替换模块。文件遍历模块用于遍历查找文件目录中的代码文件之间的引入方式。路径替换模块用于在查找到第一代码文件以相对路径的方式引入了第二代码文件的情况下,则将相对路径替换为第二代码文件在所述文件目录中的绝对路径。
在另一示例性实施例中,该装置还包括文件遍历模块和参数替换模块。文件遍历模块用于遍历查找文件目录中的代码文件之间的引入方式。参数替换模块用于在查找到第三代码文件以概括性引入的方式引入了第四代码文件中的所有代码参数的情况下,则将概括性引入替换为第四代码文件中的所有代码参数的真实引入。
在另一示例性实施例中,参数替换模块包括包名确定单元、数组获取单元和数组替换单元。包名确定单元用于获取所述第四代码文件对应的包名。数组获取单元用于基于包名,在字典文件中查找与包名相关联的数组信息,数组信息对应于第四代码文件中的所有代码参数。数组替换单元用于将第三代码文件中关于概括性引入的代码部分替换为数组信息对应的所有代码参数。
在另一示例性实施例中,参数替换模块还包括集合获取单元、数组查找单元和字典生成单元。集合获取单元用于将软件项目含有的各个第四代码文件对应的包名加入预设集合。数组查找单元用于在软件项目中查找预设集合中的各个包名对应的第四代码文件所含有的内建数组,内建数组中含有第四代码文件中的所有代码参数。字典生成单元用于将各个包名作为键,以及将针对各个包名查找到的所有代码参数作为键对应的值存入字典文件中。
在另一示例性实施例中,参数替换模块包括路径获取单元和查找替换单元。路径获取单元用于获取第四代码文件对应的包名,包名含有第四代码文件在软件项目中的文件路径。查找替换单元用于根据文件路径,从软件项目中查找第四文件中含有的所有代码参数,并将第三代码文件中关于概括性引入的代码部分替换为查找到的所有代码参数。
在另一示例性实施例中,文件编译模块670包括第一编译单元和第二编译单元。第一编译单元用于对目标代码文件编译得到二进制机器码级别的加密文件。第二编译单元用于将二进制机器码级别的加密文件编译为动态共享库文件,并将动态共享库文件作为软件项目对应的包文件。
在另一示例性实施例中,该装置还包括文件发布模块,用于将软件项目对应的包文件发布至开源项目共享平台,以使得外部软件通过调用包文件中的入口函数启动执行软件项目。
需要说明的是,上述实施例所提供的装置与上述实施例所提供的方法属于同一构思,其中各个模块和单元执行操作的具体方式已经在方法实施例中进行了详细描述,此处不再赘述。
本申请的实施例还提供了一种软件项目的包文件生成设备,包括处理器和存储器,其中,存储器上存储有计算机可读指令,该计算机可读指令被处理器执行时实现如前所述的软件项目的包文件生成方法。
图13是根据一示例性实施例示出的一种软件项目的包文件生成设备的结构示意图。
需要说明的是,该软件项目的包文件生成设备只是一个适配于本申请的示例,不能认为是提供了对本申请的使用范围的任何限制。该软件项目的包文件生成设备也不能解释为需要依赖于或者必须具有图13中示出的示例性的软件项目的包文件生成设备中的一个或者多个组件。
如图13所示,在一示例性实施例中,软件项目的包文件生成设备包括处理组件801、存储器802、电源组件803、多媒体组件804、音频组件805、传感器组件807和通信组件808。其中,上述组件并不全是必须的,软件项目的包文件生成设备可以根据自身功能需求增加其他组件或减少某些组件,本实施例不作限定。
处理组件801通常控制软件项目的包文件生成设备的整体操作,诸如与显示、数据通信以及日志数据处理相关联的操作等。处理组件801可以包括一个或多个处理器809来执行指令,以完成上述操作的全部或部分步骤。此外,处理组件801可以包括一个或多个模块,便于处理组件801和其他组件之间的交互。例如,处理组件801可以包括多媒体模块,以方便多媒体组件 804和处理组件801之间的交互。
存储器802被配置为存储各种类型的数据以支持在软件项目的包文件生成设备的操作,这些数据的示例包括用于在软件项目的包文件生成设备上操作的任何应用程序或方法的指令。存储器802中存储有一个或多个模块,该一个或多个模块被配置成由该一个或多个处理器809执行,以完成上述实施例中所描述的软件项目的包文件生成方法中的全部或者部分步骤。
电源组件803为软件项目的包文件生成设备的各种组件提供电力。电源组件803可以包括电源管理系统,一个或多个电源,及其他与为软件项目的包文件生成设备生成、管理和分配电力相关联的组件。
多媒体组件804包括在软件项目的包文件生成设备和用户之间的提供一个输出接口的屏幕。在一些实施例中,屏幕可以包括TP(Touch Panel,触摸面板)和LCD(LiquidCrystal Display,液晶显示器)。如果屏幕包括触摸面板,屏幕可以被实现为触摸屏,以接收来自用户的输入信号。触摸面板包括一个或多个触摸传感器以感测触摸、滑动和触摸面板上的手势。所述触摸传感器可以不仅感测触摸或滑动动作的边界,而且还检测与所述触摸或滑动操作相关的持续时间和压力。
音频组件805被配置为输出和/或输入音频信号。例如,音频组件805包括一个麦克风,当软件项目的包文件生成设备处于操作模式,如呼叫模式、记录模式和语音识别模式时,麦克风被配置为接收外部音频信号。在一些实施例中,音频组件805还包括一个扬声器,用于输出音频信号。
传感器组件807包括一个或多个传感器,用于为软件项目的包文件生成设备提供各个方面的状态评估。例如,传感器组件807可以检测到软件项目的包文件生成设备的打开/关闭状态,还可以检测软件项目的包文件生成设备的温度变化。
通信组件808被配置为便于软件项目的包文件生成设备和其他设备之间有线或无线方式的通信。软件项目的包文件生成设备可以接入基于通信标准的无线网络,例如Wi-Fi(Wireless-Fidelity,无线网络)。
可以理解,图13所示的结构仅为示意,软件项目的包文件生成设备该可以包括比图13中所示更多或更少的组件,或者具有与图13所示不同的组件。图13中所示的各组件均可以采用硬件、软件或者其组合来实现。
本申请的另一方面还提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如前所述的软件项目的包文件生成方法。该计算机可读存储介质可以是上述实施例中描述的软件项目的包文件生成设备中所包含的,也可以是单独存在,而未装配入该软件项目的包文件生成设备中。
本申请的另一方面还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各个实施例中提供的软件项目的包文件生成方法。
上述内容,仅为本申请的较佳示例性实施例,并非用于限制本申请的实施方案,本领域普通技术人员根据本申请的主要构思和精神,可以十分方便地进行相应的变通或修改,故本申请的保护范围应以权利要求书所要求的保护范围为准。
Claims (15)
1.一种软件项目的包文件生成方法,其特征在于,包括:
获取软件项目所包含的文件目录;
从所述软件项目的入口代码文件开始,递归查找所述文件目录中具有引入关系的代码文件;
将查找到的代码文件进行合并处理,生成目标代码文件,并根据所述入口代码文件中含有的入口参数在所述目标代码文件中添加入口函数;
对所述目标代码文件进行编译处理,获得所述软件项目对应的包文件。
2.根据权利要求1所述的方法,其特征在于,将查找到的代码文件进行合并处理,生成目标代码文件,包括:
根据定义的装饰器函数,将查找到的代码文件装饰为伪模块函数;
将所述装饰器函数以及装饰得到的伪模块函数合并至目标代码文件中,所述目标代码文件中的伪模块函数在被执行时引入所述目标代码文件中的其它伪模块函数。
3.根据权利要求2所述的方法,其特征在于,将查找到的代码文件装饰为伪模块函数,包括:
生成查找到的各个代码文件所对应的伪模块函数,所述伪模块函数的函数名为相应代码文件的包名,所述伪模块函数的函数体为相应代码文件中的所有代码;
将所述伪模块函数中关于代码文件的引入描述替换为关于代码文件所对应伪模块函数的调用描述。
4.根据权利3所述的方法,其特征在于,所述方法还包括:
从所述软件项目中查找伪模块函数对应的代码文件的所有父级目录下的目录文件;
将查找到的目录文件所对应的代码内容添加到所述伪模块函数的函数体中。
5.根据权利要求2所述的方法,其特征在于,所述方法还包括:
确定伪模块函数中含有的特殊引入描述;
将所述特殊引入描述从所述伪模块函数中删除,并将所述特殊引入描述添加至所述目标代码文件中的源代码顶部。
6.根据权利要求1所述的方法,其特征在于,在将查找到的代码文件进行合并处理之前,所述方法还包括:
遍历查找所述文件目录中的代码文件之间的引入方式;
如果查找到第一代码文件以相对路径的方式引入了第二代码文件,则将所述相对路径替换为所述第二代码文件在所述文件目录中的绝对路径。
7.根据权利要求1所述的方法,其特征在于,在将查找到的代码文件进行合并处理之前,所述方法还包括:
遍历查找所述文件目录中的代码文件之间的引入方式;
如果查找到第三代码文件以概括性引入的方式引入了第四代码文件中的所有代码参数,则将所述概括性引入替换为所述第四代码文件中的所有代码参数的真实引入。
8.根据权利要求7所述的方法,其特征在于,将所述概括性引入替换为所述第四代码文件中的所有代码参数的真实引入,包括:
获取所述第四代码文件对应的包名;
基于所述包名,在字典文件中查找与所述包名相关联的数组信息,所述数组信息对应于所述第四代码文件中的所有代码参数;
将所述第三代码文件中关于概括性引入的代码部分替换为所述数组信息对应的所有代码参数。
9.根据权利要求8所述的方法,其特征在于,在将所述概括性引入替换为所述所有代码参数的真实引入之前,所述方法还包括:
将软件项目含有的各个第四代码文件对应的包名加入预设集合;
在软件项目中查找所述预设集合中的各个包名对应的第四代码文件所含有的内建数组,所述内建数组中含有所述第四代码文件中的所有代码参数;
将所述各个包名作为键,以及将针对所述各个包名查找到的所有代码参数作为所述键对应的值存入所述字典文件中。
10.根据权利要求7所述的方法,其特征在于,将所述概括性引入替换为所述第四代码文件中的所有代码参数的真实引入,包括:
获取所述第四代码文件对应的包名,所述包名含有所述第四代码文件在软件项目中的文件路径;
根据所述文件路径,从所述软件项目中查找所述第四文件中含有的所有代码参数,并将所述第三代码文件中关于概括性引入的代码部分替换为查找到的所有代码参数。
11.根据权利要求1所述的方法,其特征在于,对所述目标代码文件进行编译处理,包括:
对所述目标代码文件编译得到二进制机器码级别的加密文件;
将所述二进制机器码级别的加密文件编译为动态共享库文件,并将所述动态共享库文件作为所述软件项目对应的包文件。
12.根据权利要求1至11中任一项所述的方法,其特征在于,在获得所述软件项目对应的包文件之后,所述方法还包括:
将所述软件项目对应的包文件发布至开源项目共享平台,以使得外部软件通过调用所述包文件中的入口函数启动执行所述软件项目。
13.一种软件项目的包文件生成装置,其特征在于,包括:
信息获取模块,用于获取软件项目所包含的文件目录;
递归查找模块,用于从所述软件项目的入口代码文件开始,递归查找所述文件目录中具有引入关系的代码文件;
文件合并模块,用于将查找到的代码文件进行合并处理,生成目标代码文件,并根据所述入口代码文件中含有的入口参数在所述目标代码文件中添加入口函数;
文件编译模块,用于对所述目标代码文件进行编译处理,获得所述软件项目对应的包文件。
14.一种软件项目的包文件生成设备,其特征在于,包括:
存储器,存储有计算机可读指令;
处理器,读取存储器存储的计算机可读指令,以执行权利要求1-12中的任一项所述的方法。
15.一种计算机可读存储介质,其特征在于,其上存储有计算机可读指令,当所述计算机可读指令被计算机的处理器执行时,使计算机执行权利要求1-12中的任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010702946.8A CN111880805A (zh) | 2020-07-20 | 2020-07-20 | 软件项目的包文件生成方法及装置、设备、存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010702946.8A CN111880805A (zh) | 2020-07-20 | 2020-07-20 | 软件项目的包文件生成方法及装置、设备、存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111880805A true CN111880805A (zh) | 2020-11-03 |
Family
ID=73154569
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010702946.8A Pending CN111880805A (zh) | 2020-07-20 | 2020-07-20 | 软件项目的包文件生成方法及装置、设备、存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111880805A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116208500A (zh) * | 2023-03-07 | 2023-06-02 | 天津大学 | 基于Python修饰器的无感知本地代码云函数化部署调用方法 |
-
2020
- 2020-07-20 CN CN202010702946.8A patent/CN111880805A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116208500A (zh) * | 2023-03-07 | 2023-06-02 | 天津大学 | 基于Python修饰器的无感知本地代码云函数化部署调用方法 |
CN116208500B (zh) * | 2023-03-07 | 2023-08-01 | 天津大学 | 基于Python修饰器的无感知本地代码云函数化部署调用方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106980504B (zh) | 一种应用程序开发方法及其工具、设备 | |
CN105765527A (zh) | 用于定制的软件开发包(sdk)的方法和装置 | |
US10452369B2 (en) | Code profiling of executable library for pipeline parallelization | |
CN111507086A (zh) | 本地化应用程序中翻译文本位置的自动发现 | |
US10241759B2 (en) | Detecting open source components built into mobile applications | |
CN114035805A (zh) | 用于预编译器的代码转换方法、装置、介质及设备 | |
CN114238948A (zh) | 一种应用程序检测方法、装置、电子设备及存储介质 | |
CN111414350A (zh) | 一种服务生成方法及装置 | |
CN110457869B (zh) | 程序编译加密方法、装置、存储介质及电子设备 | |
CN107133036B (zh) | 一种模块的管理方法及装置 | |
CN115599386A (zh) | 代码生成方法、装置、设备及存储介质 | |
CN111880805A (zh) | 软件项目的包文件生成方法及装置、设备、存储介质 | |
US9747448B2 (en) | Cryptographic mechanisms to provide information privacy and integrity | |
CN112416303A (zh) | 软件开发工具包热修复方法、装置及电子设备 | |
CN115203674A (zh) | 一种应用程序自动登录方法、系统、装置及存储介质 | |
CN111539200B (zh) | 一种生成富文本的方法、装置、介质和电子设备 | |
CN113704120A (zh) | 数据传输方法、装置、设备及存储介质 | |
Fehlmann et al. | ART for Agile: Autonomous Real-Time Testing in the Product Development Cycle | |
US20120110476A1 (en) | My online 3D E library | |
CN113420288B (zh) | 一种容器镜像敏感信息检测系统及方法 | |
CN113835748B (zh) | 基于html5的应用程序的打包方法、系统和可读介质 | |
Pieterse et al. | Evaluation of smartphone data using a reference architecture | |
JP2018005915A (ja) | アプリケーションパッケージを提供する方法およびシステム、アプリケーションを実行する方法およびシステム | |
CN117556392A (zh) | 代码混淆方法、装置、设备、存储介质及产品 | |
CN117272374A (zh) | 权限的控制方法及相关设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40031354 Country of ref document: HK |
|
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |