CN111176722B - 第三方库的文件版本检测方法、装置及存储介质 - Google Patents

第三方库的文件版本检测方法、装置及存储介质 Download PDF

Info

Publication number
CN111176722B
CN111176722B CN201911402035.7A CN201911402035A CN111176722B CN 111176722 B CN111176722 B CN 111176722B CN 201911402035 A CN201911402035 A CN 201911402035A CN 111176722 B CN111176722 B CN 111176722B
Authority
CN
China
Prior art keywords
version
plug
library
file
project
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.)
Active
Application number
CN201911402035.7A
Other languages
English (en)
Other versions
CN111176722A (zh
Inventor
冯俊
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Music Entertainment Technology Shenzhen Co Ltd
Original Assignee
Tencent Music Entertainment Technology Shenzhen Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Tencent Music Entertainment Technology Shenzhen Co Ltd filed Critical Tencent Music Entertainment Technology Shenzhen Co Ltd
Priority to CN201911402035.7A priority Critical patent/CN111176722B/zh
Publication of CN111176722A publication Critical patent/CN111176722A/zh
Application granted granted Critical
Publication of CN111176722B publication Critical patent/CN111176722B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Stored Programmes (AREA)

Abstract

本发明实施例公开了一种第三方库的文件版本检测方法、装置及存储介质。该方案通过在构建项目的过程中,添加具有预设功能的插件,对项目进行编译,并通过插件解析项目引用的第三方库的库文件,以得到库文件的版本类型,判断版本类型是否为预设类型,当判断出版本类型为预设类型时,由插件抛出异常并中断当前项目的编译。本申请实施例所提供的方案通过添加插件,可以实现在工程编译过程中,自动检测工程中是否存在预设类型的第三方库的库文件,无需开发人员人工进行检查,避免了人工检查可能存在的遗漏等问题,并且提高了第三方库的文件版本的检测效率。

Description

第三方库的文件版本检测方法、装置及存储介质
技术领域
本发明涉及数据处理技术领域,具体涉及一种第三方库的文件版本检测方法、装置及存储介质。
背景技术
在Android开发过程中,通常会通过引用AAR的方式来引用其他模块或者其他第三方类库,以拓展自身功能。引用AAR的方式是通过名称加版本号的形式。在开发阶段,经常会有很多AAR库处于不稳定状态,随时需要修改并发布,可能一天就要发布多次。为了满足这种需求,避免使用Release版本号时,每发布一个AAR就需要升级一个版本号的情况,Maven提供了SNAPSHOT版本号的定义:对于一个AAR,如果是SNAPSHOT版本的(在版本号后加“-SNAPSHOT”后缀),开发者可以发布多次,引用者无需升级版本号即可应用到最新的AAR代码。每次编译的时候,编译器会自动检测Maven仓库中是否有更新的SNAPSHOT(比本地的新),如果有则会重新下载AAR。
但是,SNAPSHOT仅适用于开发期间,对于同一个SNAPSHOT版本号,最终拉取到并参与编译的AAR不一定相同,因此最终编译出来的APK不是稳定可控的。所以,我们在发布最终Release版本的APK的时候,通常需要确认使用的AAR中没有SNAPSHOT版本,应全是Release版本的AAR。
目前主要采用的检测方案是人工进行检测,即手动确认所有使用到的AAR的版本无SNAPSHOT版本。但是由于Android工程中通常有许多子工程,AAR引用的定义散落在工程各处,人工检测容易遗漏,并且人工检查效率较低。
发明内容
本发明实施例提供一种第三方库的文件版本检测方法、装置及存储介质,旨在提升第三方库的文件版本的检测效率。
本发明实施例提供一种第三方库的文件版本检测方法,包括:
在构建项目的过程中,向Gradle工程注册预设接口,其中,所述接口为Gradle预留的接口;
通过所述接口定义解析规则,以封装成插件;
Gradle对所述插件进行自动编译,并声明使用所述插件;
对所述项目进行编译,并通过所述插件解析所述项目引用的第三方库的库文件,以得到所述库文件的版本类型,其中所述库文件的版本类型包括Snapshot版本和Release版本;
若所述版本类型为Snapshot版本,则由所述插件抛出异常并中断当前项目的编译。
本发明实施例还提供一种第三方库的文件版本检测装置,包括:
添加单元,用于在构建项目的过程中,添加具有预设功能的插件;
解析单元,用于对所述项目进行编译,并通过所述插件解析所述项目引用的第三方库的库文件,以得到所述库文件的版本类型,其中所述库文件的版本类型包括Snapshot版本和Release版本;
处理单元,用于当所述版本类型为Snapshot版本时,由所述插件抛出异常并中断当前项目的编译。
本发明实施例还提供一种存储介质,所述存储介质存储有多条指令,所述指令适于处理器进行加载,以执行本发明实施例所提供的任一第三方库的文件版本检测方法。
本发明实施例提供的第三方库的文件版本检测方案,通过在构建项目的过程中,添加具有预设功能的插件,对项目进行编译,并通过插件解析项目引用的第三方库的库文件,以得到库文件的版本类型,判断版本类型是否为预设类型,当判断出版本类型为预设类型时,由插件抛出异常并中断当前项目的编译。本申请实施例所提供的方案通过添加插件,可以实现在工程编译过程中,自动检测工程中是否存在预设类型的第三方库的库文件,无需开发人员人工进行检查,避免了人工检查可能存在的遗漏等问题,并且提高了第三方库的文件版本的检测效率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的人工检测第三方库的库文件版本的场景示意图;
图2a是本发明实施例提供的第三方库的文件版本检测方法的第一流程示意图;
图2b是本发明实施例提供的第三方库的文件版本检测方法的第二流程示意图;
图3a是本发明实施例提供的第三方库的文件版本检测装置的第一种结构示意图;
图3b是本发明实施例提供的第三方库的文件版本检测装置的第二种结构示意图;
图3c是本发明实施例提供的第三方库的文件版本检测装置的第三种结构示意图;
图4是本发明实施例提供的服务器的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本发明的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域技术人员显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。
本发明实施例提供一种第三方库的文件版本检测方法,该第三方库的文件版本检测方法的执行主体可以是本发明实施例提供的第三方库的文件版本检测装置,或者集成了该第三方库的文件版本检测装置的服务器,其中该第三方库的文件版本检测装置可以采用硬件或者软件的方式实现。
在描述本发明的技术方案之前,先对相关的技术术语进行简单解释:
Android:一个基于Linux内核的开放源代码移动操作系统,是目前主流的手机操作系统之一,本文所指的Android开发指的是基于Android系统的app应用开发。
AAR:一种Android中第三方库的存在形式。主要包含第三方库的代码和资源。AAR通常存在于maven仓库中。
Maven仓库:一个依赖管理系统,负责AAR的版本管理。
SNAPSHOT版本:表示当前AAR为快照版本,处于不稳定状态,使用同一个版本号可以多次发布,发布后会覆盖Maven仓库中的旧的同版本AAR。对于使用者而言,在不同时间通过相同的SNAPSHOT版本号获取到的AAR不一定相同。
Release版本:表示当前AAR为稳定状态,一个版本号只能被发布一次,对于使用者而言,一个版本号对应的AAR是恒定的。
Gradle:是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。
目前,在Android开发过程中,通常会通过引用AAR的方式来引用其他模块或者其他第三方类库,以拓展自身功能。引用AAR的方式是通过名称加版本号的形式,如图1所示,图1为本发明实施例提供的人工检测第三方库的库文件版本的场景示意图。
在如图1所示的场景当中,工程中含有三个子工程分别为:子工程-1、子工程-2、子工程-3,三个子工程各自在build.gradle中声明了依赖module-a,module-b,module-c三个AAR,且均为显式声明,开发者可以直接查看这三个build.gradle文件,来确认是否有SNAPSHOT版本的AAR。若module-c AAR间接依赖了module-d AAR,而module-d AAR为SNAPSHOT版本时,开发者将难以直接检测出module-d的存在,因为这个module-d依赖不是显式声明的。只能由开发者到maven仓库的网页中,通过查看module-c的pom文件进行分析,但这样的操作比较繁杂,效率较低。
如图2a所示,图2a是本发明实施例提供的第三方库的文件版本检测方法的第一流程示意图,该第三方库的文件版本检测方法的具体流程可以如下:
101、在构建项目的过程中,添加具有预设功能的插件。
其中,项目是由代码构成的应用程序。例如,项目可以为游戏、聊天工具、购物网站等应用程序。终端可以从服务器下载项目,并在终端中运行项目的代码,从而向终端的用户提供功能。
在一实施例中,上述插接件可以为Gradle插件。其中,编译Android App的插件叫做Android Plugin for Gradle。Android Studio的编译系统使用的就是Gradle,AndroidPlugin for Gradle增加了编译Android APP所需要的特性。虽然这个插件一般都是和Android Studio同步更新,但是它可以独立于Android Studio单独运行和更新。AndroidStudio创建的APP工程中可以在顶层的build.gradle文件buildscript里配置依赖的插件版本。使用Gradle插件好处在于在Gradle构建过程中涉及到的通用逻辑,如果将其封装成插件,就可在多个工程项目构建中复用。Gradle插件开发语言一般为Groovy、Java与Scala。不管使用哪种语言,最终都是以字节码的方式被引入Gradle。
由于Gradle允许自定义插件,所以可以使用任何语言来实现一个自定义插件,只要这个实现以字节码的形式编译即可。要自定义一个Gradle插件,需要写一个实现了Plugin接口的类。当你在构建脚本中应用该插件时,Gradle会实例化这个插件类,并调用插件类实例的Plugin.apply(T)方法。项目对象将作为参数被传递进去,插件类实例将使用它来配置项目。
其中,开发者在构建项目的过程中添加插件时需要定义其实现的功能,也即定义其依赖的解析规则,举例来说,上述规则可以为强制指定工程全局使用某个AAR的版本等。
在一实施例中,自定义插件的方式可以有多种,比如可以以构建脚本的方式自定义插件,这种方式就是直接在Android Studio app module的build.gradle中进行插件的编写,优点就是不用再上传插件到maven或者其它地方,项目就可以直接使用;缺点也是很明显,就是只能在自己的项目中使用,不能复用。也即,上述在构建项目的过程中,添加具有预设功能的插件的步骤,包括:
在构建项目的过程中,获取包含内部逻辑的Gradle脚本文件;
将所述脚本文件存储至工程根目录,并在build.gradle中调用所述脚本文件。
在其他实施例中,还可以以buildSrc的方式自定义插件,这种方式需要在项目中新建一个Module命名为buildSrc,这个目录就用来存放自定义插件(具体位置可以为:rootProjectDir/buildSrc/src/main/groovy/)。然后在src/main中建立两个目录,一个就是存放代码的groovy目录,一个是存放自定义插件名称的resources目录。Gradle将负责编译插件,并使其在构建脚本的类路径中可用。这种插件对于该构建下的每个构建脚本都是可见的。但是,它在构建之外是不可见的,所以你不能在定义它的构建之外重用插件。
在其他实施例中,还可以以独立项目的方式自定义插件,开发者可以创建一个独立的项目来自定义插件。这个项目可以生成并发布一个JAR包,你可以在多个构建中使用它,也可以与他人分享。通常,这个JAR包可能包括一些定制的插件,或者将几个相关的任务类捆绑到一个单独的库中,或者两者皆有。
102、对项目进行编译,并通过插件解析项目引用的第三方库的库文件,以得到库文件的版本类型。
其中,使用Android Studio开发Android应用时,避免不了需要借助Gradle引入各式各样的第三方库文件,帮助我们更好的开发App,常见的引入方式有:Jar文件,so文件,Library库文件,AAR文件,远程jcenter、maven仓库文件。这几种引入方式各有利弊,对应的gradle配置也有所不同。
在一实施例中,以引入AAR为例进行说明,AAR其实也是一个压缩文件,为Android库项目的二进制归档文件,包含所有资源,class以及res资源文件。其中引入AAR文件的方式可以为Module形式引入,具体的,可以选择File菜单,或者打开Project Structure界面,添加新的Module(New Module…),选择Import.JAR/.AAR Package,选择目标AAR文件导入。导入之后,在项目根目录下会自动生成一个新的文件夹放置AAR文件及其配置文件,然后打开app module目录下的build.gradle配置文件,在dependencies依赖项中添加配置即可。
在其他实施例中,还可以在libs目录中引入,具体的,可以将AAR文件复制到appmodule目录下的libs文件夹中,然后打开app module目录下的build.gradle配置文件,在android一栏中添加依赖,在重新同步以及编译工程完成后可以在app的build目录下生成对应AAR的临时文件,可以看到AAR文件中的Jar文件、资源文件等。
在一实施例中,在项目编译的过程中,可以检测项目是否引用第三方类库的AAR,若是,则可以通过插件解析项目引用的第三方库的库文件,以得到库文件的版本类型。其中,上述AAR的版本类型可以包括Snapshot版本和Release版本。上文已对这两种版本进行介绍,此处不再赘述。具体可以根据模块的版本号(pom文件中的version)中是否带有-SNAPSHOT来判断是快照版本还是正式版本。
103、判断版本类型是否为预设类型,若是则执行步骤104。
在一实施例中,由于正式环境当中不得使用Snapshot版本的库,因此通过上述插件可以判断引用的AAR的版本类型是否为预设类型,该预设类型可以为Snapshot版本,若确定AAR为Snapshot版本则执行步骤104,若判断AAR为Release版本,也即为正式发布版本,则可以继续在项目编译过程中执行步骤102。
104、当判断出版本类型为预设类型时,由插件抛出异常并中断当前项目的编译。
在一实施例中,当判断出上述第三方类库的AAR为Snapshot版本时,则抛出异常并中断当前项目的编译,然后由开发者进行修改。进一步的,若直到Gradle解析完所有引用的第三方类库的AAR,上述插件都没有抛出异常,则确定所有的AAR均为Release版本,APK编译正常结束。
在一实施例中,系统可以向服务器上传异常堆栈信息,该异常堆栈信息至少包括代码调用关系,开发人员对异常堆栈信息中的代码调用关系进行分析,确定出导致异常的代码,从而可以确定为Snapshot版本的第三方类库的AAR的名称,然后进行修改。
由上所述,本发明实施例提出的第三方库的文件版本检测方法可以在构建项目的过程中,添加具有预设功能的插件,对项目进行编译,并通过插件解析项目引用的第三方库的库文件,以得到库文件的版本类型,判断版本类型是否为预设类型,当判断出版本类型为预设类型时,由插件抛出异常并中断当前项目的编译。本申请实施例所提供的方案通过添加插件,可以实现在工程编译过程中,自动检测工程中是否存在预设类型的第三方库的库文件,无需开发人员人工进行检查,避免了人工检查可能存在的遗漏等问题,提高了第三方库的文件版本的检测效率,同时也保证了正确性。
根据前面实施例所描述的方法,以下将作进一步详细说明。
请参阅图2b,图2b是本发明实施例提供的第三方库的文件版本检测方法的第二流程示意图。所述方法包括:
201、在构建项目的过程中,向Gradle工程注册预设接口,其中,接口为Gradle预留的接口。
其中,上述接口为应用程序编程接口(Application Programming Interface,API):指一些预先定义的函数,其主要目的是让应用程序开发人员调用一组例程功能,而无须考虑其底层的源代码或理解其内部工作机制的细节。
在一实施例中,在工程准备开始编译之前,可以向Gradle工程注册ResolutionStrategy接口(Gradle预留的一个接口,主要用来自定义依赖的解析规则。
202、通过接口定义解析规则,以封装成插件,Gradle对插件进行自动编译,并声明使用插件。
由于Gradle允许自定义插件,所以可以使用任何语言来实现一个自定义插件,只要这个实现以字节码的形式编译即可。要自定义一个Gradle插件,需要写一个实现了Plugin接口的类。当你在构建脚本中应用该插件时,Gradle会实例化这个插件类,并调用插件类实例的Plugin.apply(T)方法。项目对象将作为参数被传递进去,插件类实例将使用它来配置项目。
在一实施例中,通过上述的ResolutionStrategy接口定义解析规则,例如强制指定工程全局使用某个AAR的版本等,以封装成插件,Gradle对插件进行自动编译,并声明使用该插件。
在一实施例中,自定义插件的方式可以有多种,比如可以以构建脚本的方式自定义插件,也即在gradle中直接创建,就是在gradle文件内新建一个,或者在项目或者工程的build.gradle里面去写一个类,来继承org.gradle.api.Plugin,并实现里面的apply方法。这种插件只能在这个文件内使用,局限性较大。
在其他实施例中,还可以以buildSrc的方式自定义插件,也即在buildSrc目录中创建,这种方式需要在工程下新建一个module,名字必须为buildSrc,在android studio里面创建一个library类型的module,然后删除main下面的java文件夹,新建一个groovy文件夹、包、groovy文件、resources/META-INF/gradle-plugins,然后在该文件夹下创建一个以.properties结尾的文件,前面部分就是需要引用的插件名称,文件内容譬如:
implementation-class=com.tb.plugin.TbPlugin
这就表示了这个插件对应的groovy具体的类。进一步的,TbPlugin文件可以如下:
因为groovy完全兼容java,但是又进行了扩展,所以开发者既可以使用groovy语言,也可以直接使用java去写代码,注意插件必须继承Plugin接口,然后就可以在apply方法去做自己想做的功能了。
在其他实施例中,还可以以独立项目的方式自定义插件,具体的,可以在工程里新建一个module,目录结构跟上面也基本上没有差别,唯一不同的是build.gradle文件,因为需要其他工程也可以引用,所以可以去发布成jar包,可以发布到本地,也可以直接把jar包放到lib下面,也可发布到maven仓库,如果想给所有人都能用,也可以发布到jcenter仓库。本实施例以发布到本地maven仓库为例说明,首先引入maven插件,然后指定maven发布需要的三个要素:groupId,artifactId,version。这三个也是后面我们引用的时候需要指定的东西,通过这三个要素,maven就可以找到我们指定的插件,第一个就是分组的id,第二个是工程名,第三个是版本号,最后发布到根工程目录下的tbPlugin文件夹下,在工程的build.gradle文件添加依赖和仓库地址,然后就可以在其他module去引用了,也可在其他工程去引用。
203、在项目进行编译的过程中,Gradle解析调用到的第三方库的库文件,其中调用方式包括直接调用或间接调用。
在一实施例中,引入第三方类库的方式可以包括:Jar文件,so文件,Library库文件,AAR文件,远程jcenter、maven仓库文件等。以引入AAR为例进行说明,其中引入AAR文件的方式可以为Module形式引入,具体的,可以选择File菜单,或者打开Project Structure界面,添加新的Module(New Module…),选择Import.JAR/.AAR Package,选择目标AAR文件导入。导入之后,在项目根目录下会自动生成一个新的文件夹放置AAR文件及其配置文件,然后打开app module目录下的build.gradle配置文件,在dependencies依赖项中添加配置即可。
在其他实施例中,还可以在libs目录中引入,具体的,可以将AAR文件复制到appmodule目录下的libs文件夹中,然后打开app module目录下的build.gradle配置文件,在android一栏中添加依赖,在重新同步以及编译工程完成后可以在app的build目录下生成对应AAR的临时文件,可以看到AAR文件中的Jar文件、资源文件等。
在一实施例中,在项目进行编译的过程中,工程可以在build.gradle中声明依赖的AAR,其中,上述声明方式包括显式声明和隐式声明,若声明方式为显式声明,即为直接调用AAR,若声明方式为隐式声明,即为间接调用AAR。
204、回调预设接口,并通过预设接口得到库文件的版本类型。
在一实施例中,Gradle会在编译过程中,解析所有直接或者间接调用到的AAR。每解析到一个AAR,会回调我们注册的ResolutionStrategy接口,然后在ResolutionStrategy接口中,根据传递进来的AAR文件信息,获取其版本类型。
具体的,上述AAR的版本类型可以包括Snapshot版本和Release版本。
205、判断版本类型是否为Snapshot版本,若是则执行步骤206。
在一实施例中,由于正式环境当中不得使用Snapshot版本的库,因此通过上述插件可以判断引用的AAR的版本类型是否为预设类型,该预设类型可以为Snapshot版本,若确定AAR为Snapshot版本则执行步骤206,若判断AAR为Release版本,也即为正式发布版本,则可以继续在项目编译过程中执行步骤203。
206、当判断出版本类型为Snapshot版本时,由插件抛出异常并中断当前项目的编译。
在一实施例中,当判断出上述第三方类库的AAR为Snapshot版本时,则抛出异常并中断当前项目的编译,然后由开发者进行修改。进一步的,若直到Gradle解析完所有引用的第三方类库的AAR,上述插件都没有抛出异常,则确定所有的AAR均为Release版本,APK编译正常结束。
207、当抛出异常时获取对应的第三方库的库文件名称,将库文件名称记录至异常堆栈当中,在日志系统当中查看。
在一实施例中,为了能使开发人员快速找到Snapshot版本的第三方类库的AAR的名称,可以在抛出异常时获取对应的第三方类库的AAR名称,并将该AAR名称记录至异常堆栈当中,然后将异常堆栈信息上报给服务器,在服务器获取到异常堆栈信息后,开发者可以通过查看日志系统对异常堆栈信息进行分析,从而直接得到AAR名称,然后可以快速的对其进行修改。
由上所述,本发明实施例提出的第三方库的文件版本检测方法可以在构建项目的过程中,向Gradle工程注册预设接口,其中,接口为Gradle预留的接口,通过接口定义解析规则,以封装成插件,Gradle对插件进行自动编译,并声明使用插件,在项目进行编译的过程中,Gradle解析调用到的第三方库的库文件,其中调用方式包括直接调用或间接调用,回调预设接口,并通过预设接口得到库文件的版本类型,判断版本类型是否为Snapshot版本,当判断出版本类型为Snapshot版本时,由插件抛出异常并中断当前项目的编译,当抛出异常时获取对应的第三方库的库文件名称,将库文件名称记录至异常堆栈当中,在日志系统当中查看。本申请实施例所提供的方案通过添加插件,可以实现在工程编译过程中,自动检测工程中是否存在Snapshot版本的第三方库的库文件,并在存在时直接确定对应SnapshotAAR的名称,无需开发人员人工进行检查,避免了人工检查可能存在的遗漏等问题,提高了第三方库的文件版本的检测效率,同时也保证了正确性。
为了实施以上方法,本发明实施例还提供一种第三方库的文件版本检测装置,该第三方库的文件版本检测装置具体可以集成在终端设备如手机、平板电脑等设备中。
例如,如图3a所示,是本发明实施例提供的第三方库的文件版本检测装置的第一种结构示意图。该第三方库的文件版本检测装置可以包括:
添加单元301,用于在构建项目的过程中,添加具有预设功能的插件。
在一实施例中,上述插接件可以为Gradle插件,由于Gradle允许自定义插件,所以可以使用任何语言来实现一个自定义插件,只要这个实现以字节码的形式编译即可。要自定义一个Gradle插件,需要写一个实现了Plugin接口的类。当你在构建脚本中应用该插件时,Gradle会实例化这个插件类,并调用插件类实例的Plugin.apply(T)方法。项目对象将作为参数被传递进去,插件类实例将使用它来配置项目。
其中,在构建项目的过程中由添加单元301添加插件时需要定义其实现的功能,也即定义其依赖的解析规则,举例来说,上述规则可以为强制指定工程全局使用某个AAR的版本等。
解析单元302,用于对所述项目进行编译,并通过所述插件解析所述项目引用的第三方库的库文件,以得到所述库文件的版本类型。
其中,使用Android Studio开发Android应用时,避免不了需要借助Gradle引入各式各样的第三方库文件,帮助我们更好的开发App,常见的引入方式有:Jar文件,so文件,Library库文件,AAR文件,远程jcenter、maven仓库文件。这几种引入方式各有利弊,对应的gradle配置也有所不同。
在一实施例中,在项目编译的过程中,可以检测项目是否引用第三方类库的AAR,若是,则可以通过解析单元302解析项目引用的第三方库的库文件,以得到库文件的版本类型。其中,上述AAR的版本类型可以包括Snapshot版本和Release版本。上文已对这两种版本进行介绍,此处不再赘述。具体可以根据模块的版本号(pom文件中的version)中是否带有-SNAPSHOT来判断是快照版本还是正式版本。
判断单元303,用于判断所述版本类型是否为预设类型。
在一实施例中,由于正式环境当中不得使用Snapshot版本的库,因此通过判断单元303可以判断引用的AAR的版本类型是否为预设类型,该预设类型可以为Snapshot版本,若确定AAR为Snapshot版本则由处理单元304进行处理,若判断AAR为Release版本,也即为正式发布版本,则可以继续在项目编译过程中通过解析单元302进行解析。
处理单元304,用于当所述判断单元303判断为是时,由所述插件抛出异常并中断当前项目的编译。
在一实施例中,当判断出上述第三方类库的AAR为Snapshot版本时,处理单元304抛出异常并中断当前项目的编译,然后由开发者进行修改。进一步的,若直到Gradle解析完所有引用的第三方类库的AAR,上述插件都没有抛出异常,则确定所有的AAR均为Release版本,APK编译正常结束。
在一实施例中,请参阅图3b,所述添加单元301可以包括:
注册子单元3011,用于在构建项目的过程中,向Gradle工程注册预设接口,其中,所述接口为Gradle预留的接口;
定义子单元3012,用于通过所述接口定义解析规则,以封装成插件;
声明子单元3013,用于使用Gradle对所述插件进行自动编译,并声明使用所述插件。
进一步的,所述解析单元302可以包括:
解析子单元3021,用于在所述项目进行编译的过程中,Gradle解析调用到的第三方库的库文件,其中所述调用方式包括直接调用或间接调用;
获取子单元3022,用于回调所述预设接口,并通过所述预设接口得到所述库文件的版本类型。
在一实施例中,请参阅图3c,所述第三方库的文件版本检测装置还可以包括:
获取单元305,用于在所述处理单元304通过所述插件抛出异常并中断当前项目的编译之后,获取对应的第三方库的库文件名称;
记录单元306,用于将所述库文件名称记录至异常堆栈当中,在日志系统当中查看。
具体实施时,以上各个单元可以作为独立的实体来实现,也可以进行任意组合,作为同一或若干个实体来实现,以上各个单元的具体实施可参见前面的方法实施例,在此不再赘述。
应当说明的是,本发明实施例提供的第三方库的文件版本检测装置与上文实施例中的第三方库的文件版本检测方法属于同一构思,在第三方库的文件版本检测装置上可以运行第三方库的文件版本检测方法实施例中提供的任一方法,其具体实现过程详见第三方库的文件版本检测方法实施例,此处不再赘述。
本发明实施例提出的第三方库的文件版本检测装置,通过在构建项目的过程中,由添加单元301添加具有预设功能的插件,对项目进行编译,并通过解析单元302解析项目引用的第三方库的库文件,以得到库文件的版本类型,判断单元303判断版本类型是否为预设类型,当判断出版本类型为预设类型时,由处理单元304抛出异常并中断当前项目的编译。本申请实施例所提供的方案通过添加插件,可以实现在工程编译过程中,自动检测工程中是否存在预设类型的第三方库的库文件,无需开发人员人工进行检查,避免了人工检查可能存在的遗漏等问题,提高了第三方库的文件版本的检测效率,同时也保证了正确性。
本发明实施例还提供一种服务器,如图4所示,其示出了本发明实施例所涉及的服务器的结构示意图,具体来讲:
该服务器可以包括一个或者一个以上处理核心的处理器401、一个或一个以上计算机可读存储介质的存储器402、电源403和输入单元404等部件。本领域技术人员可以理解,图4中示出的服务器结构并不构成对服务器的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
其中:
处理器401是该电子设备的控制中心,利用各种接口和线路连接整个电子设备的各个部分,通过运行或执行存储在存储器402内的软件程序和/或单元,以及调用存储在存储器402内的数据,执行电子设备的各种功能和处理数据,从而对电子设备进行整体监控。可选的,处理器401可包括一个或多个处理核心;优选的,处理器401可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器401中。
存储器402可用于存储软件程序以及单元,处理器401通过运行存储在存储器402的软件程序以及单元,从而执行各种功能应用以及数据处理。存储器402可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据电子设备的使用所创建的数据等。此外,存储器402可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器402还可以包括存储器控制器,以提供处理器401对存储器402的访问。
服务器还包括给各个部件供电的电源403,优选的,电源403可以通过电源管理系统与处理器401逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源403还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
该服务器还可包括输入单元404,该输入单元404可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。
尽管未示出,服务器还可以包括显示单元等,在此不再赘述。具体在本实施例中,服务器中的处理器401会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器402中,并由处理器401来运行存储在存储器402中的应用程序,从而实现各种功能,如下:
在构建项目的过程中,向Gradle工程注册预设接口,其中,所述接口为Gradle预留的接口;
通过所述接口定义解析规则,以封装成插件;
Gradle对所述插件进行自动编译,并声明使用所述插件;
对所述项目进行编译,并通过所述插件解析所述项目引用的第三方库的库文件,以得到所述库文件的版本类型,其中所述库文件的版本类型包括Snapshot版本和Release版本;
若所述版本类型为Snapshot版本,则由所述插件抛出异常并中断当前项目的编译。
在一些实施例中,在构建项目的过程中,添加具有预设功能的插件时,处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:
在构建项目的过程中,向Gradle工程注册预设接口,其中,所述接口为Gradle预留的接口;
通过所述接口定义解析规则,以封装成插件;
Gradle对所述插件进行自动编译,并声明使用所述插件。
在一些实施例中,在对所述项目进行编译,并通过所述插件解析所述项目引用的第三方库的库文件,以得到所述库文件的版本类型时,处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:
在所述项目进行编译的过程中,Gradle解析调用到的第三方库的库文件,其中所述调用方式包括直接调用或间接调用;
回调所述预设接口,并通过所述预设接口得到所述库文件的版本类型。
在一些实施例中,所述解析规则为强制指定所述Gradle工程全局使用Release版本的库文件。
在一些实施例中,在由所述插件抛出异常并中断当前项目的编译之后,处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:
当抛出异常时获取对应的第三方库的库文件名称;
将所述库文件名称记录至异常堆栈当中,在日志系统当中查看。
在一些实施例中,在构建项目的过程中,添加具有预设功能的插件时,处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:
在构建项目的过程中,获取包含内部逻辑的Gradle脚本文件;
将所述脚本文件存储至工程根目录,并在build.gradle中调用所述脚本文件。
以上各个操作的具体实施可参见前面的实施例,在此不再赘述。
本领域普通技术人员可以理解,上述实施例的各种方法中的全部或部分步骤可以通过指令来完成,或通过指令控制相关的硬件来完成,该指令可以存储于一计算机可读存储介质中,并由处理器进行加载和执行。
由上所述,本发明实施例提出的服务器,通过在构建项目的过程中,添加具有预设功能的插件,对项目进行编译,并通过插件解析项目引用的第三方库的库文件,以得到库文件的版本类型,判断版本类型是否为预设类型,当判断出版本类型为预设类型时,由插件抛出异常并中断当前项目的编译。本申请实施例所提供的方案通过添加插件,可以实现在工程编译过程中,自动检测工程中是否存在预设类型的第三方库的库文件,无需开发人员人工进行检查,避免了人工检查可能存在的遗漏等问题,并且提高了第三方库的文件版本的检测效率。
另外,本发明实施例还提供一种存储介质,其中存储有多条指令,该指令能够被处理器进行加载,以执行本发明实施例所提供的任一种第三方库的文件版本检测方法中。例如,该指令可以执行:
在构建项目的过程中,向Gradle工程注册预设接口,其中,所述接口为Gradle预留的接口;
通过所述接口定义解析规则,以封装成插件;
Gradle对所述插件进行自动编译,并声明使用所述插件;
对所述项目进行编译,并通过所述插件解析所述项目引用的第三方库的库文件,以得到所述库文件的版本类型,其中所述库文件的版本类型包括Snapshot版本和Release版本;
若所述版本类型为Snapshot版本,则由所述插件抛出异常并中断当前项目的编译。
以上操作的具体实施可参见前面的实施例,在此不再赘述。
其中,该存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取记忆体(RAM,Random Access Memory)、磁盘或光盘等。
由于该存储介质中所存储的指令,可以执行本发明实施例所提供的任一种第三方库的文件版本检测方法,因此,可以实现本发明实施例所提供的任一种第三方库的文件版本检测方法所能实现的有益效果,详见前面的实施例,在此不再赘述。以上对本发明实施例所提供的一种第三方库的文件版本检测方法、装置及存储介质进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上,本说明书内容不应理解为对本发明的限制。

Claims (10)

1.一种第三方库的文件版本检测方法,其特征在于,包括:
在构建项目的过程中,向Gradle工程注册预设接口,其中,所述接口为Gradle预留的接口;
通过所述接口定义解析规则,以封装成插件;
Gradle对所述插件进行自动编译,并声明使用所述插件;
对所述项目进行编译,并通过所述插件解析所述项目引用的第三方库的库文件,以得到所述库文件的版本类型,其中所述库文件的版本类型包括Snapshot版本和Release版本;
若所述版本类型为Snapshot版本,则由所述插件抛出异常并中断当前项目的编译;
所述插件为Gradle插件,所述通过所述接口定义解析规则,封装成插件,包括:
生成实现了所述接口的插件类;
在构建脚本中应用该插件时,实例化所述插件类,得到插件类实例,并调用所述插件类实例的Plugin.apply(T)方法。
2.如权利要求1所述的第三方库的文件版本检测方法,其特征在于,对所述项目进行编译,并通过所述插件解析所述项目引用的第三方库的库文件,以得到所述库文件的版本类型,包括:
在所述项目进行编译的过程中,Gradle解析调用到的第三方库的库文件,其中所述调用方式包括直接调用或间接调用;
回调所述预设接口,并通过所述预设接口得到所述库文件的版本类型。
3.如权利要求1所述的第三方库的文件版本检测方法,其特征在于,在由所述插件抛出异常并中断当前项目的编译之后,所述方法还包括:
当抛出异常时获取对应的第三方库的库文件名称;
将所述库文件名称记录至异常堆栈当中,在日志系统当中查看。
4.如权利要求1所述的第三方库的文件版本检测方法,其特征在于,所述方法还包括:
在构建项目的过程中,获取包含内部逻辑的Gradle脚本文件;
将所述脚本文件存储至工程根目录,并在build.gradle中调用所述脚本文件。
5.如权利要求1所述的第三方库的文件版本检测方法,其特征在于,所述解析规则为强制指定所述Gradle工程全局使用Release版本的库文件。
6.一种第三方库的文件版本检测装置,其特征在于,包括:
添加单元,用于在构建项目的过程中,添加具有预设功能的插件;
解析单元,用于对所述项目进行编译,并通过所述插件解析所述项目引用的第三方库的库文件,以得到所述库文件的版本类型,其中所述库文件的版本类型包括Snapshot版本和Release版本;
处理单元,用于当所述版本类型为Snapshot版本时,由所述插件抛出异常并中断当前项目的编译;
所述插件为Gradle插件,通过接口定义解析规则,封装成插件,包括:
生成实现了所述接口的插件类;
在构建脚本中应用该插件时,实例化所述插件类,得到插件类实例,并调用所述插件类实例的Plugin.apply(T)方法。
7.如权利要求6所述的第三方库的文件版本检测装置,其特征在于,所述添加单元包括:
注册子单元,用于在构建项目的过程中,向Gradle工程注册预设接口,其中,所述接口为Gradle预留的接口;
定义子单元,用于通过所述接口定义解析规则,以封装成插件;
声明子单元,用于使用Gradle对所述插件进行自动编译,并声明使用所述插件。
8.如权利要求7所述的第三方库的文件版本检测装置,其特征在于,所述解析单元,包括:
解析子单元,用于在所述项目进行编译的过程中,Gradle解析调用到的第三方库的库文件,其中所述调用方式包括直接调用或间接调用;
获取子单元,用于回调所述预设接口,并通过所述预设接口得到所述库文件的版本类型。
9.如权利要求6所述的第三方库的文件版本检测装置,其特征在于,所述装置还包括:
获取单元,用于在所述处理单元通过所述插件抛出异常并中断当前项目的编译之后,获取对应的第三方库的库文件名称;
记录单元,用于将所述库文件名称记录至异常堆栈当中,在日志系统当中查看。
10.一种存储介质,其特征在于,所述存储介质存储有多条指令,所述指令适于处理器进行加载,以执行权利要求1至5任一项所述的第三方库的文件版本检测方法。
CN201911402035.7A 2019-12-30 2019-12-30 第三方库的文件版本检测方法、装置及存储介质 Active CN111176722B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911402035.7A CN111176722B (zh) 2019-12-30 2019-12-30 第三方库的文件版本检测方法、装置及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911402035.7A CN111176722B (zh) 2019-12-30 2019-12-30 第三方库的文件版本检测方法、装置及存储介质

Publications (2)

Publication Number Publication Date
CN111176722A CN111176722A (zh) 2020-05-19
CN111176722B true CN111176722B (zh) 2023-12-26

Family

ID=70650629

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911402035.7A Active CN111176722B (zh) 2019-12-30 2019-12-30 第三方库的文件版本检测方法、装置及存储介质

Country Status (1)

Country Link
CN (1) CN111176722B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111752548A (zh) * 2020-05-22 2020-10-09 网宿科技股份有限公司 一种sdk嵌入方法及装置、计算机可读存储介质
CN111475422A (zh) * 2020-06-28 2020-07-31 四川新网银行股份有限公司 一种基于Jenkins工具的依赖检查方法
CN112363758A (zh) * 2020-11-03 2021-02-12 深圳开源互联网安全技术有限公司 一种获取开源项目第三方组件信息的方法及装置
CN112416428A (zh) * 2021-01-25 2021-02-26 北京映客芝士网络科技有限公司 一种安卓包体积优化方法、装置、存储介质及电子设备
CN118409735B (zh) * 2024-07-03 2024-10-11 天津南大通用数据技术股份有限公司 yat自动化框架集成扩展方法、装置、终端及存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107844313A (zh) * 2017-11-24 2018-03-27 武汉斗鱼网络科技有限公司 一种Android中SDK版本升级方法及装置
CN108197020A (zh) * 2017-12-28 2018-06-22 掌阅科技股份有限公司 插件校验方法、电子设备及计算机存储介质
US10255065B1 (en) * 2017-12-29 2019-04-09 Semmle Limited Automatically building software projects

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8656343B2 (en) * 2012-02-09 2014-02-18 Sonatype, Inc. System and method of providing real-time updates related to in-use artifacts in a software development environment
US9519468B2 (en) * 2015-02-13 2016-12-13 Oracle International Corporation Modular co-versioning in a dynamically linked runtime environment
US10379846B1 (en) * 2018-01-25 2019-08-13 Walmart Apollo, Llc Systems and methods for real time version control for integrating updated web-based components with a native application
CN110471830B (zh) * 2018-05-10 2022-06-21 武汉斗鱼网络科技有限公司 一种程序测试方法、装置及电子设备

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107844313A (zh) * 2017-11-24 2018-03-27 武汉斗鱼网络科技有限公司 一种Android中SDK版本升级方法及装置
CN108197020A (zh) * 2017-12-28 2018-06-22 掌阅科技股份有限公司 插件校验方法、电子设备及计算机存储介质
US10255065B1 (en) * 2017-12-29 2019-04-09 Semmle Limited Automatically building software projects

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
常丽梅.Android移动应用缺陷监测系统的设计与实现.《中国优秀硕士学位论文全文数据库 信息科技辑》.2018,第I140-883页. *

Also Published As

Publication number Publication date
CN111176722A (zh) 2020-05-19

Similar Documents

Publication Publication Date Title
CN111176722B (zh) 第三方库的文件版本检测方法、装置及存储介质
US11853774B2 (en) Dynamically loaded plugin architecture
US8954939B2 (en) Extending a development environment
Richter CLR via C
CA2704980C (en) Contract programming for code error reduction
US20160232017A1 (en) System and Method for Reloading Constructors
US20040268301A1 (en) Adding new compiler methods to an integrated development environment
US20110307858A1 (en) Pre-compiling hosted managed code
CN110990019B (zh) 一种Java类分析方法、装置、存储介质及电子设备
US20190004774A1 (en) Automated source code adaption to inject features between platform versions
KR20170097360A (ko) 패키지 파일에 대한 기능 확장 방법 및 시스템
US9459986B2 (en) Automatic generation of analysis-equivalent application constructs
US10514898B2 (en) Method and system to develop, deploy, test, and manage platform-independent software
US9152442B2 (en) Callbacks in virtual machines
CN112083968A (zh) 一种宿主中插件加载方法及装置
CN111880804A (zh) 应用程序代码的处理方法及装置
EP2885712B1 (en) Imperative attribution for elements in managed runtimes
CN107766119A (zh) 一种脚本语言接口的处理方法、装置和设备
CN111352631A (zh) 一种接口兼容性检测方法及装置
KR20180048518A (ko) 패키지 파일에 대한 기능 확장 방법 및 시스템
Linka Visual Studio refactoring and code style management toolset
CN116339861A (zh) 程序运行方法、装置、存储介质及计算机设备

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant