掌桥专利:专业的专利平台
掌桥专利
首页

动态APK的资源加载方法、装置、系统以及介质

文献发布时间:2023-06-19 11:44:10


动态APK的资源加载方法、装置、系统以及介质

技术领域

本发明涉及一种动态APK的资源加载方法、装置、系统以及介质。

背景技术

随着App不断迭代,APP开发则会变得越来越重,随着技术团队的不断壮大,单App的耦合程度越来越重,维护愈发困难,同时传统App的形式不利于快速迭代。因此,提出了动态APK技术,将App作为一个当桌面系统,在这个App里动态加载其他的APK,从而实现APK的快速插拔。因此,就实现了APK的动态加载技术。但是在动态APK技术里,存在一些公共的通用组件,而每个动态APK直接依赖通用机制,这就导致了App整体体积的增加,从而造成不易于推广的问题。在这些通用机制里,对于类的加载,通过给予动态APK间的依赖关系得以解决。

但是,由于每个动态APK是独立存在的,构建工具会将公共组件的资源进行重新排序,导致多个动态APK之间引用公共资源的识别信息id不匹配,使得每个动态APK的公共组件产生的结果是不一致的。因此,资源加载则因为Android编译机制的影响,变得极为不稳定。

发明内容

针对以上问题,本发明提供了动态APK的资源加载方法、装置、系统以及介质,其能够解决多个动态APK引用公共资源的识别信息id不匹配的问题,从而使多个动态APK正常加载资源。

根据本发明的一方面,提供一种动态APK的资源加载方法,包括:

获取步骤:获取用于多个动态APK文件共同加载的公共资源,并将获取的所述公共资源放入至公共资源库中;

处理步骤:通过对所述公共资源库进行处理,将所述公共资源库引用到所述多个动态APK文件,其中,基于所述公共资源库,生成所述公共资源的配置文件;

确定步骤:当对所述多个动态APK文件进行打包时,根据引用了所述公共资源库的所述多个动态APK文件,获取所述公共资源的配置文件,以确定所述公共资源的识别信息;以及

加载步骤:根据确定的所述公共资源的识别信息,将所述公共资源加载到所述多个动态APK。

优选地,所述处理步骤进一步包括:对所述公共资源库进行打包处理,以生成基于所述公共资源库的aar文件,并将生成的所述aar文件引用至所述多个动态APK文件。

优选地,所述处理步骤进一步包括:获取所述公共资源库中的所述公共资源的身份信息,并且将所述身份信息写入所述公共资源的配置文件;并且

所述确定步骤进一步包括:当对所述多个动态APK文件进行打包时,获取所述配置文件中的所述公共资源的身份信息,以确定所述公共资源的识别信息。

优选地,所述确定步骤进一步包括:基于获取的所述配置文件中的所述公共资源的身份信息,生成临时配置文件,并将该临时配置文件放入至所述动态APK文件中的预定目录下,从而将所述身份信息用作为所述公共资源的识别信息,以用于所述公共资源的加载。

优选地,所述加载步骤进一步包括:通过将所述多个动态APK文件的引用所述公共资源的文件的引用信息修改为所述公共资源的识别信息,使所述公共资源加载到所述多个动态APK中。

优选地,所述处理步骤还包括:获取所述公共资源库中的所述公共资源的名称,并且将所述公共资源的名称写入所述公共资源的配置文件;并且

所述加载步骤还包括:根据所述公共资源的名称,将所述多个动态APK文件的引用所述公共资源的文件的引用信息修改为所述公共资源的识别信息。

根据本发明的另一方面,提供一种动态APK的资源加载装置,包括:

获取单元,其获取用于多个动态APK文件共同加载的公共资源,并将获取的所述公共资源放入至公共资源库中;

处理单元,其通过对所述公共资源库进行处理,将所述公共资源库引用到所述多个动态APK文件,其中,基于所述公共资源库,生成所述公共资源的配置文件;

