程序安装包处理方法、装置、电子设备和计算机可读存储介质与流程

文档序号:20874621发布日期:2020-05-26 16:19阅读:242来源:国知局
程序安装包处理方法、装置、电子设备和计算机可读存储介质与流程

本发明涉及数据处理技术领域,具体而言,涉及一种程序安装包处理方法、装置、电子设备和计算机可读存储介质。



背景技术:

程序安装包的包体积对用户来说,希望越小越好,以避免占用用户端设备的可用空间。完整的程序安装包的包体积是由可执行代码、资源文件等组成,为了减小程序安装包的包体积,可以对可执行代码进行处理,例如,进行混淆处理。然而,在真正的项目开发中,由于多种原因,导致程序安装包的体积没有被精减下来。因而,提供一种能够精减程序安装包的体积的实现方案,为本领域所需改善的技术问题。



技术实现要素:

有鉴于此,本发明提供一种程序安装包处理方法、装置、电子设备和计算机可读存储介质。

为了实现上述目的,本发明实施例采用的技术方案如下:

第一方面,实施例提供一种程序安装包处理方法,包括:

将待处理的类文件编译生成代码文件;

通过类文件编译工具,将所述代码文件中原有的类文件的包名及类名处理为新的类名,使得处理后的类文件配置于可执行目录的顶层;

将处理后的代码文件进行混淆,构建得到程序安装包。

在可选的实施方式中,通过类文件编译工具,将所述代码文件中原有的类文件的包名及类名处理为新的类名,包括:

读取已经配置的混淆信息;

遍历所述代码文件,当遍历到所述代码文件中的类文件时,若能够在所述已经配置的混淆信息中查找到不对该类文件进行混淆的信息,则读取该类文件中引用到其它类文件的类的类名信息,判断引用到其它类文件的类的类名信息是否可混淆,若是,将引用到其它类文件的类的类名信息修改为新的类名;若在所述已经配置的混淆信息中查找可对该类文件进行混淆的信息,则将该类文件修改为新的类名。

在可选的实施方式中,新的类名通过设定的类名生成规则得到,所述设定的类名生成规则包括:将包名中的第一符号替换为第二符号,其中,所述第二符号不同于所述第一符号。

在可选的实施方式中,将引用到其它类文件的类的类名信息修改为新的类名,将该类文件修改为新的类名之后,所述方法还包括:

遍历修改为新的类名之后的类文件的所有的方法、构造函数、参数和常量,将protected或default作用域统一修改成public作用域。

在可选的实施方式中,所述方法还包括:删除处理为新的类名之前的类文件。

在可选的实施方式中,待处理的类文件包括:将安装包程序的源代码编译成的类文件,以及所述安装包程序所引用的其它的第三方软件开发工具包的类文件。

在可选的实施方式中,在构建得到程序安装包之前,所述方法还包括:将其他资源文件进行处理,所述其它资源文件包括图片、文字和音视频文件。

第二方面,本发明实施例提供一种程序安装包处理装置,包括:

编译模块,用于将待处理的类文件编译生成代码文件;

类名处理模块,用于通过类文件编译工具,将所述代码文件中原有的类文件的包名及类名处理为新的类名,使得处理后的类文件配置于可执行目录的顶层;

混淆模块,用于将处理后的代码文件进行混淆,构建得到程序安装包。

第三方面,本发明实施例提供一种电子设备,包括处理器和存储器,所述存储器存储有能够被所述处理器执行的机器可执行指令,所述处理器可执行所述机器可执行指令以实现前述实施方式任一所述的方法。

第四方面,本发明实施例提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如前述实施方式中任一项所述的方法。

本发明实施例提供的程序安装包处理方法、装置、电子设备和计算机可读存储介质,通过类文件编译工具,将代码文件中原有的类文件的包名及类名处理为新的类名,使得处理后的类文件配置于可执行目录的顶层,从而去除类文件中的包名等,进而有效精减最终构建的程序安装包的体积。

