安装包编译方法、装置、电子设备及可读存储介质与流程

文档序号:19128095发布日期:2019-11-13 02:20阅读:149来源:国知局
安装包编译方法、装置、电子设备及可读存储介质与流程

本申请涉及计算机技术领域,具体而言,涉及一种安装包编译方法、装置、电子设备及可读存储介质。



背景技术:

随着业务发展越来越丰富,android移动客户端的开发项目的代码量也变得更加庞大,与之对应的,每次需要编译的代码也变得越来越多。因此,在编译过程中开发人员需要进行各种前置操作,使得编译速度越来越慢。由于每次运行开发项目的编译时间成本都等同于在浪费开发人员的人力成本和时间成本,尤其是针对非首次编译时,如果不提高编译效率,则会极大影响开发效率。



技术实现要素:

有鉴于此,本申请的目的在于提供一种安装包编译方法、装置、电子设备及可读存储介质,无需开发人员在非首次编译时反复进行各种前置检查,从而降低在非首次编译时的编译时间成本,提高非首次编译的效率。

根据本申请实施例的一方面,提供一种安装包编译方法,应用于电子设备,所述方法包括:

在检测到针对任一开发项目的编译操作时,获取该开发项目对应的编译更新数据,所述编译更新数据包括代码更新数据和资源更新数据二者中的至少一种;

根据该开发项目对应的编译更新数据判断该编译操作是否为首次操作;

若该编译操作不是首次操作,则获取所述代码更新数据对应的代码依赖源,并根据所述代码依赖源将所述代码更新数据更新到该开发项目的待编译安装包的反编译数据中,和/或将所述资源更新数据更新到该开发项目的待编译安装包的反编译数据中。

根据本申请实施例的另一方面,提供一种安装包编译装置,应用于电子设备,所述装置包括:

获取模块,用于在检测到针对任一开发项目的编译操作时,获取该开发项目对应的编译更新数据,所述编译更新数据包括代码更新数据和资源更新数据二者中的至少一种;

判断模块,用于根据该开发项目对应的编译更新数据判断该编译操作是否为首次操作;

更新模块,用于若该编译操作不是首次操作,则获取所述代码更新数据对应的代码依赖源,并根据所述代码依赖源将所述代码更新数据更新到该开发项目的待编译安装包的反编译数据中,和/或将所述资源更新数据更新到该开发项目的待编译安装包的反编译数据中。

根据本申请实施例的另一方面,提供一种电子设备,所述电子设备包括机器可读存储介质及处理器,所述机器可读存储介质存储有机器可执行指令,所述处理器在执行所述机器可执行指令时,该电子设备实现前述的安装包编译方法。

根据本申请实施例的另一方面,提供一种可读存储介质,所述可读存储介质中存储有机器可执行指令,所述机器可执行指令被执行时实现前述的安装包编译方法。

基于上述任一方面,本申请实施例在检测到针对任一开发项目的非首次编译操作时,能够根据该开发项目对应的编译更新数据,获取代码更新数据对应的代码依赖源,进而根据代码依赖源快速将代码更新数据更新到该开发项目的待编译安装包的反编译数据中,和/或将资源更新数据快速更新到该开发项目的待编译安装包的反编译数据中。如此,无需开发人员在非首次编译时反复进行各种前置检查,从而降低在非首次编译时的编译时间成本,提高非首次编译的效率。

附图说明

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

图1示出了本申请实施例所提供的安装包编译方法的流程示意图之一;

图2示出了本申请实施例所提供的一种示例性安装包的反编译数据的示意图;

图3示出了本申请实施例所提供的安装包编译方法的流程示意图之二;

图4示出了本申请实施例所提供的安装包编译方法的流程示意图之三;

图5示出了本申请实施例所提供的安装包编译装置的功能模块示意图;

图6示出了本申请实施例所提供的用于实现上述安装包编译方法的电子设备的结构示意框图。

具体实施方式

为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,应当理解,本申请中附图仅起到说明和描述的目的,并不用于限定本申请的保护范围。另外,应当理解,示意性的附图并未按实物比例绘制。本申请中使用的流程图示出了根据本申请实施例的一些实施例实现的操作。应该理解,流程图的操作可以不按顺序实现,没有逻辑的上下文关系的步骤可以反转顺序或者同时实施。此外,本领域技术人员在本申请内容的指引下,可以向流程图添加一个或多个其它操作,也可以从流程图中移除一个或多个操作。