确定单元,其当对所述多个动态APK文件进行打包时,根据引用了所述公共资源库的所述多个动态APK文件,获取所述公共资源的配置文件,以确定所述公共资源的识别信息;以及

加载单元,其根据确定的所述公共资源的识别信息,将所述公共资源加载到所述多个动态APK。

根据本发明的另一方面,提供一种动态APK的资源加载系统,包括:

一个或多个处理器;以及

存储装置,用于存储一个或多个程序,

当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如以上方面所述的动态APK的资源加载方法。

根据本发明的另一方面,提供一种计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现如以上方面所述的动态APK的资源加载方法。

发明的有益效果

根据本发明的动态APK的资源加载方法、装置、系统以及介质,通过改变安卓的常规的资源加载机制,解决插件间加载公共组件间资源id不同而造成的应用程序崩溃的问题,使动态APK正常加载资源,从而使得动态APK技术能够得以广泛使用,并极大地满足业务功能的需求和快速的功能迭代。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本发明的一部分,但其说明仅用于解释本发明,并不构成对本发明的不当限定。

图1示出根据本发明的一优选实施例的动态APK的资源加载方法。

图2示出了本发明实施例的动态APK的资源加载方法中的抽离公共资源的过程。

图3示出了本发明实施例的动态APK的资源加载方法中的生成aar的过程。

图4示出了本发明实施例的动态APK的资源加载方法中的确定资源id的过程。

图5示出了本发明实施例的动态APK的资源加载方法中的修改资源id的引用的过程。

图6示出根据本发明的一优选实施例的动态APK的资源加载装置。

具体实施方式

以下基于实施例对本发明进行描述,但是本发明并不仅仅限于这些实施例。在下文对本发明的细节描述中,详尽描述了一些特定的细节部分。对本领域技术人员来说没有这些细节部分的描述也可以完全理解本发明。为了避免混淆本发明的实质,公知的方法、过程、流程、元件并没有详细叙述。

结合图1-5说明本发明的动态APK的资源加载方法。图1示出根据本发明的一优选实施例的动态APK的资源加载方法。图2示出了本发明实施例的动态APK的资源加载方法中的抽离公共资源的过程。图3示出了本发明实施例的动态APK的资源加载方法中的生成aar的过程。图4示出了本发明实施例的动态APK的资源加载方法中的确定资源id的过程。图5示出了本发明实施例的动态APK的资源加载方法中的修改资源id的引用的过程。

本发明提供了一种动态APK的资源加载方法。如图1所示,本发明的一实施例的动态APK的资源加载方法,包括:获取步骤S101,获取用于多个动态APK文件共同加载的公共资源,并将获取的所述公共资源放入至公共资源库中;处理步骤S102,通过对所述公共资源库进行处理,将所述公共资源库引用到所述多个动态APK文件,其中,基于所述公共资源库,生成所述公共资源的配置文件;确定步骤S103,当对所述多个动态APK文件进行打包时,根据引用了所述公共资源库的所述多个动态APK文件,获取所述公共资源的配置文件,以确定所述公共资源的识别信息;以及加载步骤S104,根据确定的所述公共资源的识别信息,将所述公共资源加载到所述多个动态APK。

优选地,处理步骤S102进一步包括:对所述公共资源库进行打包处理,以生成基于所述公共资源库的aar文件,并将生成的所述aar文件引用至所述多个动态APK文件。

优选地,处理步骤S102进一步包括:获取所述公共资源库中的所述公共资源的身份信息,并且将所述身份信息写入所述公共资源的配置文件;所述确定步骤进一步包括:当对所述多个动态APK文件进行打包时,获取所述配置文件中的所述公共资源的身份信息,以确定所述公共资源的识别信息。

优选地,确定步骤S103进一步包括:基于获取的所述配置文件中的所述公共资源的身份信息,生成临时配置文件,并将该临时配置文件放入至所述动态APK文件中的预定目录下,从而将所述身份信息用作为所述公共资源的识别信息,以用于所述公共资源的加载。