为使本发明的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1示出了本发明实施例提供的一种应用场景示意图。

图2示出了本发明实施例提供的一种程序安装包处理方法的流程示意图。

图3示出了本发明实施例提供的一种程序安装包处理方法的另一流程示意图。

图4示出了本发明实施例提供的一种程序安装包处理装置的示例性结构框图。

图标:100-电子设备;110-存储器;120-处理器;130-通信模块;140-程序安装包处理装置;141-编译模块;142-类名处理模块;143-混淆模块。

具体实施方式

为了减小程序安装包的包体积,可以对可执行代码进行处理,然而,在真正的项目开发中,由于多种原因,导致程序安装包的体积没有被精减下来。现进行以下举例说明。

例如,javapackagename又称java包名,javaclassname又称java类名。java类可以放在某个包名下,方便功能划分、业务隔离。但并非强制要求java类必须放在某个包名下,也可以将java类放在代码可执行区的顶层。

混淆是一种将java类名和java包名替换为无意义字符的技术。一般采用a、b、c等26个字母及0至9十个数字及两组的组合来替换原本的包名或类名。目前常用的混淆工具包括proguard、googler8工具等。

示例性地,针对com.google.app.fileutils.class,类名为fileutils.class,包名为com.google.app。经混淆后,proguard可以根据实际运行环境,将包名或类名进行替换。替换后的示例有多种,如下所示。

com.google.app.a.class:只混淆了类名,包名无变化。

com.google.a.a.class:包名只替换了一层,类名已经替换掉,即混淆了一级包名和类名。

com.a.a.a.class:包名替换了两层,类名已经替换掉,即混淆了两级包名和类名。

其中,包名有几个层级,混淆后仍然有几个层级,只是每个层级的包名都被替换为无具体意义的字符。该种处理方式,由于包名的层级仍然被保留,导致处理后的程序安装包的体积仍然有精减空间。

又例如,由于反射技术的使用或多项目开发间的要求,经常配置了某一规则的类仍然保持原样,不进行混淆处理,导致许多包结构不能被混淆,该包下的对应的类由于包名没有混淆,导致相应的类体积没有被精减下来。

示例性地,假设com.google.app包下有多个类,其中,textview.class用于界面显示,fileutil.class用于界面无关的文件处理,要求界面显示的相关类不能被混淆,相应地,com.google.app.textview会保留原样,但这会导致com.google.app.fileutil只能被混淆成类似com.google.app.a,而非com.a.a.a;即多个包名的层级仍被保留原样,没有进一步精减。由于proguard混淆方案中,包名的层级是不变的,只是将每个子层级的名称替换为无意义的字符,因而仍然存在优化空间。

综上可知,如何有效精减程序安装包的体积为目前所需改善的技术问题。

有鉴于此,本发明实施例提供了一种程序安装包处理方案,通过将代码文件中原有的类文件的包名及类名处理为新的类名,使得处理后的类文件配置于可执行目录的顶层,从而去除类文件中的包名,不保存包名的层级,进而有效精减最终构建的程序安装包的体积。

针对以上方案所存在的缺陷,均是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及下文中本发明实施例针对上述问题所提出的解决方案,都应该是发明人在发明过程中做出的贡献。

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。

因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

需要说明的是,在不冲突的情况下,本发明的实施例中的特征可以相互结合。

请参照图1,是本实施例提供的一种电子设备100的方框示意图。所述电子设备100包括存储器110、处理器120及通信模块130。所述存储器110、处理器120以及通信模块130各元件相互之间直接或间接地电性连接,以实现数据的传输或交互。例如,这些元件相互之间可通过一条或多条通讯总线或信号线实现电性连接。

其中,存储器110用于存储程序或者数据。所述存储器110可以是,但不限于,随机存取存储器(randomaccessmemory,ram),只读存储器(readonlymemory,rom),可编程只读存储器(programmableread-onlymemory,prom),可擦除只读存储器(erasableprogrammableread-onlymemory,eprom),电可擦除只读存储器(electricerasableprogrammableread-onlymemory,eeprom)等。

