一种安卓应用免安装启动的方法、装置及终端与流程

文档序号:12463236阅读:664来源:国知局
一种安卓应用免安装启动的方法、装置及终端与流程

本发明涉及计算机技术领域,更具体地说,涉及一种安卓应用免安装启动的方法、装置及终端。



背景技术:

现有的Android安装包(AndroidPackage,apk)免安装启动采用一个程序,称为宿主程序,去动态加载apk并将其放在宿主程序的进程中执行,如图1所示,宿主程序使用DexClassLoader动态加载放在sd卡上的apk后,使得宿主程序可以使用反射机制访问安装包里的各个class类,通过proxy的activity去执行apk中的activity从而达到免安装启动的效果。

然而,将apk加载到宿主程序中去执行,就无法通过宿主程序的Context(上下文)去获取到apk中的资源文件,比如图片、文本等,原因在于,apk已经不存在Context了,它执行时所采用的上下文是宿主程序的上下文,用宿主程序的Context是无法得到自己的资源。另外,还有一个问题是activity的生命周期,在apk被宿主程序加载执行后,它的activity其实就是一个普通的类,正常情况下,activity的生命周期是由系统来管理的,在被宿主程序接管后,无法自动由系统管理。



技术实现要素:

本发明要解决的技术问题在于,针对现有的Android安装包免安装启动的上述缺陷,提供一种安卓应用免安装启动的方法、装置及终端。

本发明解决上述问题的技术方案是提供了一种安卓应用免安装启动的方法,该方法包括:

调用界面发起免安装启动安卓应用的apk的请求;

构造类加载器,并构造访问所述apk的资源文件的Context;

使用动态加载代理反射所述apk的初始化模块,将所述Context传输给所述apk;

根据所述类加载器和所述Context分别加载所述apk的各个组件。

在上述安卓应用免安装启动的方法中,所述构造类加载器的步骤包括:

检查所述安卓应用的所述apk是否已解压到调用程序的目录下;

在所述安卓应用的所述apk未已解压到调用程序的目录下时,所述采用zip算法将所述安卓应用的所述apk解压到所述调用程序的目录下;

在所述安卓应用的所述apk已解压到所述调用程序的目录下时,通过所述apk的路径,将解压的dex路径和lib路径构造所述类加载器。

在上述安卓应用免安装启动的方法中,所述构造访问所述apk的资源文件的Context的步骤包括:

重新创建资源管理器,并使用addAssetPath函数把所述apk的资源文件的路径修改为所述apk的路径;

使用所述资源管理器创建新的资源Resources类,其中,所述资源Resources类是指向所述apk的;

重写父类的getResources函数和getAssets函数,并返回所述资源Resources类和所述资源管理器。

在上述安卓应用免安装启动的方法中,所述方法还包括:

根据插件对象类名使用动态加载代理反射所述apk内的各个插件对象,其中,每一所述插件对象使用所述Context访问各自的资源文件;

在被调用端界面访问所述插件对象时,使用createFragment函数返回一个UI元素给调用界面显示。

在上述安卓应用免安装启动的方法中,所述插件对象继承于同一个抽象插件对象,且所述抽象插件对象定义各个生命周期函数。

本发明还提供了一种安卓应用免安装启动的装置,该装置包括请求模块、构造模块、传输模块和加载模块,其中,所述构造模块包括第一构造单元和第二构造单元;所述请求模块用于调用界面发起免安装启动安卓应用的apk的请 求;所述第一构造单元用于构造类加载器;所述第二构造单元构造访问所述apk的资源文件的Context;所述传输模块用于使用动态加载代理反射所述apk的初始化模块,将所述Context传输给所述apk;所述加载模块根据所述类加载器类和所述Context分别加载所述apk的各个组件。

在上述安卓应用免安装启动的装置中,所述第一构造单元包括:

检查子单元,用于检查所述安卓应用的所述apk是否已解压到调用程序的目录下;

解压子单元,用于在所述安卓应用的所述apk未已解压到调用程序的目录下时,采用zip算法将所述安卓应用的所述apk解压到所述调用程序的目录下。

构造子单元,用于在所述安卓应用的所述apk已解压到所述调用程序的目录下时,通过所述apk的路径,将解压的dex路径和lib路径构造所述类加载器。

在上述安卓应用免安装启动的装置中,所述第二构造单元包括:

修改子单元,用于重新创建资源管理器,并使用addAssetPath函数把所述apk的资源文件的路径修改为所述apk的路径;