优选地,加载步骤S104进一步包括:通过将所述多个动态APK文件中的引用所述公共资源的文件的引用信息修改为所述公共资源的识别信息,使所述公共资源加载到所述多个动态APK中。

进一步优选地,处理步骤S102还包括:获取所述公共资源库中的所述公共资源的名称,并且将所述公共资源的名称写入所述公共资源的配置文件;加载步骤S104还包括:根据所述公共资源的名称,将所述多个动态APK文件的引用所述公共资源的文件的引用信息修改为所述公共资源的识别信息。

以下将参考图2-5描述根据本发明的动态APK的资源加载方法的一具体实例。该具体实例执行如下步骤1-4:

步骤1,参考图2,对多个动态APK的公共组件中使用的资源进行抽离(剪切)。在多个动态APK之间引用公共组件的情况下,通过对公共组件里引用的资源进行整理,将其全部放入公共资源库baseStyle。公共资源库会分别以aar的形式依赖到每个动态APK中。

步骤2,其次,参考图3,处理baseStyle公共资源库。首先对公共资源库执行打包任务(uploadArchives)。

在打包过程中,当执行到合并资源mergeReleaseResources任务时,遍历baseStyle下的安卓工程目录res(res目录例如存有工程的资源文件)内的所有资源,同时对安卓生成的R.java文件进行解析,其中,在构建工具进行打包构建时,R.java文件会自动生成,其包含例如资源类型、名称、资源id等。

通过上述方式可以获取到资源的id以及名称。生成配置文件public_xml,并将例如资源的id以及名称写入public_xml。随后将生成的public_xml拷贝到存放xml文件的目录下,例如,res/raw/public_xml,直到打包流程完成,最终生成可引用的aar文件。aar文件是包含了一些系列产物的压缩文件。

步骤3,参考图4,动态APK工程引用baseStyle打包后生成的aar,从而完成前置工作。在步骤3中,对动态APK进行打包处理,并在打包动态APK的时,进行固定资源id的流程。

由于对动态APK进行构建,因此会将资源id进行重新排序。而在本实例中,public_xml内不存在的资源id会被进行重新排序,而public_xml内存在的资源id不会被改变,因此,可以直接复用public_xml内的资源id,以进行资源的加载。

具体地,执行动态APK的打包操作(assemble)。在打包过程中,安卓打包流程提供打包资源processReleaseResources的任务,而需要对这个任务进行改造。首先,需要获取baseStyle里的public_xml文件。通过aar引入后,安卓打包流程会通过编译工具aapt2将baseStyle输入的public_xml生成flat文件,并通过查看其二进制数据,获得其固定的编码格式。然后,对public_xml.flat进行解码,以获取public_xml的原始数据,例如资源id。基于获得的获取public_xml的原始数据,重新生成临时的public_xml文件,将生成的临时public_xml放入/拷贝到工程目录下的固定目录,例如为build/intermediates/ymt360_intermediates/aapt2/res/values/public_xml,从而可以直接引用public_xml文件内的资源id。在通过aapt2打包时,在public_xml内的资源id不发生改变,与public_xml资源名称相同的资源,均会被固定为public_xml里的资源id。

步骤4,参考图5,在固定了资源id之后,需要修改引用资源的文件的资源引用id,即,将资源引用id修改为固定的资源id。

引用资源id的文件包括:在安卓打包编译动态APK时生成的_ap文件以及R.java资源文件中的layout布局文件。

_ap文件是资源的合集,即,资源的zip包。该zip包包含resources.ars文件,resources.arsc文件作为资源表,是系统生成的用于存储资源信息的配置文件。resources.arsc文件的格式是固定编码,根据编码格式对文件进行解码。解码后,根据例如资源的名称,改变resources.arsc文件中的资源引用id,例如,修改资源引用id的前4位。再重新根据其编码格式进行编码,并重新生成_ap文件,从而完成resources.arsc文件的资源引用id的替换。