另外,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其它实施例,都属于本申请保护的范围。

图1示出了本申请实施例提供的安装包编译方法的流程示意图,应当理解,在其它实施例中,本实施例的安装包编译方法其中部分步骤的顺序可以根据实际需要相互交换,或者其中的部分步骤也可以省略或删除。该安装包编译方法的详细步骤介绍如下。

步骤s110,在检测到针对任一开发项目的编译操作时,获取该开发项目对应的编译更新数据。

步骤s120,根据该开发项目对应的编译更新数据判断该编译操作是否为首次操作。

若该编译操作不是首次操作,则执行步骤s130,具体描述如下。

步骤s130,获取代码更新数据对应的代码依赖源,并根据代码依赖源将代码更新数据更新到该开发项目的待编译安装包的反编译数据中,和/或将资源更新数据更新到该开发项目的待编译安装包的反编译数据中。

本实施例中,可以根据不同的业务需求确定开发不同的开发项目。例如,针对互联网在线直播的需求,可以确定相关的互联网直播软件项目,如主播端直播软件项目、观众端直播软件项目等。

在一些可能的实施方式中,各开发项目采用的编程语言可以是但并不仅限于java、c/c++等,也可采用其它任意可行的编程语言,而在不同的编程语言下,可以采用对应的编译方式以对代码或者资源进行编译从而生成编译更新数据。例如,在本实施例中,以某个android平台的互联网直播软件项目为例,该开发项目对应的编译更新数据可以为基于java语言开发编译得到的编译更新数据。

为了提高非首次编译操作的编译效率,本实施例可通过前述编译更新数据判断该编译操作是否为首次操作,如果不是首次操作,则可以根据编译更新数据,确定本次编译操作涉及到的具体更新数据。例如,若本次编译操作仅涉及到代码更新数据(比如java代码数据),那么则获取代码更新数据对应的代码依赖源,并根据代码依赖源将代码更新数据更新到该开发项目的待编译安装包的反编译数据中。又例如,若本次编译操作仅涉及到资源更新数据(比如软件界面图片数据、音视频资源数据等),那么则将资源更新数据更新到该开发项目的待编译安装包的反编译数据中。又例如,若本次编译操作同时涉及到代码更新数据和资源更新数据,那么则获取代码更新数据对应的代码依赖源,并根据代码依赖源将代码更新数据更新到该开发项目的待编译安装包的反编译数据中,同时将资源更新数据更新到该开发项目的待编译安装包的反编译数据中。

如此,本实施例通过上述编译机制,无需开发人员在非首次编译时反复进行各种前置检查,从而降低在非首次编译时的编译时间成本,提高非首次编译的效率。

在一些可能的实施方式中,针对步骤s120,对于每个开发项目而言,其在首次编译时,通常都不存在已产生的编译数据。基于此,可以判断该开发项目的项目开发数据中是否存在与该编译更新数据关联的编译数据。例如,若该开发项目的项目开发数据中存在与该编译更新数据关联的编译数据,则判定该编译操作不是首次操作,否则可判定该编译操作为首次操作。

在一些可能的实施方式中,针对步骤s130,以android系统的软件开发项目为例,android系统的安装包文件为apk文件,apk文件内部大致壳分为两部分,一部分是资源数据,一部分是代码数据。如果通过一些反编译工具(例如apktool工具)反编译apk文件,其中的代码数据会被反编译解析为smali文件,资源数据会直接还原为具体的资源文件。此外,apk文件中可能还包括多个dex文件,那么反编译得到的smali文件则分布在多个不同的smali文件夹中,例如名为smali_classes1、smali_classes2、smali_classes3……等文件夹。例如图2所示,示出了针对某个apk文件反编译后得到的文件夹的示意界面图,可以看到多个用于存放代码数据的smali文件夹(例如smali_class99、smali_class98、smali_class97等)。

也即,每个dex文件可对应一个smali文件夹。在此基础上,本实施例可以对这些smali文件夹以及这些smali文件夹内部对应的smali文件建立一个预设哈希表,从而便于在后续增量更新时,通过smali文件的文件名能够快速查找到其对应存放的smali文件夹的位置。