处理器120用于读/写存储器110中存储的数据或程序,并执行相应地功能。

通信模块130用于通过所述网络建立所述电子设备100与其它通信终端之间的通信连接,并用于通过所述网络收发数据。

应当理解的是,图1所示的结构仅为电子设备100的结构示意图,所述电子设备100还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。图1中所示的各组件可以采用硬件、软件或其组合实现。

请结合参阅图2,为本发明实施例提供的一种程序安装包处理方法的流程示意图,可以由图1所述电子设备100执行,例如可以由电子设备100中的处理器120执行。该程序安装包处理方法包括s110、s120和s130。

s110,将待处理的类文件编译生成代码文件。

s120,通过类文件编译工具,将所述代码文件中原有的类文件的包名及类名处理为新的类名,使得处理后的类文件配置于可执行目录的顶层。

s130,将处理后的代码文件进行混淆,构建得到程序安装包。

本实施例中,通过类文件编译工具,将代码文件中原有的类文件的包名及类名处理为新的类名,不保存包名的层级,直接将类(文件)移到可执行代码区域(可执行目录)的顶层,从而可以达到更加精减、精美的安装包体积。

待处理的类文件可以为多种,例如,可以包括将安装包程序的源代码编译成的类文件(亦称.class文件),又例如,可以包括安装包程序所引用的其它的第三方软件开发工具包(sdk,softwaredevelopmentkit)的类文件。相应地,s110中,可以是将多种待处理的类文件汇总后编译生成目标平台上的代码文件,如jar:一种软件包文件格式,通常用于聚合大量的java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便开发java平台应用软件或库。

在一种实现方式中,新的类名可以通过设定的类名生成规则得到,设定的类名生成规则可以包括:将包名中的第一符号替换为第二符号,其中,第二符号不同于第一符号。例如,新的类名生成规则可以如下:将包名中的“.”替换为“_”,以得到新的类名。

如针对com.google.app.fileutil.class,进行符号替换之后,得到的新的类名为:com_google_app_fileutil.class。

可以理解的是上述示例中的“_”等符号只是举例之一,第一符号和第二符号也可以为其它字符,本实施例对此不作限制。

类文件编译工具可以灵活选择,例如,可以选用目前已有的许多成熟的类文件编译工具,如javassist、asm、aspectj等,又例如,可以自定义类似的类文件编译工具。

class类文件中,保存着本类文件中所有使用到、执行代码过程中将会调用到的类信息、方法信息、参数信息等,这些信息都储存在class文件中的常量池中。更新class类文件中类名的技术手段可以包括:使用类文件编译工具,将指定的类名重新命名为新的类名,即是将该类的类文件中的类信息替换为新的类名。示例性地,可以在使用javassist中,从classpool中查找出com.google.app.fileutil.class类,即javassist中的ctclass,然后通过ctclass.replaceclassname(oldname,newname)即可将老类名替换为新的类名。类似的,另一种方法ctclass.replaceclassname(classmapmap)亦可实现该功能。

当按上述技术手段及设定的类名生成规则处理后,原本fileutil.class是放置于com/google/app目录下的,输出新的文件时,由于已经没有包名的层级了(包名的层级对应文件系统中的目录层级),新的类文件将直接配置于可执行目录的顶层。

鉴于在java中有四种不同的作用域,分别是public、protected、default和private。其中,在所有的作用域中,public作用域是最宽松的,被它修饰的无论是参数还是方法,都可以在任何地方访问的到。protected作用域的限制相较于public作用域更严格一点,它只允许本类、同一个包内的其他类(该类并非它的子类)或者它的子类使用被它修饰的方法或者参数,子类使用父类中的protected方法或者参数时不受包位置的影响,这意味着,即使位于不同包的类想要调用它父类的protected方法或者参数也是被允许的。default作用域(即不加任何的关键字修饰的方法或者参数),限制较为严格,除了本类和本包中的类能访问以外,不在同一个包内的它自己的子类也不能访问。private作用域在这四种之中最为严格,除了它自己,哪怕是同包内的其他类都不允许使用。