R.java资源文件是动态APK的所有资源文件。R.java资源文件中的layout布局文件包含xml文件,该xml文件通过资源引用id对资源进行引用。xml文件的编码具有固定格式,因此可以对xml文件进行解码。解码后,根据例如资源的名称,将xml文件中的资源引用id修改为固定的资源id,例如,替换资源引用id的前4位。在改变资源的id后,对xml文件重新编码。

通过修改_ap文件和layout文件的资源引用id,完成_ap文件和layout文件对资源的引用,从而实现将资源加载到动态APK。

以下说明根据本发明的一实施例的动态APK的资源加载装置。

图6示出根据本发明的一优选实施例的动态APK的资源加载装置。

如图6所示,动态APK的资源加载装置200,包括:获取单元201,其获取用于多个动态APK文件共同加载的公共资源,并将获取的所述公共资源放入至公共资源库中;处理单元202,其通过对所述公共资源库进行处理,将所述公共资源库引用到所述多个动态APK文件,其中,基于所述公共资源库,生成所述公共资源的配置文件;确定单元203,其当对所述多个动态APK文件进行打包时,根据引用了所述公共资源库的所述多个动态APK文件,获取所述公共资源的配置文件,以确定所述公共资源的识别信息;以及加载单元204,其根据确定的所述公共资源的识别信息,将所述公共资源加载到所述多个动态APK。

优选地,处理单元202对所述公共资源库进行打包处理,以生成基于所述公共资源库的aar文件,并将生成的所述aar文件引用至所述多个动态APK文件。

优选地,处理单元202获取所述公共资源库中的所述公共资源的身份信息,并且将所述身份信息写入所述公共资源的配置文件;所述确定步骤进一步包括:当对所述多个动态APK文件进行打包时,获取所述配置文件中的所述公共资源的身份信息,以确定所述公共资源的识别信息。

优选地,确定单元203基于获取的所述配置文件中的所述公共资源的身份信息,生成临时配置文件,并将该临时配置文件放入至所述动态APK文件中的预定目录下,从而将所述身份信息用作为所述公共资源的识别信息,以用于所述公共资源的加载。

优选地,加载单元204通过将所述多个动态APK文件中的引用所述公共资源的文件的引用信息修改为所述公共资源的识别信息,使所述公共资源加载到所述多个动态APK中。

进一步优选地,处理单元202获取所述公共资源库中的所述公共资源的名称,并且将所述公共资源的名称写入所述公共资源的配置文件。加载单元204根据所述公共资源的名称,将所述多个动态APK文件的引用所述公共资源的文件的引用信息修改为所述公共资源的识别信息。

作为另一方面,本发明还提供了一种动态APK的资源加载系统,包括:一个或多个处理器;以及存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如上述实施例中所描述的动态APK的资源加载方法。

作为又一方面,本发明还提供了一种计算机可读介质,上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被处理器执行时,使得程序执行上述实施例中所描述的动态APK的资源加载方法。

根据本发明的动态APK的资源加载方法、装置、系统以及介质,通过改变安卓的常规的资源加载机制,解决插件间加载公共组件间资源id不同而造成的应用程序崩溃的问题,使动态APK正常加载资源,从而使得动态APK技术能够得以广泛使用,并极大地满足业务功能的需求和快速的功能迭代。

本领域的技术人员容易理解的是,在不冲突的前提下,上述各优选方案可以自由地组合、叠加。以上示例性实施例仅仅是用于阐明本发明的原理,而并非用于限定本发明的保护范围。本领域技术人员在不背离本发明所揭示的精神和原理的范围内,可以对本发明做出各种改进,而不会超出由权利要求书限定的范围。

相关技术
  • 动态APK的资源加载方法、装置、系统以及介质
  • 动态APK的加载方法、装置、系统以及介质
技术分类

06120113034598