此外,在该开发项目的本次编译操作之前,可预先在本地存储该开发项目的各个编译生成的class文件。仍旧以android系统为例,class文件也可以称作为javaclass文件,可为java语言开发的程序提供独立于底层主机平台的二进制形式的服务。class文件可以运行在任何支持java虚拟机的硬件平台和操作系统(例如android系统)上的二进制文件。

在一种示例中,针对代码更新数据,获取代码更新数据对应的代码依赖源的一种实现方式可以是:获取代码更新数据在该开发项目中对应的项目目录,并从项目目录中获取与代码更新数据关联的目标class文件,将该目标class文件确定为代码更新数据对应的代码依赖源。

可选地,目标class文件可以为与代码更新数据关联的第一次编译操作生成的class文件,或者本次检测到的编译操作的上一次编译操作生成的class文件。

由此,在获取到代码更新数据对应的代码依赖源后,则可以根据代码依赖源对代码更新数据(java代码数据)进行编译,生成class文件。例如,可以根据javac-cp/xxx/xxx/\*xxxx.java指令将代码更新数据转化为class数据,其中/xxx/xxx/\*表示的是该代码更新数据对应的代码依赖源对应的项目目录。

接着,将class文件转换为dex文件,例如可以通过dx—dex-output=class.dexxxxx.class命令将class文件转换为dex文件。

而后,对dex文件进行反编译,得到对应的第一smali文件。例如,可以通过java-jarbaksmali-2.2.1.jardclasses.dex对dex文件进行反编译,得到对应的第一smali文件。

此外,在此之前或者与此同时,还需要对该开发项目的待编译安装包进行反编译,得到该开发项目的待编译安装包的反编译数据。例如,可以通过./apktool.shapp-debug.apkacdemo对该开发项目的待编译安装包进行反编译,得到该开发项目的待编译安装包的反编译数据,反编译数据可以包括多个smali文件夹。

然后,可以从多个smali文件夹中确定与dex文件对应的目标smali文件夹。例如,可以获取前述预先确定的哈希表,由于该哈希表包括每个dex文件对应的smali文件夹以及每个smali文件夹对应的至少一个smali文件,因此可以从哈希表中查找与dex文件对应的smali文件夹作为目标smali文件夹。

通过上述过程,即可将第一smali文件更新到目标smali文件夹中。例如,根据具体的开发过程,可以新增代码数据,也可以修改原有的代码数据。因此,可以选择将目标smali文件夹中上一次编译操作得到的第二smali文件替换为第一smali文件,或者将第一smali文件作为新增smali文件添加到目标smali文件夹中。

例如,假设目标smali文件夹为图2中所示的smali_class99,smali_class99中可包括该软件项目的smali991、smali992、smali993的三个smali文件。如果第一smali文件为smali991、smali992、smali993之外的smali994,那么可以将smali994作为新增smali文件添加到smali_class99中,此时smali_class99中可包括smali991、smali992、smali993、smali991、smali992、smali994。又例如,若第一smali文件为用于替换图像smali991的smali991’,那么可以将smali_class99中的smali991替换为smali991’。

在另一种示例中,针对资源更新数据,可以预先将该开发项目的待编译安装包进行反编译,得到反编译数据,这些反编译数据可包括资源数据文件夹。由此,根据具体的开发过程,可以新增资源数据,也可以修改原有的资源数据。因此,可以选择将资源数据文件夹中与资源更新数据对应的上一次编译的资源文件替换为资源更新数据,或者将资源更新数据作为新增资源数据添加到资源数据文件夹中。

例如,假设资源数据文件夹的路径为/resources,/resources中可包括该软件项目的界面a的图像a1、a2、a3,如资源更新数据为图像a1、a2、a3之外的a4,那么可以将a4作为新增资源数据添加到/resources下的文件夹中,此时/resources下的文件夹中可包括该软件项目的界面a的图像a1、a2、a3、a4。又例如,若资源更新数据为用于替换图像a1的a1’,那么可以将/resources中界面a的图像a1替换为a1’。

在前述描述的基础上,请进一步地参阅图3,在步骤s130之后,本实施例提供的安装包编译方法还可以包括如下步骤s140、步骤s150,具体描述如下。

步骤s140,将包括更新后的反编译数据进行重打包处理,得到重打包安装包。

例如,可以通过重打包指令,比如apktoolbsmali/acdemo-oasdemo.apk指令将包括更新后的反编译数据进行重打包处理,得到重打包安装包。