在新的类名的命名规则中,由于包名的去除,受影响的作用域会有:protected与default这两个作用域。

基于上述研究,s120可以通过以下方式实现:读取已经配置的混淆信息,遍历所述代码文件,当遍历到所述代码文件中的类文件时,若能够在所述已经配置的混淆信息中查找到不对该类文件进行混淆的信息,则读取该类文件中引用到其它类文件的类的类名信息,判断引用到其它类文件的类的类名信息是否可混淆,若是,将引用到其它类文件的类的类名信息修改为新的类名。若在所述已经配置的混淆信息中查找可对该类文件进行混淆的信息,则将该类文件修改为新的类名。

由于修改了包名,将引用到其它类文件的类的类名信息修改为新的类名,将该类文件修改为新的类名之后,在java语义中有些protected或default作用域的方法、构造函数、参数、常量可能会无法正常访问或执行,为此需要遍历本类文件的所有的方法、构造函数、参数、常量等,将protected或default作用域统一修改成public作用域。进而将上述编译过后的新的类文件重新打包成一个新的jar,并删除(处理为新的类名之前的)旧的类文件或旧的jar文件,交给后续构建安装包程序处理。请结合参阅图3,通过s210删除处理为新的类名之前的类文件。

经过以上处理,符合条件的类文件都已经去除了包名及包名带来的层级结构,只剩下类名。示例性地:com_google_app_fileutil.class。

经后续正常的构建步骤,经过混淆工具的自动处理,则会将com_google_app_fileutil.class混淆为a.class。(a.class只是个示例名称,具体根据真实运行环境灵活确定)。达到了包名层级的精减,减少了可执行代码的体积,减少了后续的程序安装包体积,同时由于减少了包名信息增加了程序安装包被破解的难度、增加了安全性。

可以理解的是,本实施例中的上述技术方案可以应用于javaapp、androidapp等场景。

在一种实现方式中,在构建得到程序安装包之前,所述方法还包括:将其他资源文件进行处理,所述其它资源文件包括图片、文字和音视频文件。将s130中混淆后的代码文件和处理后的其他资源文件进行统一处理即可构建出可执行文件,即程序安装包。

为了执行上述实施例及各个可能的方式中的相应步骤,下面给出一种程序安装包处理装置的实现方式,可选地,该程序安装包处理装置可以应用于图1所示的电子设备100。进一步地,请参阅图4,图4为本发明实施例提供的一种程序安装包处理装置140的功能模块图。需要说明的是,本实施例所提供的程序安装包处理装置140,其基本原理及产生的技术效果和上述实施例相同,为简要描述,本实施例部分未提及之处,可参考上述的实施例中相应内容。该程序安装包处理装置140包括:编译模块141、类名处理模块142和混淆模块143。

其中,编译模块141,用于将待处理的类文件编译生成代码文件。

类名处理模块142,用于通过类文件编译工具,将所述代码文件中原有的类文件的包名及类名处理为新的类名,使得处理后的类文件配置于可执行目录的顶层。

混淆模块143,用于将处理后的代码文件进行混淆,构建得到程序安装包。

在上述基础上,本发明实施例还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如前述实施方式中任一项所述的方法。

本发明实施例提供的程序安装包处理方法、装置、电子设备和计算机可读存储介质,通过在程序编译期间插入自动处理程序将包名进一步混淆或替换,无需人工干预,简单方便。能够将包名去除,进一步精减最终生成的程序安装包体积。由于没有了包名的信息,所以可执行代码被反编译或被逆向破解的门槛更高了,提升了安装包安全性。

在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

另外,在本发明各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。

所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1