应用程序的获取方法、装置、设备及存储介质
技术领域
本申请涉及计算机技术领域,尤其涉及一种应用程序的获取方法、装置、设备及存储介质。
背景技术
随着智能移动设备(例如:智能手机,智能穿戴设备)等越来越广泛地被用于各种生活场景中,而这些移动设备目前采用的主流操作系统就是Android和iOS两大操作系统,其中采用Android操作系统的设备占更大的市场比例,因此Android的应用编程开发占非常重要的地位和开发比例。
现有的Andorid主流开发语言是Java,应用开发人员主要利用Andorid的软件开发工具包(Software Development Kit,SDK)和标准Java应用程序编程接口(ApplicationProgramming Interface,API)来进行应用开发。由于主流的开发语言采用Java语言,Java语言非常容易被逆向反编译,也就是说,编译打包好的应用apk安装包,使用一些解包和反编译工具就很容易被反编译成Java源代码,而且反编译得到的源代码可读性很强,基本上整个app的设计思想和实现方法都很容易被窃取和仿冒。因此,现有技术提供一种方案,将应用程序(application,app)用C++语言和原生开发工具包(Android Native DevelopmentKit,NDK)来实现,这样反编译难度加大,能起到保护app不被逆向工程破解的目的。
但是,现有的方案中用C++来实现和Java一样的功能的话,开发人员不得不用Java本地接口(Java Native Interface,JNI)的方法,由C++去调用Java SDK里的API,然而JNI调用比较繁琐,这种方式代码量成倍的增长,导致应用程序的开发效率较低。
发明内容
本申请实施例提供一种应用程序的获取方法、装置、设备及存储介质,以解决现有技术提供的程序开发过程中代码量过大导致的应用程序开发效率低的问题。
第一方面,本申请实施例提供一种应用程序的获取装置,包括:
交互模块,处理模块,数据模块以及C++编程接口;
所述数据模块中包括采用C++语言定义的多个功能模块;
所述交互模块用于接收采用Java语言输入的调用请求,所述调用请求中包括至少一个模块名称;
所述处理模块用于根据所述调用请求,从数据模块中调用与所述至少一个模块名称对应的至少一个采用C++语言定义的功能模块,并根据所述至少一个采用C++语言定义的功能模块生成应用程序。
在一种具体实施方式中,所述数据模块包括基础数据单元以及高级数据单元;
所述基础数据单元中包括至少一个采用C++语言实现的与Java基础类对应的基础功能模块;
所述高级数据单元中包括至少一个采用C++语言实现的与Java高级类对应的高级功能模块。
在一种具体实施方式中,所述交互模块还用于接收用户输入的功能模块添加请求;
相应的,所述处理模块还用于:
根据所述功能模块添加请求,获取输入的C++代码;
将所述C++代码进行实例化得到新的功能模块,并将所述新的功能模块添加在所述数据模块中。
在一种具体实施方式中,所述装置还包括:Java编程接口,所述Java编程接口用于调用采用Java语言实现的功能模块。
在一种具体实施方式中,所述装置还包括:工具模块,具体用于实现以下至少一种功能:
Java本地接口JNI函数调用和包装;
JNI复杂数据类型转换;
基础数据转换;
内存自动管理;
JNI环境管理。
本申请实施例第二方面提供一种应用程序的获取方法,应用于第一方面任一项所述的应用程序的获取装置,所述方法包括:
接收采用Java语言输入的调用请求,所述调用请求中包括至少一个模块名称;
根据所述调用请求,从数据库中调用与所述至少一个模块名称对应的至少一个采用C++语言定义的功能模块,并根据所述至少一个采用C++语言定义的功能模块生成应用程序;其中,所述数据库中存储有采用C++语言定义的多个功能模块。
在一种具体实施方式中,所述采用C++语言定义的多个功能模块包括:
至少一个采用C++语言实现的与Java基础类对应的基础功能模块,以及至少一个采用C++语言实现的与Java高级类对应的高级功能模块。
在一种具体实施方式中,所述方法还包括:
接收用户输入的功能模块添加请求;
根据所述功能模块添加请求,获取用户输入的C++代码;
将所述C++代码进行实例化得到新的功能模块,并将所述新的功能模块存储在所述数据库中。
本申请实施例第三方面提供一种电子设备,包括:
处理器;以及,
存储器,用于存储所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行第二方面任一项所述的应用程序的获取方法。
本申请实施例第四方面提供一种存储介质,其上存储有计算机程序,该程序被处理器执行时实现第二方面任一项所述的应用程序的获取方法。
本申请实施例提供的应用程序的获取方法、装置、设备及存储介质,该应用程序的获取装置包括交互模块,处理模块,数据模块以及C++编程接口,在应用程序开发过程中,交互模块接收采用Java语言输入的调用请求,处理模块根据调用请求,从数据模块中调用至少一个采用C++语言定义的功能模块,并根据该至少一个采用C++语言定义的功能模块生成应用程序。该装置中通过预先定义多个C++定义的功能模块,并提供可以通过Java语言直接调用C++定义的功能模块的接口,在应用程序开发过程中,只需要简短的调用即可实现应用程序的功能,减少开发工作量以及代码量,提高应用程序的开发效率。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请提供的应用程序的获取装置实施例一的框架示意图;
图2为本申请提供的应用程序的获取装置实施例二的框架示意图;
图3为本申请提供的应用程序的获取装置实施例三的框架示意图;
图4为本申请提供的应用程序的获取装置一实例的的框架示意图;
图5为本申请提供的应用程序的获取方法实施例一的流程图;
图6为本申请提供的应用程序的获取方法实施例二的流程图;
图7为本申请提供的电子设备的实体示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在根据本实施例的启示下作出的所有其他实施例,都属于本申请保护的范围。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
首先,对本申请实施例中的专业术语和名词进行解释:
Java本地接口:(Java Native Interface,JNI)是Java和C/C++语言互相交互,互相调用的一种编程接口,是这两种语言混合编程的一种机制。
Android:常见的非官方中文名称为安卓,官方译名是安致,是一个基于Linux内核的开放源代码移动操作系统,主要设计用于触摸屏移动设备如智能手机和平板电脑与其他便携式设备。
Andorid SDK:Android软件开发包,用于andorid app开发的特定的软件包、软件框架、硬件平台、操作系统等创建应用软件的开发工具的集合。
Android Studio:是一个为Android平台开发程序的集成开发环境。
NDK:Android原生开发工具包(native development kit,NDK)是一种基于原生程序接口的软件开发工具。通过此工具开发的程序直接以本地语言运行,而非虚拟机。因此只有java等基于虚拟机运行的语言的程序才会有原生开发工具包。
目前,Andorid主流开发语言是Java,应用开发人员主要利用Andorid的开发SDK和标准Java API来进行应用开发,并使用Android Studio集成开发环境对应用程序(application,app)进行编程、调试、测试、打包、发布等一系列软件开发操作。现在在Java编译生成app的过程中一般增加了代码混淆过程,将代码进行混淆增加了反编译后Java代码的可读性难度,但只要花足够的耐心和时间,破解app也不成问题。为了避免app被破解,将app用C++语言和原生开发工具包(Android Native Development Kit,NDK)来实现,这样反编译难度加大,能起到保护app不被逆向工程破解的目的。但是由于Java SDK里大量的应用程序编程接口(Application Programming Interface,API)在NDK里都没有相应的API实现,导致用C++来实现和Java一样的功能的话,开发人员不得不用JNI的方法,由C++去调用Java SDK里的API,而JNI调用比较繁琐,这种方式会导致代码量成倍的增长,开发效率低,而且JNI使用不当会导致内存泄漏、App崩溃等致命问题。
针对上述问题,本申请提供一种应用程序的获取方法、装置、设备及存储介质,解决C++编程中由C++通过JNI调用标准Android SDK中Java API的编程问题,降低应用程序开发的代码量,提高应用程序开发效率和稳定性。
本申请提供的应用程序的获取方案的思想是提供一个C++wrapper的框架,也就是一种程序的获取装置,该框架提供和Java API极其相似的编程API接口,这样C++编程人员用类似Java API的编程接口进行编程,实现和Java API接口完成的功能一样的功能,同时该框架非常容易扩展,C++编程人员很容易就能使用该框架实现自己需要对应的Java API的C++的API功能。同时自动管理JNI调用过程中的内存申请和释放。
下面通过几个具体实施例对本申请提供的技术方案进行说明。
图1为本申请提供的应用程序的获取装置实施例一的框架示意图,如图1所示,本实施例提供的应用程序的获取装置10包括:
交互模块11,C++编程接口12,处理模块13,以及数据模块14。
所述数据模块14中包括采用C++语言定义的多个功能模块,该数据模块也可以被设计为数据库,用来存储数据,在该方案中主要用来存储采用C++语言设计的多个功能模块;在具体实现时,也可以对该数据模块14中存储的功能模块进行更新,包括新增或者删减。
所述交互模块11用于接收采用Java语言输入的调用请求,所述调用请求中包括至少一个模块名称,这里的交互模块11提供的是该装置与用户交互的功能,包括图形用户界面,输入接口,显示界面等。
C++编程接口12用来实现用户与数据模块14的交互,即通过该C++变成接口才可以调用数据模块14中的功能模块。
所述处理模块13用于根据所述调用请求,从数据模块14中调用与所述至少一个模块名称对应的至少一个采用C++语言定义的功能模块,并根据所述至少一个采用C++语言定义的功能模块生成应用程序。
处理模块13为该应用程序的获取装置中实现处理以及运算功能的模块。
在该方案的一种具体实现中,所述数据模块14中包括基础数据单元以及高级数据单元;
所述基础数据单元中包括至少一个采用C++语言实现的与Java基础类对应的基础功能模块;所述高级数据单元中包括至少一个采用C++语言实现的与Java高级类对应的高级功能模块。
也就说这些数据模块14中实现的功能模块是与Java对应的功能模块,将现有的Java中的class,算法以及功能都用过C++语言进行预先定义和存储,以便在程序开发过程中,能够通过该应用程序的获取装置中提供的C++编程接口调用其中的功能模块。
本实施例提供的应用程序的获取装置,通过预先定义多个C++定义的功能模块,并提供可以通过Java语言直接调用C++定义的功能模块的接口,在应用程序开发过程中,只需要简短的调用即可实现应用程序的功能,减少开发工作量以及代码量,提高应用程序的开发效率。
在上述实施例的基础上,如果开发人员在使用该应用程序的获取装置10开发应用程序的过程中,发现在数据模块14中没有需要的功能模块,则还可以进行添加。具体的功能添加的过程中,所述交互模块11还用于接收用户输入的功能模块添加请求;相应的,所述处理模块13还用于:
根据所述功能模块添加请求,获取输入的C++代码;
将所述C++代码进行实例化得到新的功能模块,并将所述新的功能模块添加在所述数据模块中。
在该方案中,开放人员通过该装置提供的接口,选择进行功能模块添加,然后通过交互模块输入要添加的功能模块对应的C++代码。该装置在接收到开发人员输入的C++代码之后进行实例化,得到新的功能模块并定义对应的名称,存储在数据模块14中,在后续的开发过程中,只需要通过模块名称直接调用该模块即可。
该实现方式提供的应用程序的获取装置,很容易实现没有的功能模块的扩展,开发人员可以根据需要来扩展需要的C++功能模块,以便提高程序开发的效率。
图2为本申请提供的应用程序的获取装置实施例二的框架示意图,如图2所示,在上述任一实施例的基础上,该应用程序的获取装置10还包括:Java编程接口15,所述Java编程接口用于调用采用Java语言实现的功能模块。
图3为本申请提供的应用程序的获取装置实施例二的框架示意图,如图3所示,在上述任一实施例的基础上,所述应用程序的获取装置10还包括:工具模块16,具体用于实现以下至少一种功能:JNI函数调用和包装;JNI复杂数据类型转换;基础数据转换;内存自动管理;JNI环境管理。
在上述两个实施例中,该应用程序的获取装置中还提供了Java编程接口以及工具层,来实现Java语言的功能模块调用以及数据转换和环境管理等功能。
在程序的开发过程中,开发人员可以通过C++编程接口调用C++代码的功能模块,也可以通过Java编程接口调用Java代码的功能模块,结合两种语言进行应用程序的开发,增加反编译的难度,保护app不会被破解,提高应用程序使用的安全性。
图4为本申请提供的应用程序的获取装置一实例的的框架示意图,如图4所示,在上述任一实施例的基础上,本实施例提供一种应用程序的获取装置的实例,在该装置的框架中,包括:
API接口,该API接口具体包括输出C++的API,也就是上述的C++编程接口,以及输出Java的API,也就是上述的Java编程接口。
高级数据层,也称为高级类层,其中包括C++高级类,对应实现Android Java中的高级类,采用的语言为C++语言,例如:CContext,CActivity等功能。
基础数据层,其中包括C++基础类,对应实现Android Java中的基础类,采用的语言为C++语言,例如:CCharsequence,CList等功能。
工具层,其中包括用来实现JNI复杂数据类型转换以及JNI函数调用包装等功能的单元。
基础工具层,其中包括基础数据转换,内存自动管理以及JNI环境管理等功能单元。
通过上述这种应用程序的获取装置的框架,开发人员能够迅速的用C++语言实现和Java SDK一一对应的功能,节省了开发时间,并且可以减少内存泄露等潜在风险,提高程序开发效率。
基于上述架构,下面介绍本申请提供的应用程序的获取方法的实施例。
图5为本申请提供的应用程序的获取方法实施例一的流程图;如图5所示,该应用程序的获取方法应用在上述任一实施例提供的应用程序的获取装置中,在开发人员开发应用程序的过程中,该装置的实现具体包括以下步骤:
S101:接收采用Java语言输入的调用请求,调用请求中包括至少一个模块名称。
在本步骤中,开发人员在进行应用程序开发时候,可以直接输入Java代码进行应用程序设计,在过程中,需要调用C++功能模块时,可以采用Java语言输入的调用请求,其中需要包括要调用的至少一个模块名称。
S102:根据调用请求,从数据库中调用与至少一个模块名称对应的至少一个采用C++语言定义的功能模块,并根据至少一个采用C++语言定义的功能模块生成应用程序。
其中,数据库中存储有采用C++语言定义的多个功能模块,该数据库中的功能模块的定义是在应用之前完成的,获取装置设计过程中已经定义好的。
采用C++语言定义的多个功能模块包括:至少一个采用C++语言实现的与Java基础类对应的基础功能模块,以及至少一个采用C++语言实现的与Java高级类对应的高级功能模块。
在本步骤中,该应用程序的获取装置在获取到调用请求之后,通过C++变成接口对数据库中存储的C++模块进行调用,具体的,可从数据库中调用与所述至少一个模块名称对应的至少一个采用C++语言定义的功能模块。
后续在程序开发完成后,可根据所述至少一个采用C++语言定义的功能模块生成应用程序。
该方案的一种具体实现方式中,首先,可以在Java代码内声明需要用C++实现的native API,将android app的context等作为参数传入C++的API中。然后,根据参数构建C++中与Java对应的CContext或者其他C++的class。利用这些C++的class完成与Java API完全相同的功能,在程序开发过程中可以调用这些C++的class实现相应的功能。最后,完成C++内部API调用后,native代码返回到Java代码中。
本实施例提供的应用程序的获取方法,在应用程序开发过程中,通过装置中预先定义多个C++定义的功能模块,可以通过Java语言直接调用C++定义的功能模块的接口,只需要简短的调用即可实现应用程序的功能,减少开发工作量以及代码量,提高应用程序的开发效率。
在上述实施例的基础上,采用本方案在应用程序开发过程中能够明显降低代码量,下面通过一个具体的改进进行举例说明。
如下是采用Java API实现一应用功能的代码:
然而,直接采用上述Java API的方式容易被逆向破解,安全性较差,因此考虑JNI的方法进行实现,保证安全性,下面是采用目前的JNI方式实现上述程序片段的功能的代码:
从上述代码量可以看输出,为了应用程序不被反编译破解,用C++来实现和Java一样的功能的话,开发人员不得不用JNI的方法,由C++去调用Java SDK里的API,而JNI调用比较繁琐,这种方式会导致代码量成倍的增长,且开发过程变的相当复杂,开发效率较低。
下面是采用本申请提供的C++API调用数据库中采用C++实现的功能模块来实现上述功能的代码:
通过上述几种方案的对比可以非常直观的看出,在采用了本申请提供的应用程序的获取装置进行应用程序开发时,不止能够保证应用程序不被反编译破解,并且相较于传统的JNI方式,开发过程中代码量非常少,实现简单,可以有效提高应用程序的开发效率。
在上述实施例的基础上,如果开发人员在应用过程中有新的功能的需要,且目前的提供的模块中暂时没有,还可以对数据库中存储的类或者算法等功能模块进行增加。
图6为本申请提供的应用程序的获取方法实施例二的流程图;如图6所示,对应用程序的获取装置中提供的功能模块进行增加的过程包括以下步骤:
S201:接收用户输入的功能模块添加请求。
在本步骤的实现中,开发人员在开发过程中,可查看现有的框架中是否有与Java对应的C++的功能(例如:class),如果没有则可以基于CBase或者Ccontext等基础类别派生出需要的class。如果有则可以进行调用该功能下的函数,具体的还可以确定该C++class中有没有需要的函数,如果没有则需要进行添加。开发人员只需要对交互界面上提供的接口进行操作即可进行添加。
对于该应用程序的获取装置来说,则可以接收到用户输入的功能模块的添加请求,触发功能模块的添加过程。
S202:根据功能模块添加请求,获取用户输入的C++代码。
在进入该过程之后,应用程序的获取装置提供相应的代码输入界面,开发人员可以输入或者添加相应的功能模块的代码。对于该应用程序的获取装置来说,则获取到C++代码。
S203:将C++代码进行实例化得到新的功能模块,并将新的功能模块存储在数据库中。
在本步骤中,该应用程序的获取装置将获取到的C++代码进行实例化,也就是实例化相应的class,并将得到的功能模块添加在其中,即存储在该数据库中。
后续实现过程中可以直接对该功能模块进行调用,实现相应的功能。
本实施例提供的应用程序的获取方法,核心思想是在C++端实现和Java类以及API一一对应的的C++类和API,这样将Java class和API一一在C++端得到对应,按照已有的设计思想和已实现的C++类,很容易扩展和实现没有的类,开发人员可以按照需要来扩展自己的C++类库。开发人员在这个C++wrapper的框架的帮助下,能迅速用C++语言实现和JavaSDK API一一对应的相同功能,节省了大量时间,减少内存泄露等潜在危险,提高了生产效率。
图7为本申请提供的电子设备的实体示意图。如图7所示,该电子设备100包括:
处理器110;以及,
存储器120,用于存储所述处理器110的可执行指令;
其中,所述处理器110配置为经由执行所述可执行指令来执行前述任一方法实施例提供的应用程序的获取方法。
可选地,存储器120既可以是独立的,也可以跟处理器110集成在一起。
当所述存储器120是独立于处理器110之外的器件时,所述电子设备还可以包括:接口130。
可选的,还可以包括:总线140,用于连接所述处理器以及所述存储器。
本申请还提供一种存储介质,其上存储有计算机程序,该程序被处理器执行时实现前述任一方法实施例提供的应用程序的获取方法。
本实施例还提供一种程序产品,该程序产品包括计算机程序,该计算机程序存储在存储介质中。电子设备的至少一个处理器可以从可读存储介质读取该计算机程序,至少一个处理器执行该计算机程序使得电子设备实施上述的各种实施方式提供的应用程序的获取方法。
可选的,上述任一实施例提供的应用程序的获取装置可以被实现为一种应用程序或者程序产品。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述各实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或对其中部分或全部技术特征进行等同替换;而这些修改或替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。