CN111813423A - 应用安装包处理方法及装置 - Google Patents

应用安装包处理方法及装置 Download PDF

Info

Publication number
CN111813423A
CN111813423A CN202010892174.9A CN202010892174A CN111813423A CN 111813423 A CN111813423 A CN 111813423A CN 202010892174 A CN202010892174 A CN 202010892174A CN 111813423 A CN111813423 A CN 111813423A
Authority
CN
China
Prior art keywords
application
path
installation package
library
dynamic library
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
Application number
CN202010892174.9A
Other languages
English (en)
Inventor
龚健飞
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN202010892174.9A priority Critical patent/CN111813423A/zh
Publication of CN111813423A publication Critical patent/CN111813423A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/61Installation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic 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)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本申请提供了一种应用安装包处理方法、装置、电子设备及计算机可读存储介质;方法包括:获取应用的安装包;其中,所述安装包是将所述应用的原始安装包中的特定动态库替换为下载链接后得到;其中,所述特定动态库包括在所述应用的启动过程中未被使用的动态库;根据所述安装包进行所述应用的安装操作,并启动所述应用;当所述应用在运行过程中需要调用所述特定动态库时,根据所述下载链接获取所述特定动态库,并加载所述特定动态库。通过本申请,在保证应用正常运行的基础上减小了应用的安装包体积。

Description