创建子单元,用于使用所述资源管理器创建新的资源Resources类,其中,所述资源Resources类是指向所述apk的;

返回子单元,用于重写父类的getResources函数和getAssets函数,并返回所述资源Resources类和所述资源管理器。

在上述安卓应用免安装启动的装置中,所述装置还包括第二加载模块和返回模块,其中:

所述第二加载模块用于根据插件对象类名使用动态加载代理反射所述apk内的各个插件对象,其中,每一所述插件对象使用所述Context访问各自的资源文件,且所述插件对象继承于同一个抽象插件对象,且所述抽象插件对象定义各个生命周期函数;

所述返回模块用于在被调用端界面访问所述插件对象时,使用createFragment函数返回一个UI元素给调用界面显示。

本发明还提供了一种终端,所述终端包括处理器、存储器以及存储与所述存储器内的如上述所述的安卓应用免安装启动的装置。

实施本发明的安卓应用免安装启动的方法、装置及终端的有益效果有:通过将解压的dex路径和lib路径构造类加载器DexClassLoader,并构造访问该apk的资源文件的Context,实现安卓应用的免安装启动,使得该安卓应用的apk在启动时能够得到自己的资源,解决了现有的安卓应用的apk免安装启动后无法访问自身资源文件的问题。同时,通过抽象插件定义各个生命周期,并采用createFragment函数返回一个UI元素给调用者界面显示,使得系统能自动管理生命周期,保留了Activity有生命周期函数的特性。

附图说明

图1是现有的Android安装包免安装启动的结构示意图。

图2是本发明的安卓应用免安装启动的方法实施例的流程图。

图3是本发明的构造类加载器DexClassLoader的流程图。

图4是本发明的安卓应用免安装启动的装置实施例的结构示意图。

图5是本发明的终端实施例的结构示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。

如图2所示,是本发明的安卓应用免安装启动的方法实施例的流程图。安卓应用是安装在安卓设备上的应用程序,该方法的执行主体是该应用程序的Android安装包,即apk。具体地,在本发明的实施例的该方法包括以下步骤:

S1、调用界面发起免安装启动安卓应用的apk的请求。这样安卓应用免安装启动开始,以采用反射调用来获取该安卓应用的apk中的各个组件,包括活动组件、服务组件等。

S2、构造类加载器DexClassLoader,并构造访问该apk的资源文件的Context。

其中,如图3所示,构造类加载器DexClassLoader的步骤包括:

S211、检查该安卓应用的apk是否已解压到调用程序的目录下,若否则执行步骤S212,若是则执行步骤S213。其中,调用程序的目录为data/data/包名/files。

S212、采用zip算法将该安卓应用的apk解压到调用程序的目录下。

S213、在该安卓应用的apk已解压到调用程序的目录下时,通过该apk的路径,将解压的dex路径和lib路径构造类加载器DexClassLoader。该类加载器DexClassLoader用于加载各个组件的相应加载类。

进一步地,在本发明的实施例中,Context是继承于ContextThemeWrapper,构造访问该apk的资源文件的Context的步骤具体包括:

重新创建资源管理器AssetManager,并使用addAssetPath函数把该apk的资源文件的路径修改为该apk的路径;

使用资源管理器AssetManager创建新的资源Resources类,其中,该资源Resources类是指向该apk的,这样该资源Resources类可以访问apk的资源文件;

重写父类的getResources函数和getAssets函数,并返回该资源Resources类和该资源管理器AssetManager。

在本实施例中,构造该Context后,该apk具备自己的Context,从而在后续步骤中可以访问自己的资源文件。

S3、使用动态加载代理反射该apk的初始化模块,将构造的Context传输给该apk。

S4、根据类加载器类DexClassLoader和Context分别加载该apk的各个组件。

在本发明的实施例中,为了系统能自动管理生命周期,该方法还包括:

根据插件对象类名使用动态加载代理反射该apk内的各个插件对象,其中,每一插件对象使用调用端传输过来的Context访问各自的资源文件。在此步骤中,各个插件对象继承于同一个抽象插件对象,该抽象插件对象定义各个生命周期函数,在本实施例中生命周期函数包括:函数onActivityCreate()、函数onActivityResume()、函数onActivityPause()、函数onActivityDestory()、函数onKeyDown(int keyCode,KeyEvent event)、函数onActivityResult(int requestCode,int resultCode,Intent data)。

在被调用端界面访问插件对象时,使用createFragment函数返回一个UI元素给调用界面显示。此时,插件对象的各个生命周期函数就不在调用界面上显示调用,系统则自动调用Fragment的生命周期,从而保留了Activity(活动)组件的特征。