步骤s150,对重打包安装包进行签名,得到编译后的安装包。

例如,可以通过再次签名指令,比如jarsigner-verbose-keystore/users/v5/documents/nook/signkey-signedjar/users/v5/power/smali/rep-sign.apk/users/v5/power/smali/rep.apknook的签名指令对重打包安装包进行签名,得到编译后的安装包。

如此,编译后的安装包即为更新后的安装包,从而可以为该开发项目的相关使用用户推送新的安装包版本,以增加或者改善软件功能。

在另一种情况下,请参阅图4,若该编译操作为首次操作,则执行下述步骤s121和步骤s122,具体描述如下。

步骤s121,根据编译更新数据生成对应的编译安装包。

步骤s122,对生成的编译安装包所对应的打包工具中的目标代码进行调整。

本实施例中,经发明人研究发现,在apk文件中,存在一个r.java文件,该r.java文件会存放诸多资源数据的唯一标识id,在经过多次安装包编译过程中,相同资源数据的id可能会发生变化,发生变化的id可能会与其它资源数据的id存在冲突,导致后续在引用某个资源数据时出错,从而导致编译失效。基于此,本实施例在首次进行编译操作时,可以修改生成的编译安装包所对应的打包工具中的目标代码,该目标代码被执行时可以用于为每个资源数据确定标识信息。如此,可以使得打包工具在对编译安装包进行打包时,编译安装包中每个初始资源数据的标识信息被锁定、以及新增的资源数据的标识信息不与每个初始资源数据的标识信息相同。例如,可以保证后续在多次打包过程中各个资源数据的id不变,新增的资源数据的id在原有id的基础上依序增加,从而避免后续在引用某个资源数据时出错,从而导致编译失效的问题,提高开发过程中的稳定性。

进一步地,基于同一发明构思,请参阅图5,示出了本申请实施例提供的安装包编译装置200的功能模块示意图,本实施例可以根据上述方法实施例对安装包编译装置200进行功能模块的划分。例如,可以对应各个功能划分各个功能模块,也可以将两个或两个以上的功能集成在一个处理模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。需要说明的是,本申请实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。比如,在采用对应各个功能划分各个功能模块的情况下,图5示出的安装包编译装置200只是一种装置示意图。其中,安装包编译装置200可以包括获取模块210、判断模块220以及更新模块230,下面分别对该安装包编译装置200的各个功能模块的功能进行详细阐述。

获取模块210,用于在检测到针对任一开发项目的编译操作时,获取该开发项目对应的编译更新数据,编译更新数据包括代码更新数据和资源更新数据二者中的至少一种。可以理解,该获取模块210可以用于执行上述步骤s110,关于该获取模块210的详细实现方式可以参照上述对步骤s110有关的内容。

判断模块220,用于根据该开发项目对应的编译更新数据判断该编译操作是否为首次操作。可以理解,该判断模块220可以用于执行上述步骤s120,关于该判断模块220的详细实现方式可以参照上述对步骤s120有关的内容。

更新模块230,用于若该编译操作不是首次操作,则获取代码更新数据对应的代码依赖源,并根据代码依赖源将代码更新数据更新到该开发项目的待编译安装包的反编译数据中,和/或将资源更新数据更新到该开发项目的待编译安装包的反编译数据中。可以理解,该更新模块230可以用于执行上述步骤s130,关于该更新模块230的详细实现方式可以参照上述对步骤s130有关的内容。

在一些可能的实施方式中,判断模块220具体可以用于:

判断该开发项目的项目开发数据中是否存在与该编译更新数据关联的编译数据;

若该开发项目的项目开发数据中存在与该编译更新数据关联的编译数据,则判定该编译操作不是首次操作,否则判定该编译操作为首次操作。

在一些可能的实施方式中,更新模块230具体可以通过以下方式获取代码更新数据对应的代码依赖源:

获取代码更新数据在该开发项目中对应的项目目录;

从项目目录中获取与代码更新数据关联的目标class文件,将该目标class文件确定为代码更新数据对应的代码依赖源。

在一些可能的实施方式中,目标class文件为与代码更新数据关联的第一次编译操作生成的class文件,或者本次检测到的编译操作的上一次编译操作生成的class文件。

在一些可能的实施方式中,更新模块230具体可以通过以下方式将代码更新数据更新到该开发项目的待编译安装包的反编译数据中:

根据代码依赖源对代码更新数据进行编译,生成class文件;

将class文件转换为dex文件;

对dex文件进行反编译,得到对应的第一smali文件;

对该开发项目的待编译安装包进行反编译,得到该开发项目的待编译安装包的反编译数据,反编译数据包括多个smali文件夹;

从多个smali文件夹中确定与dex文件对应的目标smali文件夹;

将第一smali文件更新到目标smali文件夹中。

在一些可能的实施方式中,更新模块230具体可以通过以下方式从多个smali文件夹中确定待更新的目标smali文件夹:

获取预先确定的哈希表,哈希表包括每个dex文件对应的smali文件夹以及每个smali文件夹对应的至少一个smali文件;

从哈希表中查找与dex文件对应的smali文件夹作为目标smali文件夹。

在一些可能的实施方式中,更新模块230具体可以通过以下方式将第一smali文件更新到目标smali文件夹中:

将目标smali文件夹中上一次编译得到的第二smali文件替换为第一smali文件;或者

将第一smali文件作为新增smali文件添加到目标smali文件夹中。

在一些可能的实施方式中,更新模块230具体可以通过以下方式将资源更新数据更新到该开发项目的待编译安装包的反编译数据中:

将该开发项目的待编译安装包进行反编译,得到反编译数据,反编译数据包括资源数据文件夹;

将资源数据文件夹中与资源更新数据对应的上一次编译的资源文件替换为资源更新数据;或者

将资源更新数据作为新增资源数据添加到资源数据文件夹中。

在一些可能的实施方式中,安装包编译装置200还可以包括重打包模块和签名模块。重打包模块具体可以用于将包括更新后的反编译数据进行重打包处理,得到重打包安装包。签名模块具体可以用于对重打包安装包进行签名,得到编译后的安装包。

在一些可能的实施方式中,安装包编译装置200还可以包括代码调整模块,具体可以用于若该编译操作为首次操作,则根据编译更新数据生成对应的编译安装包,而后对生成的编译安装包所对应的打包工具中的目标代码进行调整,以使得打包工具在对编译安装包进行打包时,编译安装包中每个初始资源数据的标识信息被锁定、以及新增的资源数据的标识信息不与每个初始资源数据的标识信息相同。目标代码被执行时用于为每个资源数据确定标识信息。

进一步地,基于同一发明构思,图6示出了本申请实施例提供的用于实现上述安装包编译方法的电子设备100的结构示意框图,本实施例中,电子设备100可以包括机器可读存储介质120和处理器130。

其中,处理器130可以是一个通用的中央处理器(centralprocessingunit,cpu),微处理器,特定应用集成电路(application-specificintegratedcircuit,asic),或一个或多个用于控制前述方法实施例提供安装包编译方法的程序执行的集成电路。

机器可读存储介质120可以是rom或可存储静态信息和指令的其它类型的静态存储设备,ram或者可存储信息和指令的其它类型的动态存储设备,也可以是电可擦可编程只读存储器(electricallyerasableprogrammabler-onlymemory,eeprom)、只读光盘(compactdiscread-onlymemory,cd-rom)或其它光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质或者其它磁存储设备、或者能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其它介质,但不限于此。机器可读存储介质120可以是独立存在,通过通信总线与处理器130相连接。机器可读存储介质120也可以和处理器集成在一起。其中,机器可读存储介质120用于存储执行本申请方案的机器可执行指令。处理器130用于执行机器可读存储介质120中存储的机器可执行指令,以执行前述方法实施例提供安装包编译方法。

本申请实施例还提供一种包含计算机可执行指令的可读存储介质,计算机可执行指令在被执行时可以用于执行前述方法实施例所提供的安装包编译方法。

本申请实施例是参照根据本申请实施例的方法、设备和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其它可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其它可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

尽管在此结合各实施例对本申请进行了描述,然而,在实施所要求保护的本申请过程中,本领域技术人员通过查看所述附图、公开内容、以及所附权利要求书,可理解并实现所述公开实施例的其它变化。在权利要求中,“包括”一词不排除其它组成部分或步骤,“一”或“一个”不排除多个的情况。单个处理器或其它单元可以实现权利要求中列举的若干项功能。相互不同的从属权利要求中记载了某些措施,但这并不表示这些措施不能组合起来产生良好的效果。

以上所述,仅为本申请的各种实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应所述以权利要求的保护范围为准。

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