应用安装包处理方法及装置
技术领域
本申请涉及计算机技术领域,尤其涉及一种应用安装包处理方法、装置、电子设备及计算机可读存储介质。
背景技术
随着互联网技术的发展,海量的应用被开发了出来。用户可以在终端设备上安装各种各样的应用,来帮助更好地工作和生活。
然而,随着应用功能的不断丰富,其对应的安装包体积也随之急剧增加,例如某些应用的安装包体积动辄上百兆甚至上千兆,导致用户想下载应用的安装包时望而却步,也就是说,应用安装包的体积决定了用户等待下载的时间和可能会耗费的流量,同时,体积庞大的应用安装包也会占据终端设备宝贵的存储空间。
发明内容
本申请实施例提供一种应用安装包处理方法、装置、电子设备及存储介质,在保证应用正常运行的基础上减小了应用的安装包体积。
本申请实施例的技术方案是这样实现的:
本申请实施例提供一种应用安装包处理方法,包括:
获取应用的安装包;
其中,所述安装包是将所述应用的原始安装包中的特定动态库替换为下载链接后得到;
其中,所述特定动态库包括在所述应用的启动过程中未被使用的动态库;
根据所述安装包进行所述应用的安装操作,并启动所述应用;
当所述应用在运行过程中需要调用所述特定动态库时,根据所述下载链接获取所述特定动态库,并加载所述特定动态库。
本申请实施例提供一种应用安装包处理装置,包括:
安装模块,用于获取应用的安装包;
其中,所述安装包是将所述应用的原始安装包中的特定动态库替换为下载链接后得到;
其中,所述特定动态库包括在所述应用的启动过程中未被使用的动态库;
所述安装模块,还用于根据所述安装包进行所述应用的安装操作;
启动模块,用于启动所述应用;
获取模块,用于当所述应用在运行过程中需要调用所述特定动态库时,根据所述下载链接获取所述特定动态库;
加载模块,用于加载所述特定动态库。
上述方案中,所述装置还包括编码模块,用于对所述下载链接进行编码处理,得到对应的路径;以及用于在所述应用的私有目录下创建位于所述路径下的文件夹,将所述特定动态库存储至所述文件夹中;所述装置还包括设置模块,用于将所述路径设置为操作系统动态库的加载路径。
上述方案中,所述设置模块,还用于获取路径类加载对象,并反射获取所述路径类加载对象的路径列表变量;当操作系统的版本低于版本阈值时,从所述路径列表变量中反射获取原生库目录变量;将所述路径添加至所述原生库目录变量中。
上述方案中,所述设置模块,还用于获取类加载对象,并将所述类加载对象转换为路径类加载对象;以及用于将所述原生库目录变量的类型转换为列表,并将所述路径添加至所述列表中。
上述方案中,所述设置模块,还用于当所述操作系统的版本高于版本阈值时,从所述路径列表变量中反射获取原生库路径元素变量;当所述原生库路径元素变量的类型为元素时,构造新元素,并将原始的所述元素包括的内容复制到所述新元素中;生成表示所述路径的元素对象,并将所述元素对象添加至所述新元素的剩余空间中;将添加所述元素对象后的所述新元素添加至所述原生库路径元素变量中。
上述方案中,所述设置模块,还用于当所述原生库路径元素变量的类型为原生库元素时,构造新原生库元素,并将原始的所述原生库元素包括的内容复制到所述新原生库元素中;生成表示所述路径的原生库元素对象,并将所述原生库元素对象添加至所述新原生库元素中;将添加所述原生库元素对象后的所述新原生库元素添加至所述原生库路径元素变量中。
上述方案中,所述加载模块,还用于当操作系统的版本低于版本阈值时,遍历所述原生库目录变量表示的路径,以通过所述路径获取所述特定动态库并进行加载操作;以及用于当操作系统的版本高于版本阈值时,遍历所述原生库路径元素变量表示的路径,以通过所述路径获取所述特定动态库并进行加载操作。
上述方案中,所述获取的安装包为基于所述应用的原始安装包得到的新安装包;所述安装模块,还用于获取所述应用的原始安装包,并确定所述原始安装包中的特定动态库;获取所述特定动态库的下载链接,并从所述原始安装包中将所述特定动态库删除;将所述原始安装包中删除所述特定动态库后剩余的文件、以及所述下载链接进行打包,得到所述新安装包。
上述方案中,所述安装模块,还用于对所述特定动态库进行压缩处理,将经过压缩处理后的所述特定动态库存储至服务器中,以使所述服务器生成对应所述特定动态库的下载链接。
本申请实施例提供一种电子设备,包括:
存储器,用于存储可执行指令;
处理器,用于执行所述存储器中存储的可执行指令时,实现本申请实施例提供的应用安装包处理方法。
本申请实施例提供一种计算机可读存储介质,存储有可执行指令,用于被处理器执行时,实现本申请实施例提供的应用安装包处理方法。
本申请实施例具有以下有益效果:
通过将应用的安装包中的特定动态库分离出来,并将特定动态库替换为对应的下载链接,从而减小了安装包的体积;同时当在运行应用的过程中需要调用特定动态库时,可以根据下载链接去获取特定动态库,并进行加载操作,如此,既减小了安装包的体积又保证了应用的正常运行。
附图说明
图1是本申请实施例提供的应用安装包处理系统的架构示意图;
图2A是本申请实施例提供的终端的结构示意图;
图2B是本申请实施例提供的服务器的结构示意图;
图3是本申请实施例提供的应用安装包处理方法的流程示意图;
图4是本申请实施例提供的应用安装包处理方法的流程示意图;
图5是本申请实施例提供的应用安装包处理方法的流程示意图;
图6是本申请实施例提供的应用安装包处理方法的流程示意图;
图7是本申请实施例提供的应用安装包处理方法的流程示意图。
具体实施方式
为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,所描述的实施例不应视为对本申请的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解, “一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。
对本申请实施例进行进一步详细说明之前,对本申请实施例中涉及的名词和术语进行说明,本申请实施例中涉及的名词和术语适用于如下的解释。
1)安卓应用程序包(APK,Android Application Package),是Android操作系统使用的一种应用程序包文件格式,用于分发和安装移动应用及中间件。一个Android应用程序的代码想要在Android设备上运行,必须先进行编译,然后被打包成为一个被Android系统所能识别的文件才可以被运行,而这种能被Android系统识别并运行的文件格式便是“APK”。
示例的,参见表1,表1是本申请实施例提供的APK文件包含的内容示意表,如表1所示,一个APK文件中通常包含文件资源、代码、注册清单和动态库四个部分。
Figure 127621DEST_PATH_IMAGE001
2)动态库(Share Object),又称动态链接库,其与普通的程序相比而言,没有main函数,是一系列函数的实现。程序在调用库函数时,只需要连接上这个库即可。Android应用在追求性能、代码安全等情况下会使用动态库,动态库文件的后缀名为.so。
3)内容分发网络(CDN,Content Delivery Network),是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
4)反射技术(Reflection),是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为反射获取。
例如在Java语言中,在Java编程时可以通过Java语言的反射技术得到非公开的应用程序编程接口(API,Application Programming Interface)或属性。由于Android 应用是使用Java语言开发的,所以在应用开发时也可以使用。
在实施本申请实施例的过程中发现:应用的安装包,例如Android应用的安装包中通常包含了注册清单、应用资源、应用代码和动态库四个部分,因此,缩减安装包的大小可以从这4个方面考虑。其中,部分动态库(下文称为特定动态库)并不是应用在启动过程中必要的(即在使用到相应功能时才会动态地加载),因此,可以将特定动态库从安装包中分离出来,不参与安装包的打包,这样安装包的大小则可以相应地减小,并且,新安装包(即分离出特定动态库后的安装包)依旧可以被用户下载并运行。同时,可以将分离出来的特定动态库储存到服务器中,并从服务器中得到一个对应的下载链接,并将下载链接也打包到新安装包中。当在应用的运行过程中需要调用分离出的特定动态库时,便可以根据下载链接从服务器中获取特定动态库,并进行加载,如此,既可以减小应用安装包的体积,又能保证应用的正常运行。故可以获取应用的安装包;其中,安装包是将应用的原始安装包中的特定动态库替换为下载链接后得到;其中,特定动态库包括在应用的启动过程中未被使用的动态库;根据安装包进行应用的安装操作,并启动应用;当应用在运行过程中需要调用特定动态库时,根据下载链接获取特定动态库,并加载特定动态库。
鉴于此,本申请实施例提供一种应用安装包处理方法、装置、电子设备和计算机可读存储介质,能够在保证应用可以正常运行的同时,减小了应用安装包的体积,从而提升了用户的下载意愿。
下面说明本申请实施例提供的电子设备的示例性应用,本申请实施例提供的电子设备可以实施为台式电脑、笔记本电脑、智能手机、平板电脑等各种类型的用户终端,也可以实施为服务器或服务器集群,还可以采用由用户终端和服务器协同的方式实施。
下面以服务器和用户终端协同实施本申请实施例提供的应用安装包处理方法为例进行说明一个示例性的系统架构。参见图1,图1是本申请实施例提供的应用安装包处理系统100的架构示意图,其中,应用安装包处理系统100包括:服务器200、网络300和终端400。下面分别进行说明。
服务器200用于获取应用的原始安装包(例如应用开发人员提交的安装包,安装包中包含了完整的动态库),接着对原始安装包进行解包处理,确定出原始安装包中的特定动态库(例如应用的二级界面或者三级界面所包含的功能所需调用的动态库,即不是在应用的启动过程中必须使用的动态库)。随后,服务器200获取特定动态库的下载链接,并从原始安装包中将特定动态库进行删除。最后,服务器200将原始安装包中删除特定动态库后剩余的文件、以及下载链接进行打包,得到新安装包。
网络300,作为服务器200和终端400之间通信的媒介,可以是广域网或者局域网,又或者是二者的组合。
终端400,用于调用安装程序从服务器200中获取应用的新安装包(即服务器200使用下载链接替换原始安装包中的特定动态库后得到的安装包),例如终端400调用安装程序从服务器200中获取应用A的新安装包,并根据所获取的新安装包进行应用A的安装操作。接着,终端400运行安装好的应用A,并当在应用A的运行过程中需要调用特定动态库时,应用A根据下载链接获取特定动态库,并加载特定动态库,从而实现相应的功能。
在另一些实施例中,本申请实施例提供的应用安装包处理方法也可以是由终端单独实施的。例如,对于图1中的终端400,可以调用安装程序获取应用的原始安装包,例如获取应用A的原始安装包。接着,对应用A的原始安装包进行解包处理,并确定出原始安装包中的特定动态库。随后,终端400调用安装程序获取特定动态库的下载链接,并将原始安装包中的特定动态库替换为下载链接,得到新安装包。最后,终端400调用安装程序根据新安装包进行应用A的安装操作。在应用A安装完成后,终端400运行应用A,并在应用A的运行过程中需要调用特定动态库时,使应用A根据下载链接去获取特定动态库,并进行加载操作。
需要说明的是,上述的服务器200可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN、以及大数据和人工智能平台等基础云计算服务的云服务器。终端400可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请实施例在此不做限制。
下面对图1中的终端400的结构进行说明。参见图2A,图2A是本申请实施例提供的终端400的结构示意图,图2A所示的终端400包括:至少一个处理器410、存储器450、至少一个网络接口420和用户接口430。终端400中的各个组件通过总线系统440耦合在一起。可理解,总线系统440用于实现这些组件之间的连接通信。总线系统440除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图2A中将各种总线都标为总线系统440。
处理器410可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(DSP,Digital Signal Processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。
用户接口430包括使得能够呈现媒体内容的一个或多个输出装置431,包括一个或多个扬声器和/或一个或多个视觉显示屏。用户接口430还包括一个或多个输入装置432,包括有助于用户输入的用户接口部件,比如键盘、鼠标、麦克风、触屏显示屏、摄像头、其他输入按钮和控件。
存储器450可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器450可选地包括在物理位置上远离处理器410的一个或多个存储设备。
存储器450包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(ROM,Read Only Memory),易失性存储器可以是随机存取存储器(RAM,Random Access Memory)。本申请实施例描述的存储器450旨在包括任意适合类型的存储器。
在一些实施例中,存储器450能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
操作系统451,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;
网络通信模块452,用于经由一个或多个(有线或无线)网络接口420到达其他确定设备,示例性的网络接口420包括:蓝牙、无线相容性认证(WiFi)、和通用串行总线(USB,Universal Serial Bus)等;
呈现模块453,用于经由一个或多个与用户接口430相关联的输出装置431(例如,显示屏、扬声器等)使得能够呈现信息(例如,用于操作外围设备和显示内容和信息的用户接口);
输入处理模块454,用于对一个或多个来自一个或多个输入装置432之一的一个或多个用户输入或互动进行检测以及翻译所检测的输入或互动。
在一些实施例中,本申请实施例提供的应用安装包处理装置可以采用软件方式实现,图2A示出了存储在存储器450中的应用安装包处理装置455,其可以是程序和插件等形式的软件,包括以下软件模块:安装模块4551、启动模块4552、获取模块4553、加载模块4554、编码模块4555和设置模块4556,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分。将在下文中说明各个模块的功能。
需要说明的是,当终端单独实施本申请实施例提供的应用安装包处理方法时,应用安装包处理装置455中包括的全部模块均被实施;而当终端和服务器协同实施本申请实施例提供的应用安装包处理方法时,在一些实施例中,可以是应用安装包处理装置455中包括的安装模块4551和加载模块4554被实施。
下面针对服务器和终端协同实施本申请实施例提供的应用安装包处理方法时所涉及的服务器200的结构进行说明。参见图2B,图2B本申请实施例提供的服务器200的结构示意图,如图2B所示,服务器200包括:至少一个处理器210、网络接口220、系统总线230和存储器240。其中,存储器240包括:操作系统241、输入处理模块242和应用安装包处理装置243。在一些实施例中,应用安装包处理模块243中可以包括以下软件模块:获取模块2431,用于获取应用的原始安装包;确定模块2432,用于确定应用的原始安装包中的特定动态库;获取模块2431,还用于获取特定动态库的下载链接;删除模块2433,用于从原始安装包中将特定动态库删除;打包模块2434,用于将原始安装包中删除特定动态库后的剩余文件、以及下载链接进行打包,得到新安装包。
下面以服务器和用户终端协同实施本申请实施例为例,对本申请实施例提供的应用安装包处理方法进行具体说明。参见图3,图3是本申请实施例提供的应用安装包处理方法的流程示意图,将结合图3示出的步骤进行说明。
需要指出,下文是以应用运行在安卓操作系统中为例说明的,但是可以理解地,本申请实施例提供的技术方案适用于其他的操作系统,例如Linux、Unix或基于Linux、Unix的各种第三方发行版本。
在步骤S101中,安装程序获取应用的安装包;其中,安装包是将应用的原始安装包中的特定动态库替换为下载链接后得到;其中,特定动态库包括在应用的启动过程中未被使用的动态库。
这里,特定动态库可以是应用的二级界面上或者其他更深层级的界面上提供的功能所需调用的动态库,这些功能对于某些用户来说可能是未必需要使用的,因此,可以将实现这些功能所需调用的动态库确定为特定动态库,并将特定动态库从应用的原始安装包中分离出去,以减小安装包的体积。下载链接可以是由CDN生成的下载链接,或者是由云端服务器生成的下载链接。例如,服务器(例如打包服务器)在将特定动态库从应用的原始安装包中分离出去后,对分离出去的特定动态库进行压缩处理,并将压缩后的特定动态库存储到CDN中,以从CDN中获取对应的下载链接;当然,打包服务器也可以将压缩后的特定动态库发送至云端服务器中,以从云端服务器获取对应的下载链接。
示例的,以应用为社交应用A为例,假设社交应用A提供的功能包括:聊天功能、状态发布功能、购物功能、天气查询功能以及支付功能等;其中,购物功能和天气查询功能并不是所有用户在使用社交应用A的过程中会使用的功能,因此,可以将应用A的原始安装包中对应购物功能和天气查询功能的动态态分离出来,并用对应的下载链接进行替换,以减小应用A的安装包体积。
在另一些实施例中,还可以通过以下方式从应用的原始安装包中确定出特定动态库:针对应用提供的所有功能中的每个功能,确定每个功能在预设时间段内的被使用次数,将被使用次数低于次数阈值的功能对应的动态库确定为特定动态库。
示例的,以应用为社交应用A为例,假设社交应用A提供的功能包括:聊天功能、状态发布功能、购物功能、天气查询功能以及支付功能。其中,购物功能在过去一个月内被使用的次数仅为5次,远低于次数阈值,因此,可以将社交应用A的原始安装包中购物功能对应的动态库确定为特定动态库,并将购物功能对应的动态库从社交应用A的原始安装包中分离出去。
在一些实施例中,安装程序获取应用的安装包可以通过以下方式实现:获取应用的原始安装包,并确定原始安装包中的特定动态库;获取特定动态库的下载链接,并从原始安装包中将特定动态库删除;将原始安装包中删除特定动态库后剩余的文件、以及下载链接进行打包,得到安装包。
示例的,承接上文,仍然以应用为社交应用A为例,安装程序在获取到社交应用A的原始安装包后,确定出社交应用A的原始安装包中的特定动态库,例如购物功能对应的动态库。接着,安装程序将购物功能对应的动态库进行压缩处理,并将压缩后的购物功能对应的动态库发送至服务器中,例如内容分发网络中,以从内容分发网络中获取对应购物的动态库的下载链接。随后,安装程序从社交应用A的原始安装包中将购物功能对应的动态库删除,并将原始安装包中删除购物功能对应的动态库后剩余的文件、以及从内容分发网络中获取的下载链接进行打包,得到社交应用A的新安装包。
在另一些实施例中,上述从应用的原始安装包中分离出特定动态库的步骤也可以是由打包服务器完成的。
示例的,打包服务器获取应用的原始安装包,例如应用开发人员提交的安装包,其中,安装包中包含了完整的动态库。接着,打包服务器确定出应用的原始安装包中的特定动态库,并对特定动态库进行压缩处理,以及将经过压缩处理后的特定动态库存储至内容分发网络中,以从内容分发网络中获取对应的下载链接。随后,打包服务器在应用的原始安装包中将特定动态库删除,并针对原始安装包中删除特定动态库后剩余的文件、以及下载链接进行打包,得到新安装包。当打包服务器接收到终端发送的下载请求时,可以将新安装包发送至对应的终端以直接进行安装。
本申请实施例通过分离出应用的原始安装包中的特定动态库,并用下载链接来替换分离出的特定动态库,如此,可以相应地减小安装包的体积。同时,当后续应用在运行过程中需要调用分离出的特定动态库时,可以根据下载链接获取特定动态库,并进行加载操作,如此,也保证了应用的正常运行。
在步骤S102中,安装程序根据安装包进行应用的安装操作,并启动应用。
在一些实施例中,安装程序根据安装包进行应用的安装操作可以通过以下方式实现:(1)拷贝APK文件到指定的目录:默认情况下,安装程序会将用户安装的APK文件首先拷贝到/data/app下,用户有访问/data/app目录的权限,但对于系统出厂的APK文件则会被放到/system分区下,包括/system/app,/system/vendor/app,以及/system/priv-app等,该分区需要root权限的用户才能访问;(2)解压APK文件、拷贝文件、创建应用的数据目录:对APK安装文件进行解包,得到其他封装的文件,包括文件资源、代码编译后文件、注册清单和分离出特定动态库后剩余的动态库。此外,为了加快应用的启动速度,APK文件在安装的时候,会首先将应用的可执行文件(dex)拷贝到/data/dalvik-cache目录下,缓存起来。再在/data/data/目录下创建应用程序的数据目录(以应用包名命令),用来存放应用的数据库、xml文件、cache、二进制的so动态库等。(3)解析APK文件中的AndroidManifest.xml文件:在安装APK文件的过程中,会解析APK文件中的AndroidManifest.xml文件,将APK的权限、应用包名、APK文件的安装位置、版本、用户账号(userID)等重要信息保存在/data/system/packages.xml文件中。这些操作都是在安装包管理服务(PackageMangerService)中完成的。(4)在桌面添加快捷方式:应用程序经过PackageMangerService中的逻辑处理后,相当于已经注册好了,如果想要在Android桌面上看到应用的图标,则需要Launcher将系统中已经安装的应用程序展现在桌面上。
至此,应用的安装包就安装完成了,此时,用户可以在终端上启动应用。例如,用户可以通过点击桌面上的应用的图标来启动应用。
在步骤S103中,当应用在运行过程中需要调用特定动态库时,应用根据下载链接获取特定动态库。
在一些实施例中,当在步骤S101中获取的下载链接是由内容分发网络生成的(即将分离出的特定动态库存储至内容分发网络中,以使内容分发网络生成对应的下载链接),则在步骤S103中,应用可以根据下载链接向内容分发网络发起下载请求,以从内容分发网络中获取对应的特定动态库。
示例的,承接上文,仍以应用为社交应用A为例,当用户后续在使用社交应用A的过程中需要使用购物功能时,则社交应用A根据下载链接向内容分发网络发起下载请求,以从内容分发网络中获取购物功能对应的动态库,并进行加载操作,从而实现购物功能。
在另一些实施例中,参见图4,应用在执行完步骤S103后,还可以执行步骤S105至步骤S107,将结合图4示出的步骤进行说明。
在步骤S105中,应用对下载链接进行编码处理,得到对应的路径。
在一些实施例中,应用可以使用base64对下载链接进行编码处理,以得到特定动态库的存储路径(path),path指向用于存储特定动态库文件的文件夹,称为path文件夹。由于base64编码的字符集中包含了‘/’字符,而‘/’字符在Android系统中是不允许作为文件或者文件夹的名称。因此,还需要将path中的‘/’字符全部替换成‘_’,从而得到新的path。
在步骤S106中,应用在应用的私有目录下创建位于路径下的文件夹,并将特定动态库存储至文件夹中。
这里,应用的私有目录可以是操作系统中的如下目录:/data/data/包名,也可以是操作系统中的如下目录:/data/user/用户号/包名。应用在私有目录下创建位于路径下的文件夹可以是在/data/data/包名或者在/data/user/用户号/包名下创建path文件夹,例如/data/data/包名/path或者/data/user/用户号/包名/path。
在另一些实施例中,应用在创建位于路径下的文件夹之前,还可以首先检查私有目录下是否存在动态库(dynamic_so_dir)文件夹,如果不存在则进行创建。接着,继续检查dynamic_so_dir文件夹下是否存在path文件夹,如果path文件夹存在,说明此前已经根据下载链接下载了特定动态库,并将下载的特定动态库存放在path文件夹中;如果path文件夹不存在,则说明之前没有根据下载链接进行下载,则此时可以根据下载链接发起下载,下载成功后,会得到步骤S101中分离出去的特定动态库,并将得到的特定动态库存入path文件夹中。
在步骤S107中,应用将路径设置为操作系统动态库的加载路径。
在一些实施例中,参见图5,图4示出的步骤S107可以通过图5示出的步骤S1071至步骤S1077实现,将结合图5示出的步骤进行说明。
在步骤S1071中,应用获取路径类加载对象,并反射获取路径类加载对象的路径列表变量。
应用在运行(即应用的实例在运行,下文仍简称为应用)时内存中会保存一个路径类加载(PathClassLoader)对象,用于当应用需要加载一段代码或者一个动态库时,由这个PathClassLoader对象从相应的代码或者动态库加载路径中寻找文件并进行加载。其中,PathClassLoader对象中包含一个成员变量路径列表(pathlist),类型为DexPathList,用于描述应用可以加载动态库的所有路径。当应用需要加载一个动态库时,会委托pathlist变量来进行查找。
然而,由于PathClassLoader对象是由系统创建的,对应用代码是不可见的,但是可以通过反射技术将其获取出来并进行进一步的反射,以达到将特定动态库的path路径设置为操作系统动态库的加载路径的目的,具体过程如下:首先从APK文件包含的任意代码中获取类加载(ClassLoader)对象,并将其强转成PathClassLoader对象,接着,从PathClassLoader对象中反射获取pathlist变量。
在步骤S1072中,应用判断操作系统的版本是否高于版本阈值,当低于版本阈值时,执行步骤S1073;当高于版本阈值时,执行步骤S1074。
这里,由于不同版本的操作系统的底层实现稍有不同,对于不同版本的操作系统,应用从路径列表变量中反射获取的变量类型也是不同的。因此,应用首先需要确定出终端当前运行的操作系统的版本,随后,针对不同版本的操作系统,应用从路径列表变量中反射获取出不同类型的变量。
在步骤S1073中,应用从路径列表变量中反射获取原生库目录变量,并将路径添加至原生库目录变量中。
在一些实施例中,对于低版本的Android系统,例如小于等于Android 6.0的系统,应用从pathlist变量中反射获取原生库目录(nativeLibraryDirectories)变量,nativeLibraryDirectories变量中记录了所有可以加载动态库的路径,其类型为列表文件(List<File>),并可以针对List<File>进行添加操作。因此,为了将特定动态库所在的path路径也添加到nativeLibraryDirectories变量中,应用首先需要通过反射技术从pathlist变量中获取nativeLibraryDirectories变量,并将其类型转换为List<File>,接着往List<File>中添加path路径,从而实现了将特定动态库的存储路径(path)设置为操作系统动态库的加载路径。
至此,对于低版本的Android(例如小于等于Android 6.0)系统,经过上述步骤后,应用就可以正常加载分离出的特定动态库。
在步骤S1074中,应用从路径列表变量中反射获取原生库路径元素变量。
在一些实施例中,对于低版本的Android系统,应用是从nativeLibraryDirectories变量表示的路径中寻找动态库的;而高版本的Android(例如大于Android 6.0)系统,应用需要从原生库路径元素(nativeLibraryPathElements)变量表示的路径中寻找动态库。因此,对于高版本的Android系统,应用首先需要从pathlist变量中反射获取nativeLibraryPathElements变量。
在步骤S1075中,应用确定原生库路径元素变量的类型,当其类型为元素时,执行步骤S1076;当其类型为原生库元素时,执行步骤S1077。
对于高版本的Android系统,由于不同版本的Android系统,其nativeLibraryPathElements变量对应的类型又不相同,因此,应用在从pathlist变量中反射获取到nativeLibraryPathElements变量后,还需要进一步判断nativeLibraryPathElements变量的类型。
在步骤S1076中,应用构造新元素,并将原始的元素包括的内容复制到新元素中;生成表示路径的元素对象,并将元素对象添加至新元素的剩余空间中;将新元素添加至原生库路径元素变量中。
在一些实施例中,当终端运行的操作系统大于Android 6.0且小于Android 8.0时,nativeLibraryPathElements变量对应的类型为元素(Elements[]),则应用构造新的Elements[],并将原始的Elements[]包括的所有内容(即应用的原始安装包中分离出特定动态库后剩余的动态库对应的加载路径)拷贝至新的Elements[]中;同时,应用生成一个Elements对象,该对象表示的路径为特定动态库的存储路径(path);接着,应用将新的Elements[]中剩余的一个空间设置为表示path的Elements对象,即将特定动态库的存储路径(path)也添加到了新的Elements[]中。随后,应用通过反射技术将nativeLibraryPathElements变量赋值成新的Elements[],如此,便实现了将特定动态库的加载路径(path)设置为操作系统动态库的加载路径。
在步骤S1077中,应用构造新原生库元素,并将原始的原生库元素包括的内容复制到新原生库元素中;生成表示路径的原生库元素对象,并将原生库元素对象添加至新原生库元素的剩余空间中;将新原生库元素添加至原生库路径元素变量中。
在一些实施例中,当终端运行的操作系统大于Android 8.0时,nativeLibraryPathElements变量对应的类型为原生库元素(NativeLibraryElements[]),则应用构造新的NativeLibraryElements[],并将原始的NativeLibraryElements[]包括的所有内容(即应用的原始安装包中分离出特定动态库后剩余的动态库对应的加载路径)拷贝至新的NativeLibraryElements[]中;同时,应用生成一个NativeLibraryElements对象,该对象表示的路径为特定动态库的存储路径(path);应用将新的NativeLibraryElements[]剩余的一个空间设置成表示path的NativeLibraryElements对象,即将特定动态库的存储路径(path)也添加到了新的NativeLibraryElements[]中。接着,应用通过反射技术将nativeLibraryPathElements变量赋值成新的NativeLibraryElements[],如此,便实现了将特定动态库的加载路径(path)设置为操作系统动态库的加载路径。
至此,便完成了不同版本的Android系统的适配,对于不同版本的Android系统,应用都可以正常加载分离出的特定动态库。
继续说明图3,在步骤S104中,应用加载特定动态库。
在一些实施例中,参见图6,图3示出的步骤S104可以通过图6示出的步骤S1041至步骤S1043实现,将结合图6示出的步骤进行说明。
在步骤S1041中,应用判断操作系统的版本,当操作系统的版本低于版本阈值时,执行步骤S1042;当操作系统的版本高于版本阈值时,执行步骤S1043。
在一些实施例中,针对不同版本的Android系统,应用需要从不同类型的变量表示的路径中寻找特定动态库文件,因此,应用在获取特定动态库前,需要首先确定终端当前运行的操作系统的版本。
示例的,对于低版本的Android(例如小于等于Android 6.0)系统,应用直接从nativeLibraryDirectories变量表示的路径中寻找动态库;而对于高版本的Android(例如大于Android 6.0)系统,应用则需要从nativeLibraryPathElements变量表示的路径中寻找动态库。
在步骤S1042中,应用遍历原生库目录变量表示的路径,以获取特定动态库并进行加载操作。
在一些实施例中,当终端当前运行的操作系统小于等于Android 6.0时,应用遍历nativeLibraryDirectories变量表示的路径,以通过上述路径获取到对应的特定动态库,例如,在应用的运行过程中,如果因为需要使用测试功能而需要加载test动态库时,则应用遍历nativeLibraryDirectories变量表示的路径,以获取libtest.so文件,并进行加载操作。
在步骤S1043中,应用遍历原生库路径元素变量表示的路径,以获取特定动态库并进行加载操作。
在一些实施例中,当操作系统的版本大于Android 6.0时,应用遍历nativeLibraryPathElements变量表示的路径,且当操作系统的版本小于Android 8.0时,nativeLibraryPathElements变量对应的类型为Elements[];当终端当前运行的操作系统大于Android 8.0时,nativeLibraryPathElements变量对应的类型为NativeLibraryElement[]。
示例的,假设终端当前运行的操作系统的版本大于Android 6.0,则在应用的运行过程中,如果因为需要使用测试功能而需要加载test动态库时,则会遍历nativeLibraryPathElements变量表示的路径,以获取libtest.so文件,并进行后续的加载操作。
需要说明的是,为节省篇幅,上述实施例仅仅以Android系统为例进行说明,但不表示本申请实施例提供的应用安装包处理方法仅适用于Android系统下的应用,对于其他系统下的应用安装包,例如Linux、Unix或基于Linux、Unix的各种第三方发行版本、ios系统下的应用安装包,也同样可以采用本申请实施例提供的应用安装包处理方法进行处理,分离出安装包中的特定动态库,并用下载链接进行替换,以缩减安装包的大小。
本申请实施例通过将存放下载的特定动态库文件的路径(path)添加到系统动态库的加载路径中,如此,当在应用的运行过程中需要加载一个分离出去的特定动态库时,依然可以通过路径(path)找到对应的动态库文件。同时,针对不同版本的Android系统做了版本的适配,不同的Android系统版本都可以正常加载特定动态库。如此,既可以减小应用安装包的体积,又可以保证应用的正常运行,提升了用户的下载意愿,也节省了终端宝贵的存储空间。
下面继续说明本申请实施例提供的应用安装包处理装置455实施为软件模块的示例性结构,在一些实施例中,如图2A所示,存储在存储器450的应用安装包处理装置455中的软件模块可以包括:安装模块4551、启动模块4552、获取模块4553、加载模块4554、编码模块4555和设置模块4556。
安装模块4551,用于获取应用的安装包;其中,安装包是将应用的原始安装包中的特定动态库替换为下载链接后得到;其中,特定动态库包括在应用的启动过程中未被使用的动态库;安装模块4551,还用于根据安装包进行应用的安装操作;启动模块4552,用于启动应用;获取模块4553,用于当应用在运行过程中需要调用特定动态库时,根据下载链接获取特定动态库;加载模块4554,用于加载特定动态库。
在一些实施例中,应用安装包处理装置455还包括编码模块4555,用于对下载链接进行编码处理,得到对应的路径;以及用于在应用的私有目录下创建位于路径下的文件夹,将特定动态库存储至文件夹中;应用安装包处理装置455还包括设置模块4556,用于将路径设置为操作系统动态库的加载路径。
在一些实施例中,设置模块4556,还用于获取路径类加载对象,并反射获取路径类加载对象的路径列表变量;以及用于当操作系统的版本低于版本阈值时,从路径列表变量中反射获取原生库目录变量;将路径添加至原生库目录变量中
在一些实施例中,设置模块4556,还用于获取类加载对象,并将类加载对象转换为路径类加载对象;以及用于将原生库目录变量的类型转换为列表,并将路径添加至列表中。
在一些实施例中,设置模块4556,还用于当操作系统的版本高于版本阈值时,从路径列表变量中反射获取原生库路径元素变量;当原生库路径元素变量的类型为元素时,构造新元素,并将原始的元素包括的内容复制到新元素中;生成表示路径的元素对象,并将元素对象添加至新元素的剩余空间中;将添加元素对象后的新元素添加至原生库路径元素变量中。
在一些实施例中,设置模块4556,还用于当原生库路径元素变量的类型为原生库元素时,构造新原生库元素,并将原始的原生库元素包括的内容复制到新原生库元素中;生成表示路径的原生库元素对象,并将原生库元素对象添加至新原生库元素中;将添加原生库元素对象后的新原生库元素添加至原生库路径元素变量中。
在一些实施例中,加载模块4554,还用于当操作系统的版本低于版本阈值时,遍历原生库目录变量表示的路径,以通过路径获取特定动态库并进行加载操作;以及用于当操作系统的版本高于版本阈值时,遍历原生库路径元素变量表示的路径,以通过路径获取特定动态库并进行加载操作。
在一些实施例中,获取的安装包为基于应用的原始安装包得到的新安装包,安装模块4551,还用于获取应用的原始安装包,并确定原始安装包中的特定动态库;获取特定动态库的下载链接,并从原始安装包中将特定动态库删除;将原始安装包中删除特定动态库后剩余的文件、以及下载链接进行打包,得到新安装包。
在一些实施例中,安装模块4551,还用于对特定动态库进行压缩处理,将经过压缩处理后的特定动态库存储至服务器中,以使服务器生成对应特定动态库的下载链接。
在另一些实施例中,如图2B所示,存储在存储器240中的应用安装包处理装置243可以包括:获取模块2431、确定模块2432、删除模块2433和打包模块2434。
获取模块2431,用于获取应用的原始安装包,与图2A示出的获取模块4553的功能类似,不再重复说明;确定模块2432,与图2A示出的安装模块4551的功能类似,用于确定应用的原始安装包中的特定动态库;获取模块2431,还用于获取特定动态库的下载链接;删除模块2433,用于从原始安装包中将特定动态库删除;打包模块2434,用于将原始安装包中删除特定动态库后的剩余文件、以及下载链接进行打包,得到新安装包,与图2A示出的安装模块4551的功能类似,不再重复说明。
需要说明的是,本申请实施例装置的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果,因此不做赘述。对于本申请实施例提供的应用安装包处理装置中未尽的技术细节,可以根据图3-6任一附图的说明而理解。
下面,以服务器分离出应用的原始安装包中的特定动态库,并将分离出的特定动态库存储至CDN中为例,对本申请实施例提供的应用安装包处理方法进行说明。
在实施本申请实施例的过程中发现:Android系统的第三方应用(APP,Application)的安装包中通常包含有:文件资源、代码编译后文件、注册清单和动态库。同时,一个安装包的大小影响着用户的安装意愿,安装包的体积越小,用户的安装意愿就越大。因此,需要在保证应用功能正常使用的前提下,尽可能地缩减安装包的大小。
鉴于此,本申请实施例提供的应用安装包处理方法,基于Android系统的特点,将Android应用程序安装包中的特定动态库(即不是在应用启动过程中必须使用的动态库)分离出来,不包含在应用安装包中,从而减少了安装包大小,同时对分离出来的特定动态库进行压缩打包并存放到CDN中。在应用被用户安装并运行后,应用可以通过CDN下载压缩包,并解压到应用本地私有目录下,随后,通过反射机制将特定动态库的存储路径设置为系统动态库的加载路径。如此,当在应用的运行过程中需要调用相应的特定动态库时,能够自动通过上述存储路径获取到对应的特定动态库文件,既减小了应用安装包的大小,又能保证了应用的正常运行。
采用本申请实施例提供的应用安装包处理方法后,在产品体验上并无明显差异,但可以明显地减少应用的安装包大小。例如,以第三方应用为WiFi管家为例,应用本申请实施例提供的应用安装包处理方法后,可以将3个特定动态库从WiFi管家的安装包中分离出来,从而使安装包的大小从29M降低到24M,减少了5M。
下面对本申请实施例提供的应用安装包处理方法进行具体说明,参见图7,图7是本申请实施例提供的应用安装包处理方法的流程示意图,将结合图7示出的步骤进行说明。
在步骤S701中,服务器从应用的原始安装包中分离出特定动态库。
Android应用的安装包中通常包含了注册清单、应用资源、应用代码和动态库,因此,缩减应用安装包的大小可以从这4个方面进行考虑。其中,部分动态库并不是应用启动过程中必要的(例如应用的二级界面或者三级界面上提供的功能所对应的动态库,本文中将这些动态库称为特定动态库),因此,服务器可以将特定动态库从应用的原始安装包中分离出来,不参与安装包的打包,这样安装包的大小则可以相应地减少,同时,新安装包依旧可以被用户下载并正常运行。
示例的,假设某个Android应用的原始安装包中包含10个动态库,服务器确定出其中5个动态库属于特定动态库,即这5个动态库并不是应用在启动过程中必要的动态库,则服务器可以将这5个动态库从应用的原始安装包中分离出来,不参与安装包的打包,以缩减应用安装包的大小。
在步骤S702中,服务器对分离出的特定动态库进行压缩打包并存入CDN中。
服务器在从应用的原始安装包中分离出特定动态库后,对分离出的特定动态库进行压缩并打包成压缩文件,并将得到的压缩文件存入公网的CDN中,随后,可以从CDN中得到一个对应压缩文件的下载链接Url1。
示例的,服务器将从应用的原始安装包中分离出的5个特定动态库进行压缩并打包成zip文件,并将得到的zip文件存储到公网的CDN中,接着,服务器可以从CDN中获取对应该zip文件的下载链接Url1。
在另一些实施例中,服务器也可以将分离出的特定动态库进行压缩打包后存入云端,通过云端下发对应压缩文件的下载链接Url2,让客户端下载由云端下发的下载链接Url2。
在步骤S703中,服务器对应用的原始安装包中分离出特定动态库后剩余的文件、以及对应特定动态库的下载链接进行打包,得到新安装包,并将新安装包发送给对应的终端设备以进行安装。
示例的,承接上文,服务器在从CDN中获取到对应zip文件的下载链接Url1之后,可以将应用的原始安装包中分离出5个特定动态库后的剩余文件和下载链接Url1进行打包,得到新安装包,并将新安装包发送给对应的终端设备(即请求下载应用的终端设备),以使终端设备调用安装程序进行新安装包的安装。
在步骤S704中,应用对下载链接进行编码,得到对应的路径(path)。
终端设备在调用安装程序安装好新安装包后,启动应用。并在应用的运行过程中,应用首先检查应用本地私有目录下是否存在动态库文件夹(dynamic_so_dir),如果不存在,则在进行创建。接着,应用对通过步骤S702得到的下载链接Url1使用base64进行编码,得到特定动态库的存储路径(path),path指向用于存储特定动态库文件的文件夹,称为path文件夹。由于base64编码的字符集中包含了‘/’字符,而‘/’字符在Android系统中是不允许作为文件或者文件夹的名称。所以还需要将path中的‘/’字符全部替换成‘_’,从而得到新的path。
在步骤S705中,应用检查本地私有目录下的path文件夹。
在步骤S706中,应用判断本地私有目录下是否存在path文件夹,若存在,则执行步骤S709,若不存在,则执行步骤S707。
这里,在对Url1使用base64进行编码得到path后,应用会继续检查dynamic_so_dir文件夹下是否存在path文件夹,如果path文件夹存在,则说明此前Url1链接内容已经被下载完成,且下载的文件被存放在path文件夹中;如果path文件夹不存在,则说明此前没有下载过Url1链接内容。
在步骤S707中,应用根据下载链接从CDN中获取特定动态库。
当在应用的运行过程中需要调用特定动态库以实现相应的功能时,可以根据在步骤S702中得到的下载链接Url1,向CDN发起下载请求,以从CDN中获取特定动态库。
在步骤S708中,应用对获取的压缩文件进行解压并复制到path文件夹中。
示例的,承接上文,在下载完成后,会得到在步骤S702中的zip文件,此时,将下载得到的zip文件进行解压,并将解压得到的所有文件存入path文件夹中,即分离出的特定动态库的存储路径为path文件夹所在路径。
在步骤S709中,应用获取PathClassLoader对象。
在步骤S710中,应用通过反射机制获取PathClassLoader对象的pathlist变量。
应用在运行时会在内存中保存一个PathClassLoader对象,用于当应用需要加载一段代码或者一个动态库时,由这个PathClassLoader对象从相应的代码或者动态库加载路径中寻找文件并进行加载。其中,PathClassLoader对象中包含一个成员变量pathlist,其类型为DexPathList,用于描述应用可以加载动态库的所有路径。当应用需要加载一个动态库时,则会委托pathlist变量来进行查找。
然而,由于PathClassLoader对象是由系统创建的,对应用代码是不可见的,但是可以通过反射机制将其获取出来,具体过程如下:
(a)从APK包含的任意代码中,获取ClassLoader对象,并将ClassLoader对象强转成PathClassLoader对象。
(b)从PathClassLoader对象中反射出pathlist变量。
在步骤S711中,应用通过反射机制从pathlist变量中获取nativeLibraryDirectories变量。
在步骤S712中,应用将path文件夹所在的路径添加到nativeLibraryDirectories变量中。
pathlist变量的类型为DexPathList,其描述了应用能够从哪些路径中加载代码或者动态库。其中,它的成员变量nativeLibraryDirectories记录了所有可以加载动态库的路径,类型为List<File>,并且可以对其进行添加操作。因此,为了将在步骤S708得到的path文件夹所在的路径也添加到nativeLibraryDirectories变量中,首先需要从pathlist变量中反射出nativeLibraryDirectories变量,并将其类型转换为List<File>,最后,往List<File>列表中添加path文件夹所在的路径。
低版本(例如小于等于Android 6.0)的Android系统在经过上述步骤S701至步骤S712之后,就可以正常加载从CDN下载的特定动态库了。但是,对于高版本(例如大于Android 6.0)的Android系统,由于其底层实现与低版本的Android系统稍有不同,因此,需要将步骤S710至步骤S712替换为步骤S713至步骤S718,以进行适配。
在步骤S713中,应用通过反射机制从pathList变量中获取nativeLibraryPathElements变量。
低版本的Android系统直接从nativeLibraryDirectories变量表示的路径中寻找动态库;而对于高版本的Android系统则会从nativeLibraryPathElements变量表示的路径中寻找动态库,因此,对于高版本的Android系统,应用需要从pathList变量中反射获取nativeLibraryPathElements变量。
在步骤S714中,应用判断是否获取成功,若获取成功,则执行步骤S715;若获取失败,则执行步骤S719。
在步骤S715中,应用判断nativeLibraryPathElements变量的类型,当其类型为Elements[]时,执行步骤S716;当其类型为NativeLibraryElement[]时,执行步骤S717。
在步骤S716中,应用构造新的Elements[],并将原Elements[]所有内容拷贝至新的Elements[],接着,应用生成一个Elements对象,对象表示的路径为path。
在步骤S717中,应用构造新的NativeLibraryElement[],并将原NativeLibraryElement[]所有内容拷贝至新的NativeLibraryElement[];接着,应用生成一个NativeLibraryElemen对象,对象表示的路径为path。
在步骤S718中,应用将新的对象添加至nativeLibraryPathElements变量中。
对于类型为Elements[],应用将新Elements[]剩余的一个空间设置成表示path的Elements对象,并通过反射机制将nativeLibraryPathElements赋值成新的Elements[]。
对于类型为NativeLibraryElement[],应用将新NativeLibraryElement[]剩余的一个空间设置成表示path的NativeLibraryElemen对象,并通过反射机制将nativeLibraryPathElements赋值成新的NativeLibraryElement[]。
在步骤S719中,应用继续运行。
经过上述步骤S701至步骤S718之后,存放从CDN下载的特定动态库的path文件夹的路径都被添加到系统动态库加载路径上了,当应用需要加载一个被分离出去的特定动态库时,依然可以通过上述特定动态库的存储路径(path)找到对应的动态库文件。同时,因为做了系统版本的适配,不同的Android系统版本都可以正常加载动态库。例如,当应用需要加载测试(test)动态库时,则会从以下行为中查找libtest.so文件:
(a)当终端设备当前运行的Android系统小于等于Android 6.0时,遍历nativeLibraryDirectories变量表示的路径;
(b)当终端设备当前运行的Android系统大于Android 6.0时,遍历nativeLibraryPathElements变量表示的路径;且当Android系统的版本小于Android 8.0时,nativeLibraryPathElements变量的类型为Elements[];当Android系统的版本大于等于Android 8.0时,nativeLibraryPathElements变量的类型为NativeLibraryElement[]。
本申请实施例提供的应用安装包处理方法,在保证应用的功能可以正常运行的同时,减少了应用安装包的体积,从而节约了终端设备宝贵的存储空间,同时也提升了用户的下载意愿。
本申请实施例提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行本申请实施例上述的应用安装包处理方法。
本申请实施例提供一种存储有可执行指令的计算机可读存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本申请实施例提供的方法,例如,如图3-7示出的应用安装包处理方法。
在一些实施例中,存储介质可以是FRAM、ROM、PROM、EPROM、EEPROM、闪存、磁表面存储器、光盘、或CD-ROM等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在确定环境中使用的其它单元。
作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以被存储在保存其它程序或数据的文件的一部分,例如,存储在超日志标记语言(HTML,Hyper TextMarkup Language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。
作为示例,可执行指令可被部署为在一个计算设备上执行,或者在位于一个地点的多个计算设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个计算设备上执行。
综上所述,通过本申请实施例具有以下有益效果:
通过将安装包中的特定动态库分离出来,不参与安装包的打包,减小了安装包大小,同时,对分离出来的特定动态库进行压缩打包并存放到内容分发网络中,在应用运行过程中需要调用特定动态库时,通过内容分发网络下载压缩所并解压到应用本地私有目录下,接着,利用反射技术将该路径设置为操作系统动态库的加载路径,如此,当应用运行过程中需要相应动态库时能够自动从该路径中获取到动态库,这既减少了应用的安装包大小,又保证了应用能够正常运行。
以上所述,仅为本申请的实施例而已,并非用于限定本申请的保护范围。凡在本申请的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本申请的保护范围之内。

Claims (10)

1.一种应用安装包处理方法,其特征在于,所述方法包括:
获取应用的安装包;
其中,所述安装包是将所述应用的原始安装包中的特定动态库替换为下载链接后得到;
其中,所述特定动态库包括在所述应用的启动过程中未被使用的动态库;
根据所述安装包进行所述应用的安装操作,并启动所述应用;
当所述应用在运行过程中需要调用所述特定动态库时,根据所述下载链接获取所述特定动态库,并加载所述特定动态库。
2.根据权利要求1所述的方法,其特征在于,在根据所述下载链接获取所述特定动态库之后,所述方法还包括:
对所述下载链接进行编码处理,得到对应的路径;
在所述应用的私有目录下创建位于所述路径下的文件夹,将所述特定动态库存储至所述文件夹中;
将所述路径设置为操作系统动态库的加载路径。
3.根据权利要求2所述的方法,其特征在于,所述将所述路径设置为操作系统动态库的加载路径,包括:
获取路径类加载对象,并反射获取所述路径类加载对象的路径列表变量;
当操作系统的版本低于版本阈值时,从所述路径列表变量中反射获取原生库目录变量;
将所述路径添加至所述原生库目录变量中。
4.根据权利要求3所述的方法,其特征在于,
所述获取路径类加载对象,包括:
获取类加载对象,并将所述类加载对象转换为路径类加载对象;
所述将所述路径添加至所述原生库目录变量中,包括:
将所述原生库目录变量的类型转换为列表,并将所述路径添加至所述列表中。
5.根据权利要求3所述的方法,其特征在于,所述方法还包括:
当所述操作系统的版本高于版本阈值时,从所述路径列表变量中反射获取原生库路径元素变量;
当所述原生库路径元素变量的类型为元素时,构造新元素,并将原始的所述元素包括的内容复制到所述新元素中;
生成表示所述路径的元素对象,并将所述元素对象添加至所述新元素的剩余空间中;
将添加所述元素对象后的所述新元素添加至所述原生库路径元素变量中。
6.根据权利要求5所述的方法,其特征在于,所述方法还包括:
当所述原生库路径元素变量的类型为原生库元素时,构造新原生库元素,并将原始的所述原生库元素包括的内容复制到所述新原生库元素中;
生成表示所述路径的原生库元素对象,并将所述原生库元素对象添加至所述新原生库元素中;
将添加所述原生库元素对象后的所述新原生库元素添加至所述原生库路径元素变量中。
7.根据权利要求3-6任一项所述的方法,其特征在于,所述加载所述特定动态库,包括:
当操作系统的版本低于版本阈值时,遍历所述原生库目录变量表示的路径,以通过所述路径获取所述特定动态库并进行加载操作;
当操作系统的版本高于版本阈值时,遍历所述原生库路径元素变量表示的路径,以通过所述路径获取所述特定动态库并进行加载操作。
8.根据权利要求1所述的方法,其特征在于,
所述获取的安装包为基于所述应用的原始安装包得到的新安装包;
所述获取应用的安装包,包括:
获取所述应用的原始安装包,并确定所述原始安装包中的特定动态库;
获取所述特定动态库的下载链接,并从所述原始安装包中将所述特定动态库删除;
将所述原始安装包中删除所述特定动态库后剩余的文件、以及所述下载链接进行打包,得到所述新安装包。
9.根据权利要求8所述的方法,其特征在于,所述获取所述特定动态库的下载链接,包括:
对所述特定动态库进行压缩处理,将经过压缩处理后的所述特定动态库存储至服务器中,以使
所述服务器生成对应所述特定动态库的下载链接。
10.一种应用安装包处理装置,其特征在于,所述装置包括:
安装模块,用于获取应用的安装包;
其中,所述安装包是将所述应用的原始安装包中的特定动态库替换为下载链接后得到;
其中,所述特定动态库包括在所述应用的启动过程中未被使用的动态库;
所述安装模块,还用于根据所述安装包进行所述应用的安装操作;
启动模块,用于启动所述应用;
获取模块,用于当所述应用在运行过程中需要调用所述特定动态库时,根据所述下载链接获取所述特定动态库;
加载模块,用于加载所述特定动态库。
CN202010892174.9A 2020-08-31 2020-08-31 应用安装包处理方法及装置 Pending CN111813423A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010892174.9A CN111813423A (zh) 2020-08-31 2020-08-31 应用安装包处理方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010892174.9A CN111813423A (zh) 2020-08-31 2020-08-31 应用安装包处理方法及装置

Publications (1)

Publication Number Publication Date
CN111813423A true CN111813423A (zh) 2020-10-23

Family

ID=72859265

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010892174.9A Pending CN111813423A (zh) 2020-08-31 2020-08-31 应用安装包处理方法及装置

Country Status (1)

Country Link
CN (1) CN111813423A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112363734A (zh) * 2020-11-03 2021-02-12 北京麟卓信息科技有限公司 一种Android应用安装时采用本地库的方法和装置
WO2022100208A1 (zh) * 2020-11-13 2022-05-19 华为技术有限公司 动态库加载方法、核部署的调整方法及相关装置

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7555561B2 (en) * 2001-03-19 2009-06-30 The Aerospace Corporation Cooperative adaptive web caching routing and forwarding web content data broadcasting method
CN105867973A (zh) * 2016-03-30 2016-08-17 乐视控股(北京)有限公司 应用程序中so文件的加载方法及系统
CN106325847A (zh) * 2015-07-02 2017-01-11 杭州海康机器人技术有限公司 基于iOS平台获取应用程序功能的方法和装置
CN106383732A (zh) * 2016-09-23 2017-02-08 北京奇虎科技有限公司 在插件中关联Native库的方法及装置
CN107145365A (zh) * 2017-04-06 2017-09-08 北京奇虎科技有限公司 生成应用程序安装包的方法、加载应用程序的方法及装置
CN109831476A (zh) * 2018-12-15 2019-05-31 中国平安人寿保险股份有限公司 安装包下载方法、装置、电子设备及存储介质
CN109840091A (zh) * 2018-12-12 2019-06-04 珠海西山居互动娱乐科技有限公司 一种基于Unity手游的资源动态替换出包的方法及其装置

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7555561B2 (en) * 2001-03-19 2009-06-30 The Aerospace Corporation Cooperative adaptive web caching routing and forwarding web content data broadcasting method
CN106325847A (zh) * 2015-07-02 2017-01-11 杭州海康机器人技术有限公司 基于iOS平台获取应用程序功能的方法和装置
CN105867973A (zh) * 2016-03-30 2016-08-17 乐视控股(北京)有限公司 应用程序中so文件的加载方法及系统
CN106383732A (zh) * 2016-09-23 2017-02-08 北京奇虎科技有限公司 在插件中关联Native库的方法及装置
CN107145365A (zh) * 2017-04-06 2017-09-08 北京奇虎科技有限公司 生成应用程序安装包的方法、加载应用程序的方法及装置
CN109840091A (zh) * 2018-12-12 2019-06-04 珠海西山居互动娱乐科技有限公司 一种基于Unity手游的资源动态替换出包的方法及其装置
CN109831476A (zh) * 2018-12-15 2019-05-31 中国平安人寿保险股份有限公司 安装包下载方法、装置、电子设备及存储介质

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
刘剑卓: "《Android手机游戏开发从入门到精通》", 31 May 2012, 中国铁道出版社 *
张鑫: "Android热更新管理系统的研究与设计", 《ANDROID热更新管理系统的研究与设计》 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112363734A (zh) * 2020-11-03 2021-02-12 北京麟卓信息科技有限公司 一种Android应用安装时采用本地库的方法和装置
WO2022100208A1 (zh) * 2020-11-13 2022-05-19 华为技术有限公司 动态库加载方法、核部署的调整方法及相关装置

Similar Documents

Publication Publication Date Title
US11032140B2 (en) Using a template to update a stack of resources
US20230289176A1 (en) Integration of containers with external elements
US10949237B2 (en) Operating system customization in an on-demand network code execution system
US9332063B2 (en) Versatile application configuration for deployable computing environments
US10521447B2 (en) Container application execution using image metadata
US20210133002A1 (en) Using scripts to bootstrap applications with metadata from a template
US11106477B2 (en) Execution of owner-specified code during input/output path to object storage service
US11055112B2 (en) Inserting executions of owner-specified code into input/output path of object storage service
EP4035007A1 (en) Inserting owner-specified data processing pipelines into input/output path of object storage service
CN111813423A (zh) 应用安装包处理方法及装置
US20200334317A1 (en) Methods and systems for caching and searching for search results
WO2023093197A1 (zh) 一种应用管理方法及相关系统
US11882154B2 (en) Template representation of security resources
CN115509582A (zh) 应用程序发布方法、装置、设备及存储介质
CN112115056B (zh) 一种项目部署方法和装置、服务器、存储介质
CN112988062B (zh) 一种元数据读取限制方法、装置、电子设备及介质
CN113485722A (zh) 应用商店的应用程序的上架方法、处理方法及计算机设备
CN113110851A (zh) 资源的加载方法、装置、电子设备和介质
CN115344273B (zh) 一种基于货架系统来运行应用软件的方法及系统
WO2023193433A1 (zh) 一种服务启动方法及相关装置
WO2022241947A1 (zh) 一种对应用程序的数据处理方法、装置、设备及存储介质
CN114860203A (zh) 项目创建方法、装置、服务器及存储介质
CN113741952A (zh) 一种软件包管理方法、装置、设备及介质
CN110795113A (zh) 一种Redis集群服务的安装方法、服务器和介质
US11017032B1 (en) Document recovery utilizing serialized data

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
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 40030773

Country of ref document: HK

RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20201023