CN108008985A - 应用程序加载方法及装置 - Google Patents
应用程序加载方法及装置 Download PDFInfo
- Publication number
- CN108008985A CN108008985A CN201711160611.2A CN201711160611A CN108008985A CN 108008985 A CN108008985 A CN 108008985A CN 201711160611 A CN201711160611 A CN 201711160611A CN 108008985 A CN108008985 A CN 108008985A
- Authority
- CN
- China
- Prior art keywords
- base class
- specified
- classloader
- application program
- objects
- 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.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种应用程序加载方法及装置,涉及计算机技术领域,主要目的在于能够保证找到加载应用程序时需使用的私有变量,避免应用程序出现崩溃,从而能够保证成功加载应用程序,所述方法包括:当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。本发明适用于应用程序的加载。
Description
技术领域
本发明涉及计算机技术领域,特别是涉及一种应用程序加载方法及装置。
背景技术
随着信息技术的不断发展,安卓操作系统在移动终端领域得到了广泛的应用,在安卓操作系统中,为了对每个应用程序提供了独立的虚拟机支持其运行,同时提供了大量的对象供虚拟机使用。其中,ClassLoader对象也为其中最重要的一个对象,主要用于在应用程序启动或运行时完成dex文件以及资源等文件的加载。由于安卓操作系统采用了较高的安全机制,ClassLoader对象对应用程序的限制也比较明显。为了克服ClassLoader对象对应用程序的限制,通常自定义ClassLoader对象,即通过自定义的ClassLoader对象实现对应用程序的类或者资源的特定加载方式,例如,在加载插件的activity组件时,重定向应用程序的context为插件的context,以实现对插件的完整加载。
目前,主要通过继承ClassLoader基类的自定义的ClassLoader对象加载应用程序。然而,安卓操作系统在更新正在运行的应用程序时,通常会使用ClassLoader基类中不存在的私有变量,因此,通过上述方式加载应用程序,会造成无法找到其需使用的私有变量,导致加载的应用程序出现崩溃现象。
发明内容
有鉴于此,本发明提供一种应用程序加载方法及装置,主要目的在于能够保证找到加载应用程序时需使用的私有变量,避免应用程序出现崩溃,从而能够保证成功加载应用程序。
依据本发明第一方面,提供了一种应用程序加载方法,包括:
当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;
将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;
通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
依据本发明第二方面,提供了一种应用程序加载装置,包括:
确定单元,用于当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;
修改单元,用于将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;
加载单元,用于通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
依据本发明第三方面,提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:
当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;
将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;
通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
依据本发明第四方面,提供了另一种应用程序加载装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤:
当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;
将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;
通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
本发明提供一种应用程序加载方法及装置,与目前通过继承ClassLoader基类的自定义的ClassLoader对象加载应用程序相比,本发明在应用程序的更新进程启动时,能够确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;并能够将继承ClassLoader基类的自定义的ClassLoader对象修改为继承所述指定基类,从而能够通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序,从所述指定基类中找到所述操作系统需使用的指定私有变量,避免应用程序出现崩溃,成功加载并更新所述应用程序。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了本发明实施例提供的一种应用程序加载方法流程图;
图2示出了本发明实施例提供的另一种应用程序加载方法流程图;
图3示出了本发明实施例提供的一种应用程序加载装置的结构示意图;
图4示出了本发明实施例提供的另一种应用程序加载装置的结构示意图;
图5示出了本发明实施例提供的一种应用程序加载装置的实体结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
如背景技术所述,主要通过继承ClassLoader基类的自定义ClassLoader对象加载应用程序。然而,安卓操作系统在更新正在运行的应用程序时,通常会使用ClassLoader基类中不存在的私有变量,因此,通过上述方式加载应用程序,会造成无法找到其欲使用的私有变量,导致加载的应用程序出现崩溃现象。
为了解决上述技术问题,本发明实施例提供了一种应用程序加载方法,如图1所示,所述方法包括:
101、当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类。
需要说明的是,本发明实施例中的加载方法,可以通过对安卓操作系统下的待加载的应用程序进行改进实现,实施在安装有安卓操作系统的终端设备上,所述终端设备可以为手机、平板电脑、手持电脑等。所述加载方法可以实现在应用程序的安装包中,并在应用程序被安装后,每次更新的时候进行执行。所述指定基类可以为根据开发者的指示确定,例如,操作系统更新所述应用程序需使用的指定私有变量为libPath变量、libraryPathElement变量、mDexs变量、mFiles变量、mPaths变量、mZips变量、pathList变量中的一种或者多种时,所述指定基类可以为PathClassLoader基类。
102、将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类。
其中,所述自定义的ClassLoader对象可以为开发者根据具体逻辑代码自定义的,具体地,开发者可以根据其对应用程序的特定需求对操作系统原生的ClassLoader进行改写,并替换掉原生的ClassLoader,因此,自定义的ClassLoader对象继承的基类为ClassLoader基类。所述自定义的ClassLoader对象与系统原生ClassLoader对象的区别可以为:自定义的ClassLoader对象实现对应用程序的类或者资源的特定加载方式,例如,在加载插件的activity组件时,重定向应用程序的context为插件的context,以实现对插件的完整加载。为了实现自定义的ClassLoader可以重写ClassLoader对象下的用于获取资源的方法,且重写的方法须指向原有的ClassLoader对象,以保证自定义的ClassLoader不丧失其原有的功能,
对于本发明实施例,实现自定义的ClassLoader对象的过程可以为:将自定义的ClassLoader对象所对应的ClassLoader基类替换为所述指定基类,并覆写所述指定基类对应的构造函数;在覆写所述构造函数后,获取所述操作系统传递的所述指定基类中的所述指定私有变量;将所述指定私有变量复制到所述自定义的ClassLoader对象上。
103、通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
在通过继承所述指定基类的自定义的ClassLoader对象时,自定义的ClassLoader对象可以调用指定私有变量,从而能够从所述指定基类中找到所述操作系统需使用的指定私有变量,避免应用程序出现崩溃,成功加载并更新所述应用程序。
本发明实施例提供的一种应用程序加载方法,与目前通过继承ClassLoader基类的自定义的ClassLoader对象加载应用程序相比,本发明实施例在应用程序的更新进程启动时,能够确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;并能够将继承ClassLoader基类的自定义的ClassLoader对象修改为继承所述指定基类,从而能够通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序,从所述指定基类中找到所述操作系统需使用的指定私有变量,避免应用程序出现崩溃,成功加载并更新所述应用程序。
进一步的,为了更好的说明上述应用程序加载的过程,作为对上述实施例的细化和扩展,本发明实施例提供了另一种应用程序加载方法,如图2所示,但不限于此,具体如下所示:
201、当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类。
其中,所述指定基类为PathClassLoader基类,所述指定私有变量为libPath变量、libraryPathElement变量、mDexs变量、mFiles变量、mPaths变量、mZips变量、pathList变量中的一种或者多种。
202、将自定义的ClassLoader对象所对应的ClassLoader基类替换为所述指定基类,并覆写所述指定基类对应的构造函数。
对于本发明实施例,为了继承所述指定基类,需要在所对应的构造函数中传递必要的参数,操作系统在生成DexPathList时,通常会使用参数做一些显示磁盘目录命令(Dir)处理,而在加载应用程序时,不需要操作系统进行Dir处理,因此,可以通过将所述构造函数的特征参数传为“空字符串”,以“欺骗”操作系统。需要注意的是,所述“空字符串”不能为null,否则会出现异常。
在具体应用场景中,若所述指定基类为PathClassLoader基类,所述覆写所述指定基类对应的构造函数具体可以包括:确定所述PathClassLoader基类所对应的构造函数的Dex文件路径参数和Native库路径参数;将所述Dex文件路径参数和所述Native库路径参数传递为空字符串。所述Dex文件路径参数可以为dexPath。所述Native库路径参数可以为librarySearchPath。
例如,在Android的源代码中,所述PathClassLoader的构造函数可以按照如下方式定义:
第一个DexPath表示的是Dex文件路径参数,第二个是Native库的路径参数,第三个是父ClassLoader参数。因为系统在生成DexPathList时会用到前两个参数来做一些Dir的处理,而我们并不需要让系统那样做,因此我们需要“欺骗”系统,将其传为“空字符串”。
本发明实施例中覆写后的构造函数的实现可以为:
public RePluginClassLoader(ClassLoader parent,ClassLoader orig){
…
}
203、在覆写所述构造函数后,获取所述操作系统传递的所述指定基类中的所述指定私有变量。
其中,所述操作系统传递的所述指定私有变量可以为通过对所述指定基类进行反射处理得到的。例如,getClass类的getDeclaredField方法函数得到所述指定私有变量。
204、将所述指定私有变量复制到所述自定义的ClassLoader对象上,以实现所述自定义的ClassLoader对象继承所述指定基类。
需要说明的是,可以通过copyFromOriginal类的copyFieldValue方法,将所述指定私有变量复制到所述自定义的ClassLoader对象上。在复制指定私有变量时,可以对操作系统版本进行区别,不同的操作系统版本,私有变量不同。
例如,在Android 2.2-2.3.7的系统中,拷贝的私有变量可以包括libPath变量、libraryPathElement变量、mDexs变量、mFiles变量、mPaths变量、mZips变量,这些变量缺一不可。而对于Android 4.0及以上的版本,可以仅复制pathList。
对于本发明实施例,为了避免指定私有变量无法修改的情况,所述将所述指定私有变量复制到所述自定义的ClassLoader对象上的步骤具体可以包括:将所述指定私有变量修改为允许读写的私有变量;检测所述指定私有变量是否为一次赋值变量;若是,则通过预设反射规则删除一次赋值变量所对应的修饰符;在删除所述修饰符后,将所述指定私有变量复制到所述自定义的ClassLoader对象上。
例如,可以通过setAccessible类,将所述指定私有变量修改为允许读写的私有变量。在Java语言里,若私有变量被声明为“Final”,则该私有变量为一次赋值变量,一旦被赋值就不能再更改,因此,需要一些方式修改这些一次赋值变量,即在修改私有变量之前,将所述指定私有变量修改为允许读写的私有变量,否则在修改时会出现“无权访问”的异常,如果私有变量被声明为“Final”,可以借助Java反射规则来删除其对应的final修饰符,否则无法修改。需要说明的是,这种修改是“全局的”,只要应用程序存活,一次修改,所有指定基类都共享其“去掉Final”的“成果”。具体地,可以采用removeFieldFinalModifier类去掉Final修饰符。
205、获取所述操作系统为所述应用程序建立的PackageInfo对象。
对于本发明实施例,为了获取所述PackageInfo对象,所述步骤205具体可以包括:获取所述应用程序的Application对象;获取所述Application对象中的mBase对象;获取所述mBase对象中的mPackageInfo字段,通过mPackageInfo字段获取所述操作系统为所述应用程序建立的PackageInfo对象,所述mPackageInfo字段中存储有所述PackageInfo对象的地址。
其中,Application对象和Activity,Service一样是Andriod框架的一个系统组件,当Andriod程序启动时系统会创建一个Application对象,用来存储系统的一些信息。Andriod操作系统自动为每个应用程序创建一个Application类的对象,且指创建一个。所述mBase对象与context对应,一般在创建Application、Activity,Service时赋值,通过这个对象,可以找到每个应用程序的唯一的一些属性信息。所述mBase对象在不同版本的Andriod操作系统下代表不同的类型,但是不同Andriod操作系统下,都存在一个mPackageInfo字段。
206、获取所述PackageInfo对象中的mClassLoader字段。
其中,所述mClassLoader字段用于存储指向ClassLoader对象的地址。
207、修改所述mClassLoader字段中地址,使其指向继承所述指定基类的自定义的ClassLoader对象。
208、通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
对于本发明实施例,还提供如下具体应用场景,如下所示:当应用程序的更新进程启动时,将自定义的ClassLoader对象所对应的ClassLoader基类替换为PathClassLoader基类,并覆写所述PathClassLoader基类对应的构造函数,具体地,确定所述PathClassLoader基类所对应的构造函数的Dex文件路径参数和Native库路径参数;将所述Dex文件路径参数和所述Native库路径参数传递为空字符串;在覆写所述构造函数后,获取所述操作系统传递的所述指定基类中的所述指定私有变量;通过setAccessible类,将所述指定私有变量修改为允许读写的私有变量。如果所述指定私有变量为一次赋值变量,通过Java反射规则删除一次赋值变量所对应的Final修饰符,在删除所述Final修饰符后,通过copyFromOriginal类的copyFieldValue方法,将所述指定私有变量复制到所述自定义的ClassLoader对象上,以实现所述自定义的ClassLoader对象继承所述指定基类。
在实现所述自定义的ClassLoader对象继承所述指定基类后,可以获取所述操作系统为所述应用程序建立的PackageInfo对象;获取所述PackageInfo对象中的mClassLoader字段,所述mClassLoader字段用于存储指向ClassLoader对象的地址;修改所述mClassLoader字段中地址,使其指向继承所述指定基类的自定义的ClassLoader对象,通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
本发明实施例提供的另一种应用程序加载方法,与目前通过继承ClassLoader基类的自定义的ClassLoader对象加载应用程序相比,本发明实施例在应用程序的更新进程启动时,能够确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类,将自定义的ClassLoader对象所对应的ClassLoader基类替换为所述指定基类,并覆写所述指定基类对应的构造函数。与此同时,在覆写所述构造函数后,能够获取操作系统传递的所述指定基类中的所述指定私有变量;将所述指定私有变量复制到所述自定义的ClassLoader对象上,从而能够实现所述自定义的ClassLoader对象继承所述指定基类;通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序,进而能够找到所述操作系统需使用的指定私有变量,避免出现应用程序出现崩溃,成功加载应用程序。
进一步地,作为图1的具体实现,本发明实施例提供了一种应用程序加载装置,如图3所示,所述装置包括:确定单元31、修改单元32和加载单元33。
所述确定单元31,可以用于当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类。所述确定单元31是本装置中当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类得的主要功能模块。
其中,所述指定基类为PathClassLoader基类,所述指定私有变量为libPath变量、libraryPathElement变量、mDexs变量、mFiles变量、mPaths变量、mZips变量、pathList变量中的一种或者多种。
所述修改单元32,可以用于将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类。所述修改单元32是本装置中将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类的主要功能模块,也是本装置的核心模块。
所述加载单元33,可以用于通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。所述加载单元33是本装置中通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序的主要功能模块。
如图4所示,对于本发明实施例,为了实现所述自定义的ClassLoader对象继承所述指定基类所述修改单元32可以包括:替换模块321、覆写模块322、获取模块323和复制模块324。
所述替换模块321,可以用于将自定义的ClassLoader对象所对应的ClassLoader基类替换为所述指定基类。
所述覆写模块322,可以用于覆写所述指定基类对应的构造函数。
所述获取模块323,可以用于在覆写所述构造函数后,获取所述操作系统传递的所述指定基类中的所述指定私有变量。
所述复制模块324,可以将所述指定私有变量复制到所述自定义的ClassLoader对象上,以实现所述自定义的ClassLoader对象继承所述指定基类。
对于本发明实施例,为了“欺骗”操作系统,不进行Dir处理,所述覆写模块322,具体可以用于将所述指定基类对应的构造函数的特征参数传递为空字符串。
为了进一步达到“欺骗”操作系统防止出现异常的效果,所述复制模块324,具体可以用于检测所述指定私有变量是否为一次赋值变量;若指定私有变量为一次赋值变量,则通过预设反射规则删除一次赋值变量所对应的修饰符;在删除所述修饰符后,将所述指定私有变量复制到所述自定义的ClassLoader对象上。具体地,可以通过copyFromOriginal类的copyFieldValue方法,将所述指定私有变量复制到所述自定义的ClassLoader对象上。
此外,为了避免在修改指定私有变量时,出现“无权访问”的异常,所述复制模块324,具体还可以用于将所述指定私有变量修改为允许读写的私有变量。例如,可以通过setAccessible类,将所述指定私有变量修改为允许读写的私有变量。
在具体应用场景中,若所述指定基类为PathClassLoader基类,则所述特定参数可以为Dex文件路径参数和Native库路径参数。所述覆写模块322,具体可以用于确定所述PathClassLoader基类所对应的构造函数的Dex文件路径参数和Native库路径参数;将所述Dex文件路径参数和所述Native库路径参数传递为空字符串。
对于本发明实施例,为了实现加载所述应用程序,所述装置还包括:获取单元34。
所述获取单元34,可以用于获取所述操作系统为所述应用程序建立的PackageInfo对象,并获取所述PackageInfo对象中的mClassLoader字段,所述mClassLoader字段用于存储指向ClassLoader对象的地址。
所述修改单元32,还可以用于修改所述mClassLoader字段中地址,使其指向继承所述指定基类的自定义的ClassLoader对象。
为了实现获取所述操作系统为所述应用程序建立的PackageInfo对象,所述获取单元34,具体可以用于获取所述应用程序的Application对象,获取所述Application对象中的mBase对象,获取所述mBase对象中的mPackageInfo字段,通过mPackageInfo字段获取所述操作系统为所述应用程序建立的PackageInfo对象,所述mPackageInfo字段中存储有所述PackageInfo对象的地址。
需要说明的是,本发明实施例提供的一种应用程序加载装置所涉及各功能模块的其他相应描述,可以参考图1所示方法的对应描述,在此不再赘述。
基于上述如图1所示方法,相应的,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
基于上述如图1所示方法和如图3所示客户端的实施例,本发明实施例还提供了一种应用程序加载装置的实体结构图,如图5所示,该装置包括:处理器41、存储器42、及存储在存储器42上并可在处理器上运行的计算机程序,其中存储器42和处理器41均设置在总线43上所述处理器41执行所述程序时实现以下步骤:当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
通过本发明的技术方案,能够确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类,将自定义的ClassLoader对象所对应的ClassLoader基类替换为所述指定基类,并覆写所述指定基类对应的构造函数。与此同时,在覆写所述构造函数后,能够获取操作系统传递的所述指定基类中的所述指定私有变量;将所述指定私有变量复制到所述自定义的ClassLoader对象上,从而能够实现所述自定义的ClassLoader对象继承所述指定基类;通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序,进而能够找到所述操作系统需使用的指定私有变量,避免出现应用程序出现崩溃,成功加载应用程序。此外,通过将所述构造函数的特征参数传为“空字符串”,能够“欺骗”操作系统,避免应用程序出现异常。通过获取操作系统传递的所述指定基类中的所述指定私有变量;将所述指定私有变量复制到所述自定义的ClassLoader对象上,能够实现进一步达到“欺骗”操作系统防止出现异常的效果,且不涉及到自定义的ClassLoader对象内部的复制,能够保证自定义的ClassLoader对象的性能。
本发明还提供如下技术方案:
A1、一种应用程序加载方法,包括:
当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;
将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;
通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
A2、如A1所述的方法,所述将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类,具体包括:
将自定义的ClassLoader对象所对应的ClassLoader基类替换为所述指定基类,并覆写所述指定基类对应的构造函数;
在覆写所述构造函数后,获取所述操作系统传递的所述指定基类中的所述指定私有变量;
将所述指定私有变量复制到所述自定义的ClassLoader对象上,以实现所述自定义的ClassLoader对象继承所述指定基类。
A3、如A2所述的方法,所述覆写所述指定基类对应的构造函数,具体包括:
将所述指定基类对应的构造函数的特征参数传递为空字符串。
A4、如A2所述的方法,所述将所述指定私有变量复制到所述自定义的ClassLoader对象上,具体包括:
检测所述指定私有变量是否为一次赋值变量;
若是,则通过预设反射规则删除一次赋值变量所对应的修饰符;
在删除所述修饰符后,将所述指定私有变量复制到所述自定义的ClassLoader对象上。
A5、如A4所述的方法,所述检测所述指定私有变量是否被声明为一次赋值变量之前,所述方法还包括:
将所述指定私有变量修改为允许读写的私有变量。
A6、如A1-A5任一项所述的方法,所述指定基类为PathClassLoader基类,所述指定私有变量为libPath变量、libraryPathElement变量、mDexs变量、mFiles变量、mPaths变量、mZips变量、pathList变量中的一种或者多种。
A7、如A6所述的方法,所述覆写所述指定基类对应的构造函数,具体包括:
确定所述PathClassLoader基类所对应的构造函数的Dex文件路径参数和Native库路径参数;
将所述Dex文件路径参数和所述Native库路径参数传递为空字符串。
A8、如A1-A5任一项所述的方法,所述通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序之前,所述方法还包括:
获取所述操作系统为所述应用程序建立的PackageInfo对象;
获取所述PackageInfo对象中的mClassLoader字段,所述mClassLoader字段用于存储指向ClassLoader对象的地址;
修改所述mClassLoader字段中地址,使其指向继承所述指定基类的自定义的ClassLoader对象。
A9、如A7所述的方法,所述获取所述操作系统为所述应用程序建立的PackageInfo对象,具体包括:
获取所述应用程序的Application对象;
获取所述Application对象中的mBase对象;
获取所述mBase对象中的mPackageInfo字段,通过mPackageInfo字段获取所述操作系统为所述应用程序建立的PackageInfo对象,所述mPackageInfo字段中存储有所述PackageInfo对象的地址。
B10、一种应用程序加载装置,包括:
确定单元,用于当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;
修改单元,用于将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;
加载单元,用于通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
B11、如B10所述的装置,所述修改单元包括:
替换模块,用于将自定义的ClassLoader对象所对应的ClassLoader基类替换为所述指定基类;
覆写模块,用于覆写所述指定基类对应的构造函数;
获取模块,用于在覆写所述构造函数后,获取所述操作系统传递的所述指定基类中的所述指定私有变量;
复制模块,将所述指定私有变量复制到所述自定义的ClassLoader对象上,以实现所述自定义的ClassLoader对象继承所述指定基类。
B12、如B11所述的装置,
所述覆写模块,具体用于将所述指定基类对应的构造函数的特征参数传递为空字符串。
B13、如B11所述的装置,
所述复制模块,具体用于检测所述指定私有变量是否为一次赋值变量;若指定私有变量为一次赋值变量,则通过预设反射规则删除一次赋值变量所对应的修饰符;在删除所述修饰符后,将所述指定私有变量复制到所述自定义的ClassLoader对象上。
B14、如B13所述的装置,
所述复制模块,具体还用于将所述指定私有变量修改为允许读写的私有变量。
B15、如B10-B14任一项所述的装置,所述指定基类为PathClassLoader基类,所述指定私有变量为libPath变量、libraryPathElement变量、mDexs变量、mFiles变量、mPaths变量、mZips变量、pathList变量中的一种或者多种。
B16、如B15所述的装置,
所述覆写模块,具体用于确定所述PathClassLoader基类所对应的构造函数的Dex文件路径参数和Native库路径参数;将所述Dex文件路径参数和所述Native库路径参数传递为空字符串。
B17、如B10-B14任一项所述的装置,所述装置还包括:获取单元,
获取单元,用于获取所述操作系统为所述应用程序建立的PackageInfo对象,并获取所述PackageInfo对象中的mClassLoader字段,所述mClassLoader字段用于存储指向ClassLoader对象的地址;
所述修改单元,还用于修改所述mClassLoader字段中地址,使其指向继承所述指定基类的自定义的ClassLoader对象。
B18、如B17所述的装置,
所述获取单元,具体用于获取所述应用程序的Application对象,获取所述Application对象中的mBase对象,获取所述mBase对象中的mPackageInfo字段,通过mPackageInfo字段获取所述操作系统为所述应用程序建立的PackageInfo对象,所述mPackageInfo字段中存储有所述PackageInfo对象的地址。
C19、一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:
当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;
将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;
通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
D20、一种应用程序加载装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤:
当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;
将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;
通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
可以理解的是,上述方法及装置中的相关特征可以相互参考。另外,上述实施例中的“第一”、“第二”等是用于区分各实施例,而并不代表各实施例的优劣。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的应用程序加载装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
Claims (10)
1.一种应用程序加载方法,其特征在于,包括:
当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;
将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;
通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
2.根据权利要求1所述的方法,其特征在于,所述将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类,具体包括:
将自定义的ClassLoader对象所对应的ClassLoader基类替换为所述指定基类,并覆写所述指定基类对应的构造函数;
在覆写所述构造函数后,获取所述操作系统传递的所述指定基类中的所述指定私有变量;
将所述指定私有变量复制到所述自定义的ClassLoader对象上,以实现所述自定义的ClassLoader对象继承所述指定基类。
3.根据权利要求2所述的方法,其特征在于,所述覆写所述指定基类对应的构造函数,具体包括:
将所述指定基类对应的构造函数的特征参数传递为空字符串。
4.根据权利要求2所述的方法,其特征在于,所述将所述指定私有变量复制到所述自定义的ClassLoader对象上,具体包括:
检测所述指定私有变量是否为一次赋值变量;
若是,则通过预设反射规则删除一次赋值变量所对应的修饰符;
在删除所述修饰符后,将所述指定私有变量复制到所述自定义的ClassLoader对象上。
5.根据权利要求4所述的方法,其特征在于,所述检测所述指定私有变量是否被声明为一次赋值变量之前,所述方法还包括:
将所述指定私有变量修改为允许读写的私有变量。
6.根据权利要求1-5任一项所述的方法,其特征在于,所述指定基类为PathClassLoader基类,所述指定私有变量为libPath变量、libraryPathElement变量、mDexs变量、mFiles变量、mPaths变量、mZips变量、pathList变量中的一种或者多种。
7.根据权利要求6所述的方法,其特征在于,所述覆写所述指定基类对应的构造函数,具体包括:
确定所述PathClassLoader基类所对应的构造函数的Dex文件路径参数和Native库路径参数;
将所述Dex文件路径参数和所述Native库路径参数传递为空字符串。
8.一种应用程序加载装置,其特征在于,包括:
确定单元,用于当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;
修改单元,用于将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;
加载单元,用于通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现以下步骤:
当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;
将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;
通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
10.一种应用程序加载装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现以下步骤:
当应用程序的更新进程启动时,确定操作系统更新所述应用程序需使用的指定私有变量对应的指定基类;
将自定义的ClassLoader对象继承ClassLoader基类修改为继承所述指定基类;
通过继承所述指定基类的自定义的ClassLoader对象,加载所述应用程序。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711160611.2A CN108008985A (zh) | 2017-11-20 | 2017-11-20 | 应用程序加载方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711160611.2A CN108008985A (zh) | 2017-11-20 | 2017-11-20 | 应用程序加载方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108008985A true CN108008985A (zh) | 2018-05-08 |
Family
ID=62053215
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711160611.2A Pending CN108008985A (zh) | 2017-11-20 | 2017-11-20 | 应用程序加载方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108008985A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112068903A (zh) * | 2020-09-21 | 2020-12-11 | 深圳市欢太科技有限公司 | 应用程序的加载方法、应用程序的加载装置、介质与设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103268444A (zh) * | 2012-12-28 | 2013-08-28 | 武汉安天信息技术有限责任公司 | 一种基于插件加载的android恶意代码检测系统及方法 |
CN104731622A (zh) * | 2015-03-27 | 2015-06-24 | 北京奇虎科技有限公司 | 一种应用程序的加载方法、装置和移动终端 |
CN104731625A (zh) * | 2015-03-27 | 2015-06-24 | 北京奇虎科技有限公司 | 一种加载插件的方法、装置和移动终端 |
CN107239313A (zh) * | 2017-06-09 | 2017-10-10 | 中国建设银行股份有限公司 | Spring应用服务的升级方法和存储介质 |
-
2017
- 2017-11-20 CN CN201711160611.2A patent/CN108008985A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103268444A (zh) * | 2012-12-28 | 2013-08-28 | 武汉安天信息技术有限责任公司 | 一种基于插件加载的android恶意代码检测系统及方法 |
CN104731622A (zh) * | 2015-03-27 | 2015-06-24 | 北京奇虎科技有限公司 | 一种应用程序的加载方法、装置和移动终端 |
CN104731625A (zh) * | 2015-03-27 | 2015-06-24 | 北京奇虎科技有限公司 | 一种加载插件的方法、装置和移动终端 |
CN107239313A (zh) * | 2017-06-09 | 2017-10-10 | 中国建设银行股份有限公司 | Spring应用服务的升级方法和存储介质 |
Non-Patent Citations (1)
Title |
---|
刘镓旗: "唯一插件化Replugin源码及原理深度剖析——唯一Hook点原理", 《HTTPS://BLOG.CSDN.NET/YULONG0809/ARTICLE/DETAILS/78426280?UTM_SOURCE=BLOGXGWZ0》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112068903A (zh) * | 2020-09-21 | 2020-12-11 | 深圳市欢太科技有限公司 | 应用程序的加载方法、应用程序的加载装置、介质与设备 |
CN112068903B (zh) * | 2020-09-21 | 2024-05-03 | 深圳市欢太科技有限公司 | 应用程序的加载方法、应用程序的加载装置、介质与设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11199969B2 (en) | Storage system interface | |
US9430224B2 (en) | Hot-update method and apparatus | |
US11175909B2 (en) | Software discovery using exclusion | |
CN109491695A (zh) | 一种集成安卓应用的增量更新方法 | |
EP2650783A1 (en) | On-demand database service system, method, and computer program product for verifying that a developed application will operate properly with at least one other application | |
US20180329725A1 (en) | Method and apparatus for loading application | |
US9450985B2 (en) | Server validation with dynamic assembly of scripts | |
US9542173B2 (en) | Dependency handling for software extensions | |
US10891298B2 (en) | Systems and methods for package component visualizations | |
CN108614702B (zh) | 字节码优化方法及装置 | |
US10338910B2 (en) | Multi-tenant upgrading | |
CN107085613B (zh) | 入库文件的过滤方法和装置 | |
CN105468351A (zh) | 一种用于开发Android平台应用的软件集成方法及装置 | |
CN104731622A (zh) | 一种应用程序的加载方法、装置和移动终端 | |
JP2016502219A (ja) | 不変オブジェクトタイプ | |
WO2019041891A1 (zh) | 升级包的生成方法及装置 | |
EP3121750B1 (en) | System and method for antivirus checking of native images of software assemblies | |
CN110888922A (zh) | 一种数据同步时目标表的创建方法及装置 | |
CN108694049B (zh) | 一种更新软件的方法和设备 | |
US8131884B1 (en) | Reusing system configuration information and metadata for related operations | |
US9760364B2 (en) | Checks for software extensions | |
CN111813379A (zh) | 应用部署方法及装置、电子设备、计算机可读存储介质 | |
US9477447B1 (en) | Semantic representations of software extensions | |
CN108008985A (zh) | 应用程序加载方法及装置 | |
CN112748905B (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 | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20180508 |
|
RJ01 | Rejection of invention patent application after publication |