在本发明的实施例中,通过将解压的dex路径和lib路径构造类加载器DexClassLoader,并构造访问该apk的资源文件的Context,实现安卓应用的免安装启动,使得该安卓应用的apk在启动时能够得到自己的资源。同时,通过抽象插件定义各个生命周期,并采用createFragment函数返回一个UI元素给调用者界面显示,使得系统能自动管理生命周期,保留Activity有生命周期函数的特性。

如图4所示,是本发明的安卓应用免安装启动的装置实施例的结构示意图。在本实施例中,安卓应用是安装在安卓设备上的应用程序,通过该装置10,该应用程序的Android安装包,即apk,可以实现免安装启动。具体地,在本发明的实施例的该装置10包括请求模块11、构造模块12、传输模块13和加载模块14,其中:

请求模块11用于调用界面发起免安装启动安卓应用的apk的请求。这样安卓应用免安装启动开始,以采用反射调用来获取该安卓应用的apk中的各个组件,包括活动组件、服务组件等。

构造模块12用于构造类加载器DexClassLoader,并构造访问该apk的资源文件的Context。具体的,该构造模块包括第一构造单元和第二构造单元,第一构造单元用于构造类加载器DexClassLoader;第二构造单元用于构造访问该apk的资源文件的Context。

其中,具体的,第一构造模块包括检查子单元、解压子单元和构造子单元,检查子单元和解压子单元分别与构造子单元连接,检查子单元用于检查该安卓应用的apk是否已解压到调用程序的目录下,若否则转入到解压子单元,若是则转入到构造子单元。其中,调用程序的目录为data/data/包名/files。解压子单元用于采用zip算法将该安卓应用的apk解压到调用程序的目录下。构造子单元用于在该安卓应用的apk已解压到调用程序的目录下时,通过该apk的路径,将 解压的dex路径和lib路径构造类加载器DexClassLoader。该类加载器DexClassLoader用于加载各个组件的相应加载类。

进一步地,在本发明的实施例中,Context是继承于ContextThemeWrapper,第二构造模块还包括修改子单元、创建子单元和返回子单元,修改子单元用于重新创建资源管理器AssetManager,并使用addAssetPath函数把该apk的资源文件的路径修改为该apk的路径;创建子单元用于使用资源管理器AssetManager创建新的资源Resources类,其中,该资源Resources类是指向该apk的,这样该资源Resources类可以访问apk的资源文件;返回子单元用于重写父类的getResources函数和getAssets函数,并返回该资源Resources类和该资源管理器AssetManager。

在本实施例中,构造该Context后,该apk具备自己的Context,从而在后续步骤中可以访问自己的资源文件。

传输模块13用于使用动态加载代理反射该apk的初始化模块,将构造的Context传输给该apk。

第一加载模块14用于根据类加载器类DexClassLoader和Context分别加载该apk的各个组件。

进一步地,在本发明的实施例中,为了系统能自动管理生命周期,该装置10还包括第二加载模块15和返回模块16,其中:

第二加载模块15用于根据插件对象类名使用动态加载代理反射该apk内的各个插件对象,其中,每一插件对象使用调用端传输过来的Context访问各自的资源文件。各个插件对象继承于同一个抽象插件对象,该抽象插件对象定义各个生命周期函数,在本实施例中生命周期函数包括:函数onActivityCreate()、函数onActivityResume()、函数onActivityPause()、函数onActivityDestory()、函数onKeyDown(int keyCode,KeyEvent event)、函数onActivityResult(int requestCode,int resultCode,Intent data)。

返回模块16用于在被调用端界面访问时,使用createFragment函数返回一个UI元素给调用者界面显示。此时,插件对象的各个生命周期函数就不在调用界面上显示调用,系统则自动调用Fragment的生命周期,从而保留了Activity (活动)组件的特征。

在本发明的实施例中,通过将解压的dex路径和lib路径构造类加载器DexClassLoader,并构造访问该apk的资源文件的Context,实现安卓应用的免安装启动,使得该安卓应用的apk在启动时能够得到自己的资源。同时,通过抽象插件定义各个生命周期,并采用createFragment函数返回一个UI元素给调用者界面显示,使得系统能自动管理生命周期,保留Activity有生命周期函数的特性。

如图5所示,是本发明的终端实施例的结构示意图。该终端100包括处理器101、存储器102和存储在存储器102的上述实施例的安卓应用免安装启动的装置10,处理器与存储器连接。

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

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