技术摘要:
本发明公开了一种启动应用的控件加载方法及装置,涉及应用研发技术领域,主要目的在于在主Dex中利用代理组件替换应用启动所需的组件以确保应用成功启动。本发明主要的技术方案为:在主Dex中设置代理组件以及组件映射表,所述组件映射表中记录有所述代理组件与设置在辅 全部
背景技术:
随着应用不断迭代,业务线的扩展,App的功能越来越丰富,其编译包也就越来越 大,在Android编译App的时候,很容易出现Dex文件方法数超过了最大值65536上限的错误。 这是因为在Android系统中,一个APP的所有代码都在一个Dex文件里面。Dex是一个类似Jar 的存储了多个Java编译字节码的归档文件。因为Android系统使用Dalvik虚拟机,所以需要 把使用Java Compiler编译之后的class文件转换成Dalvik能够执行的class文件。当 Android系统启动一个应用的时候,需要对Dex进行优化,这个过程有一个专门的工具来处 理,叫DexOpt,DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这个过程会生成 一个ODex文件,即Optimised Dex,因为执行ODex的效率会比直接执行Dex文件的效率要高 很多,而DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面,但是在Android 5 .0以下的大部分手机中这个链表的长度是用一个short类型来保存的,因为Dalvik的 invoke-kind指令集中,method reference inDex只留了16bits,最多能引用65535个方法, 导致了方法id的数目不能够超过65536个。所以Android IDE在编译项目的时候,限制了Dex 的方法数,当一个项目足够大的时候,就会发生该错误。 为了解决上述的问题,常用的是multiDex的分包方案,当方法数超过65536的时 候,生成多个Dex文件,把应用启动时必须用到的类和该类的直接引用类放到主Dex中,把其 他类放到辅助Dex中。当应用启动之后,动态加载辅助Dex,从而避免出现方法数超出65536 上限的问题。然而,这种分包方案并不能确保将所有应用启动必须的类放到主Dex中,而一 旦出现该情况,在应用启动时,如果从主Dex中无法加载到启动所需的组件,而存储该组件 的辅助Dex此时还未动态加载完成,那么该应用将会因为组件无法加载而导致启动失败。
技术实现要素:
鉴于上述问题,本发明提出了一种启动应用的控件加载方法及装置,主要目的在 于在主Dex中利用代理组件替换应用启动所需的组件以确保应用成功启动。 为达到上述目的,本发明主要提供如下技术方案: 一方面,本发明提供一种启动应用的控件加载方法,具体包括: 在主Dex中设置代理组件以及组件映射表,所述组件映射表中记录有所述代理组 件与设置在辅助Dex中的应用组件的对应关系; 在启动应用时,将应用中的类加载器替换为代理类加载器,所述代理类加载器用 于在所有Dex优化完成前将启动应用所需加载的应用组件替换为对应的代理组件; 利用优化完成的Dex中的应用组件替换应用加载的代理组件,以启动所述应用组 件。 另一方面,本发明提供一种启动应用的控件加载装置,具体包括: 4 CN 111552518 A 说 明 书 2/8 页 设置单元,用于在主Dex中设置代理组件以及组件映射表,所述组件映射表中记录 有所述代理组件与设置在辅助Dex中的应用组件的对应关系; 类加载器替换单元,用于在启动应用时,将应用中的类加载器替换为代理类加载 器,所述代理类加载器用于在所有Dex优化完成前将启动应用所需加载的应用组件替换为 对应的代理组件; 组件替换单元,用于利用优化完成的Dex中的应用组件替换应用加载的代理组件, 以启动所述应用组件。 另一方面,本发明提供一种存储介质,所述存储介质用于存储的计算机程序,其 中,所述计算机程序运行时控制所述存储介质所在设备执行上述的启动应用的控件加载方 法。 另一方面,本发明提供一种处理器,所述处理器用于运行计算机程序,其中,所述 计算机程序运行时执行上述的启动应用的控件加载方法。 借由上述技术方案,本发明提供的一种启动应用的控件加载方法及装置,能够克 服主Dex中需要加载的组件数量过多而导致的应用启动失败的问题。本发明通过在主Dex中 设置应用的组件映射表以及自定义的代理组件,在启动应用时,利用自定义的代理类加载 器,将应用启动所需加载的在辅助Dex中应用组件替换为代理组件,以支持应用的启动流 程,同时,等待辅助Dex优化完成后,将辅助Dex中的应用组件再次替换之前的代理组件,当 应用启动所需加载的组件均为实际的应用组件时,再启动这些应用组件,实现应用的正常 启动。相对现有的Dex优化以及组件加载方式,本发明将应用的启动过程分为了组件的加载 与启动两个阶段,在加载阶段,使用代理组件替代未优化完成的辅助Dex中的应用组件,并 等待辅助Dex优化完成后将加载的代理组件再次替换为应用组件,之后利用加载的应用组 件启动应用,避免了在应用启动过程出现未发现待加载的组件而导致的应用启动失败问 题,提高了应用启动的成功率。 上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段, 而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够 更明显易懂,以下特举本发明的