CN111949301B - 应用程序热更新方法、装置和计算机可读存储介质 - Google Patents

应用程序热更新方法、装置和计算机可读存储介质 Download PDF

Info

Publication number
CN111949301B
CN111949301B CN201910398867.XA CN201910398867A CN111949301B CN 111949301 B CN111949301 B CN 111949301B CN 201910398867 A CN201910398867 A CN 201910398867A CN 111949301 B CN111949301 B CN 111949301B
Authority
CN
China
Prior art keywords
component
registered
updated
middleware
public
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.)
Active
Application number
CN201910398867.XA
Other languages
English (en)
Other versions
CN111949301A (zh
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 CN201910398867.XA priority Critical patent/CN111949301B/zh
Publication of CN111949301A publication Critical patent/CN111949301A/zh
Application granted granted Critical
Publication of CN111949301B publication Critical patent/CN111949301B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • G06F8/656Updates while running

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本申请涉及一种应用程序热更新方法、装置、计算机可读存储介质和计算机设备,该方法包括:获取应用程序的已注册组件,当***调用已注册组件时,根据已注册组件通过代理调用到应用程序的待热更新组件,代理并非***组件的子类。当***调用待热更新组件时,待热更新组件通过代理调用到***组件中的公开方法,通过***组件中的公开方法对待热更新组件进行热更新。本方法通过设置代理使得***可以间接访问待热更新组件,且待热更新组件通过代理可以间接调用***组件中的公开方法,从而就可以通过***组件中的公开方法对待热更新组件进行热更新。

Description

应用程序热更新方法、装置和计算机可读存储介质
技术领域
本申请涉及计算机技术领域,特别是涉及一种应用程序热更新方法、装置、计算机可读存储介质和计算机设备。
背景技术
随着安卓(Android)平台移动端业务复杂性程度的增加,传统的通过在软件商店发布版本更新的应用更新方案已经不能满足业务及开发者的需求。
为了解决上述问题,相关技术中出现了热更新技术,即一种快速、低成本修复应用程序(Application,简称App)版本缺陷的方式,其不依赖于应用程序的版本更新来对应用程序的漏洞进行修复。相比于升级应用程序的版本,热更新的主要优势是不会使应用程序当前正在运行的业务中断,即可以在不重新发布迭代版本的基础上来对当前的应用程序版本的缺陷进行修复。然而,传统的热更新方法已经不能满足Android 9.0***新增的要求。
发明内容
基于此,有必要针对传统的应用程序热更新方法不能够满足Android 9.0***新增要求的技术问题,提供一种应用程序热更新方法、装置、计算机可读存储介质和计算机设备。
一种应用程序热更新方法,包括:
获取应用程序的已注册组件;
当***调用所述已注册组件时,根据所述已注册组件通过代理调用到所述应用程序的待热更新组件,所述代理并非***组件的子类;
当***调用所述待热更新组件时,所述待热更新组件通过所述代理调用到所述***组件中的公开方法;
通过所述***组件中的公开方法对所述待热更新组件进行热更新。
一种应用程序热更新装置,所述装置包括:
已注册组件获取模块,用于获取应用程序的已注册组件;
待热更新组件调用模块,用于当***调用所述已注册组件时,根据所述已注册组件通过代理调用到所述应用程序的待热更新组件,所述代理并非***组件的子类;
***组件中的公开方法调用模块,用于当***调用所述待热更新组件时,所述待热更新组件通过所述代理调用到所述***组件中的公开方法;
热更新模块,用于通过所述***组件中的公开方法对所述待热更新组件进行热更新。
一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如上所述方法的步骤。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如上所述方法的步骤。
上述应用程序热更新方法、装置、计算机可读存储介质和计算机设备,获取应用程序的已注册组件,当***调用已注册组件时,根据已注册组件通过代理调用到应用程序的待热更新组件,代理并非***组件的子类。当***调用待热更新组件时,待热更新组件通过代理调用到***组件中的公开方法,通过***组件中的公开方法对待热更新组件进行热更新。传统方法中因为待热更新组件未在***中注册,所以***不能直接调用待热更新组件,且待热更新组件也不能直接调用到***组件中的公开方法。本方法通过设置代理,当***调用已注册组件时,根据已注册组件通过代理间接调用到应用程序的待热更新组件。且代理并非***组件的子类就隔离了待热更新组件和***组件之间的直接访问。进而当***调用已注册组件时,根据已注册组件通过代理间接调用到应用程序的待热更新组件。当***调用待热更新组件时,待热更新组件通过代理间接调用到***组件中的公开方法,从而,就可以通过***组件中的公开方法对待热更新组件进行热更新。
附图说明
图1为一个实施例中应用程序热更新方法的应用环境图;
图2为一个实施例中应用程序热更新方法的流程示意图;
图3为一个实施例中***Activity、FooActivity、Middleware及BarActivity之间的继承或持有关系示意图;
图4为图2中当***调用已注册组件时,根据已注册组件通过代理调用到应用程序的待热更新组件的流程示意图;
图5为图2中当***调用待热更新组件时,待热更新组件通过代理调用到***组件中的公开方法的流程示意图;
图6为一个具体的实施例中应用程序热更新方法的程序注释图;
图7为一个实施例中应用程序热更新装置的结构框图;
图8为另一个实施例中应用程序热更新装置的结构框图;
图9为图7中***组件中的公开方法调用模块的结构框图;
图10为一个实施例中计算机设备的结构框图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
图1为一个实施例中应用程序热更新方法的应用环境图。参照图1,该应用程序热更新方法应用于应用程序热更新***。该应用程序热更新***包括终端110和服务器120。终端110和服务器120通过网络连接。终端110具体可以是台式终端或移动终端,移动终端具体可以是手机、平板电脑、笔记本电脑等中的至少一种。服务器120可以用独立的服务器或者是多个服务器组成的服务器集群来实现。该应用程序热更新方法包括:获取应用程序的已注册组件,当***调用已注册组件时,根据已注册组件通过代理调用到应用程序的待热更新组件,代理并非***组件的子类。当***调用待热更新组件时,待热更新组件通过代理调用到***组件中的公开方法,通过***组件中的公开方法对待热更新组件进行热更新。
本申请实施例中的应用程序热更新方法,可以用于终端上的安卓***、IOS(iPhone Operating System)***或其他操作***。当然,也可以用于PC(personalcomputer,个人计算机)上的其他操作***。只要是操作***限制了私有API的访问,都可以适用。
传统方法,在安卓***中对应用程序进行热更新时,对于Android平台来说,动态加载Java代码和Native so都不存在技术困难,***本身提供了接口支持。但是对于Android定义的组件Activity(安卓***的四大组件之一)来说,仅仅加载代码是不够的。Android***要求Activity必须通过安装应用时的Android Manifest注册到***中。因此在Android平台上热更新Activity存在技术困难。针对热更新Activity,目前主要有以下两大方案:
(1)基于类加载器ClassLoader的方案。
a)已注册组件(例如FooActivity)是注册在宿主Manifest中的Activity,待热更新组件(例如BarActivity)没有在宿主Manifest中注册,且二者都是***组件(***Activity)的子类。此处的FooActivity和BarActivity只是一个名称指代,当然,也可以对已注册组件命名为其他名称。对待热更新组件命名为其他名称。例如,当已注册组件为Service(安卓***的四大组件之一)时,可以对已注册组件命名为AService,对待热更新组件命名为BService。
b)***收到Intent希望启动FooActivity。
c)***去宿主的Manifest中查找FooActivity的注册信息,如找不到则报错。
d)当***去宿主的Manifest中查找到FooActivity的注册信息后,***调用宿主的ClassLoader加载FooActivity类。
e)被以Hack方式修改了行为的宿主的ClassLoader在收到需要加载FooActivity的请求时,会加载BarActivity当作FooActivity。(Hack是基于开源的程序的基础,对其代码进行增加、删除或者修改、优化,使之在功能上符合新的需求,是一种黑客技术。)
f)***会误以为BarActivity就是FooActivity而正常启动BarActivity。
在基于类加载器ClassLoader的方案中,使用Hack方式时会涉及到反射技术调用及修改***的私有API(Application Programming Interface,应用程序编程接口)。且在***会误以为BarActivity就是FooActivity而正常启动时,也需要修改***的私有API。而新发布的Android 9.0版本,要求不使用任何Android SDK(software development kit,软件开发工具包)的非公开方法,即开始限制私有API的调用,部分私有API的调用甚至会造成Crash,其余私有API的调用也会在未来版本中失效。因为基于类加载器ClassLoader的方案是基于调用***私有API实现的,所以基于类加载器ClassLoader的方案将在Android 9.0版本及之后的版本中失效。
且访问***私有API还有一个弊端:***的私有API在不同的OEM***或不同版本的Android***上实现可能不一致,甚至接口发生变化。所以,访问***私有API会导致调用失败或调用结果不符合预期,造成方案失效。其中,OEM英文全称Original EquipmentManufacturer,翻译为原始设备制造商,可以理解为贴牌生产。
(2)基于FooActivity代理的方案。
a)同样FooActivity是注册在宿主Manifest中的Activity,BarActivity没有在宿主Manifest中注册,且二者都是***Activity的子类。
b)***启动FooActivity后,FooActivity在onCreate生命周期阶段加载并持有BarActivity,然后通过Hack方式初始化BarActivity。
c)当***调用FooActivity的某方法时,FooActivity就转调BarActivity的相应方法。
在基于FooActivity代理的方案中,使用Hack方式时会涉及到反射技术调用及修改***的私有API。同理,基于FooActivity代理的方案也将在Android 9.0版本及之后的版本中失效。
如图2所示,在一个实施例中,提供了一种应用程序热更新方法。本实施例主要以该方法应用于上述图1中的终端110来举例说明。参照图2,该应用程序热更新方法具体包括如下步骤:
S202,获取应用程序的已注册组件。
应用程序的已注册组件FooActivity,指的是该应用程序中已经在宿主Manifest中注册的组件,应用程序的已注册组件是可以正常运行的。获取该应用程序的已注册组件。
S204,当***调用已注册组件时,根据已注册组件通过代理调用到应用程序的待热更新组件,代理并非***组件的子类。
该应用程序的待热更新组件BarActivity没有在宿主Manifest中注册,所以***不能直接调用该待热更新组件BarActivity,且该待热更新组件BarActivity也不能直接调用到***组件中的公开方法。为已注册组件FooActivity设置代理,此处的代理为中间件Middleware,该中间件Middleware不是***组件的子类也不再引用***,只是一个普通类。通过Middleware隔离***和BarActivity的直接访问,达到无需Hack***也不通过任何***非公开方法而运行BarActivity的目的。
在获取应用程序的已注册组件FooActivity之后,当***调用已注册组件FooActivity时,根据已注册组件FooActivity通过代理Middleware调用到应用程序的待热更新组件BarActivity。从而,实现了***可以调用到未在***中注册的待热更新组件BarActivity。
S206,当***调用待热更新组件时,待热更新组件通过代理调用到***组件中的公开方法。
当***调用待热更新组件时,而待热更新组件能够正常运行是需要调用到***组件中的公开方法才能够实现的。所以,此时待热更新组件通过代理调用到***组件中的公开方法。具体的,当***调用待热更新组件时,通过待热更新组件中的相应预设方法调用中间件中的同名方法;当调用中间件中的同名方法时,通过中间件中的相应预设方法调用已注册组件中的同名方法;当调用已注册组件中的同名方法时,通过已注册组件中的相应预设方法调用到***组件中的公开方法。
S208,通过***组件中的公开方法对待热更新组件进行热更新。
在调用到***组件中的公开方法之后,通过***组件中的公开方法对待热更新组件进行热更新。
本申请实施例中,传统方法中因为待热更新组件未在***中注册,所以***不能直接调用待热更新组件,且待热更新组件也不能直接调用到***组件中的公开方法。本方法通过设置代理,当***调用已注册组件时,根据已注册组件通过代理间接调用到应用程序的待热更新组件。且代理并非***组件的子类就隔离了待热更新组件和***组件之间的直接访问。进而当***调用已注册组件时,根据已注册组件通过代理间接调用到应用程序的待热更新组件。当***调用待热更新组件时,待热更新组件通过代理间接调用到***组件中的公开方法,从而,就可以通过***组件中的公开方法对待热更新组件进行热更新。
在一个实施例中,提供了一种应用程序热更新方法还包括:代理为中间件;
将待热更新组件的父类修改为中间件,中间件包括***组件中的公开方法名称及设置已注册组件的方法;
通过已注册组件动态加载待热更新组件,使得中间件与已注册组件相互持有;
通过已注册组件覆盖***组件中的公开方法,对待热更新组件、已注册组件及中间件中被覆盖的***同名方法增加调用父类的相应预设方法,***同名方法为与中间件中所包括的***组件中的公开方法名称同名的方法。
第一步,将待热更新组件的父类修改为中间件,中间件包括***组件中的公开方法名称及设置已注册组件的方法。具体的,在前期开发调试时,开发人员是按照待热更新组件的父类为***组件来进行开发调试,所以待热更新组件中包括原本属于***Activity的方法。因为待热更新组件未在***中注册,所以传统方法中若***需要调用待热更新组件,则就必须通过***的私有API实现。而本申请实施例是对前期开发调试的代码,通过修改字节码将待热更新组件的父类修改为中间件,则待热更新组件就可以对中间件中的方法进行继承(引用),而不需要继承***组件中的方法。
首先,预先对该中间件进行了定义,定义中间件不是***Activity的子类,只是一个普通类。但是该中间件具有和***Activity相同的公开方法签名。具体定义过程如下所示:
例如***Activity中所具有的方法的名称为:
public void a();
void b();
protected void c();
private void d();
则Middleware中复制这些方法的名称:
public void a();
void b();
protected void c();
由于private void d()是私有方法对应的名称,所以Middleware中无需复制。Middleware中只需要复制可以被BarActivity访问的方法的名称,即***Activity中的公开方法的名称。因为BarActivity无法访问***Activity中的非公开方法,所以便不需要复制***Activity中的非公开方法的名称。
其次,定义中间件中包括设置已注册组件的方法。具体定义的过程如下所示:
第二步,通过已注册组件动态加载待热更新组件,使得中间件与已注册组件相互持有。具体的,通过已注册组件在实现onCreate方法时动态加载待热更新组件,使得已注册组件持有中间件;根据中间件中所包括的设置已注册组件的方法,使得中间件持有已注册组件。如图3所示,展示了***Activity、FooActivity、Middleware及BarActivity之间的继承或持有关系。BarActivity的父类为Middleware,所以BarActivity继承Middleware中的方法;Middleware与FooActivity相互持有,可以相互引用其中所包含的方法;FooActivity的父类为***Activity,FooActivity继承***Activity中的方法。
具体的过程如下所示:
第三步,通过已注册组件覆盖***组件中的公开方法。
具体的,通过已注册组件覆盖***组件中的公开方法,当***调用已注册组件时,转调中间件上的同名方法以使待热更新组件能被***调用。具体的过程如下所示:
这样当***调用FooActivity.onStart()方法时,FooActivity就会调用BarActivity的onStart()方法。
第四步,对待热更新组件、已注册组件及中间件中被覆盖的***同名方法增加调用父类的相应预设方法,***同名方法为与中间件中所包括的***组件中的公开方法名称同名的方法。
具体的,对待热更新组件、已注册组件及中间件中被覆盖的***同名方法增加调用父类的相应预设方法,使待热更新组件能够调用到***组件中的公开方法。其中,***同名方法为与中间件中所包括的***组件中的公开方法名称同名的方法。预设方法包括super方法或invock方法,当然,还可以是其他能够指明被调用方法名和参数列表的方法。
FooActivity针对每一个覆盖后的***Activity方法,都对应的新增一个加上super前缀的新方法,并均实现为调用父类的相应方法,且将参数也原样传递过去。这样,中间件Middleware在实现其同***Activity的同名方法时,均实现为调用FooActivity的相应带有super前缀的方法。以此实现BarActivity调用父类方法时,虽然其父类Middleware已经不再是***Activity了,但是实际上还是能够最终调用到***Activity的相应方法的。具体的过程如下所示:
这样BarActivity中的super.onStart()就会实际调用到mContainer.superOnStart(),也就调用到***Activity的super.onStart()上。事实上指挥了FooActivity何时调用super.onStart()。
本申请实施例中,当***调用FooActivity时,所定义的中间件能够让FooActivity可以在不使用***私有API的前提下,调用到中间件中和***Activity相同的公开方法。又因为中间件为BarActivity的父类,所以进一步调用到BarActivity上原本属于***Activity的方法。
在一个实施例中,如图4所示,S204,当***调用已注册组件时,根据已注册组件通过代理调用到应用程序的待热更新组件,包括:
S204a,通过已注册组件覆盖***组件中的公开方法,当***调用已注册组件时转调中间件上的同名方法;
S204b,在转调中间件上的同名方法之后,转调待热更新组件上的同名方法,以使***调用到待热更新组件。
具体的,FooActivity覆盖所有可覆盖的***Activity方法,当***调用已注册组件时均实现为转而调用所持有的中间件Middleware的同名方法,并将参数也原样传递过去。在转调中间件上的同名方法之后,转调待热更新组件上的同名方法,以使***调用到待热更新组件。具体的过程如下所示:
这样当***调用FooActivity.onStart()方法时,FooActivity就会调用BarActivity的onStart()方法。
本申请实施例中,因为已注册组件的父类是***组件,所以已注册组件可以覆盖***组件的公开方法。且已注册组件和中间件相互持有,所以当***调用已注册组件的时候,就可以转调中间件上的同名方法。中间件又是带热更新组件的父类,所以在转调中间件上的同名方法之后,就可以转调待热更新组件上的同名方法,以使***调用到待热更新组件。这样就实现了不使用***私有API的前提下,***就调用到了待热更新组件。
在一个实施例中,如图5所示,S206,当***调用待热更新组件时,待热更新组件通过代理调用到***组件中的公开方法,包括:
S206a,当***调用待热更新组件时,通过待热更新组件中的相应预设方法调用中间件中的同名方法;
S206b,当调用中间件中的同名方法时,通过中间件中的相应预设方法调用已注册组件中的同名方法;
S206c,当调用已注册组件中的同名方法时,通过已注册组件中的相应预设方法调用到***组件中的公开方法。
具体的,通过已注册组件覆盖***组件中的公开方法,对待热更新组件、已注册组件及中间件中被覆盖的***同名方法增加调用父类的相应预设方法(例如super方法),***同名方法为与中间件中所包括的***组件中的公开方法名称同名的方法。
因为对待热更新组件、已注册组件及中间件中被覆盖的***同名方法都增加了调用父类的super方法,所以当***调用待热更新组件时,通过待热更新组件中的相应预设方法调用中间件中的同名方法。
进一步地,当调用中间件中的同名方法时,通过中间件中的相应预设方法(例如super方法,可以调父类中的方法)调用已注册组件中的同名方法。
最后,当调用已注册组件中的同名方法时,通过已注册组件中的相应预设方法(例如super方法,可以调父类中的方法)调用到***组件中的公开方法。具体的过程如下所示:
/>
本申请实施例中,因为通过已注册组件覆盖***组件中的公开方法,并对待热更新组件、已注册组件及中间件中被覆盖的***同名方法增加调用父类的相应预设方法。所以,可以实现当***调用待热更新组件时,可以通过待热更新组件中的预设方法调用父类中的同名方法,即中间件中的同名方法。继而,通过中间件中的相应预设方法调用已注册组件中的同名方法;进而通过已注册组件中的相应预设方法调用到***组件中的公开方法。最终实现了当***调用待热更新组件时,调用到***组件中的公开方法。
在一个实施例中,通过已注册组件动态加载待热更新组件,使得中间件与已注册组件相互持有,包括:
通过已注册组件在实现onCreate方法时动态加载待热更新组件,使得已注册组件持有中间件;
根据中间件中所包括的设置已注册组件的方法,使得中间件持有已注册组件。
其中,onCreate方法,这是Activity生命周期的第一个方法,也是在android开发中接触最多的方法。onCreate方法本身的作用是进行Activity的一些初始化工作,比如使用setContentView加载布局,对一些控件和变量进行初始化等。
通过已注册组件在实现onCreate方法时动态加载待热更新组件,使得已注册组件以中间件类型持有待热更新组件。在动态加载待热更新组件的过程中需要使用到DexClassLoader。由于待热更新组件的父类为中间件,得到已注册组件持有中间件。根据中间件中所包括的设置已注册组件的方法,使得中间件持有已注册组件。
具体的过程如下所示:
本申请实施例中,中间件与已注册组件相互持有,使得中间件能够作为已注册组件的代理。一方面,当***调用已注册组件的时候,就可以转调中间件上的同名方法。中间件又是带热更新组件的父类,所以在转调中间件上的同名方法之后,就可以转调待热更新组件上的同名方法,以使***调用到待热更新组件。这样就实现了不使用***私有API的前提下,***就调用到了待热更新组件。
另一方面,当***调用待热更新组件时,通过待热更新组件中的相应预设方法调用中间件中的同名方法。进一步地,当调用中间件中的同名方法时,通过中间件中的相应预设方法调用已注册组件中的同名方法。最后,当调用已注册组件中的同名方法时,通过已注册组件中的相应预设方法调用到***组件中的公开方法。从而,成功地对待热更新组件进行了更新。
在一个实施例中,通过已注册组件在实现onCreate方法时动态加载待热更新组件,使得已注册组件持有中间件,包括:
通过已注册组件在实现onCreate方法时动态加载待热更新组件,使得已注册组件以中间件类型持有待热更新组件;
根据待热更新组件的父类为中间件,得到已注册组件持有中间件。
具体的,其中,onCreate方法,这是Activity生命周期的第一个方法,也是在android开发中接触最多的方法。onCreate方法本身的作用是进行Activity的一些初始化工作,比如使用setContentView加载布局,对一些控件和变量进行初始化等。
预先在逻辑中定义,当***调用已注册组件的时候,通过已注册组件在实现onCreate方法时就动态加载待热更新组件,进而已注册组件以中间件类型持有待热更新组件。又因为待热更新组件的父类为中间件,所以已注册组件就持有了中间件。
本申请实施例中,当***调用已注册组件的时候,通过已注册组件在实现onCreate方法时就动态加载待热更新组件,使得已注册组件就持有了中间件。
在一个实施例中,将待热更新组件的父类修改为中间件,包括:
在编译期通过修改字节码将待热更新组件的父类修改为中间件。
具体的,在前期开发调试时,开发人员是按照待热更新组件的父类为***组件来进行开发调试,所以待热更新组件中包括原本属于***Activity的方法。因为待热更新组件未在***中注册,所以传统方法中若***需要调用待热更新组件,则就必须通过***的私有API实现。而本申请实施例是对前期开发调试的代码,通过字节码技术修改字节码将待热更新组件的父类修改为中间件,则待热更新组件就可以对中间件中的方法进行继承(引用),而不需要继承***组件中的方法。
其中,编译期是指把源码交给编译器编译成计算机可以执行的文件的过程,在Java中也就是把Java代码编成class文件的过程。编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作,比如检查错误。
与编译期相对的,运行期是把编译后的文件交给计算机执行,直到程序运行结束。所谓运行期就把在磁盘中的代码放到内存中执行起来,在Java中把磁盘中的代码放到内存中就是类加载过程,类加载是运行期的开始部分。
一般情况下,编写的Java代码都是要被编译成字节码后才能放到JVM(JavaVirtual Machine,Java虚拟机)里执行的,而字节码一旦被加载到虚拟机中,就可以被解释执行。其中,字节码文件(.class)就是普通的二进制文件,是通过Java编译器生成的。如果用特定的规则解析了原有的字节码文件,就可以对解析后的字节码文件进行修改或者重新定义。修改或重新定义字节码,可以实现对类的基本信息进行操作,对属性和方法进行修改。具体指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改。
实现字节码增强的主要步骤为:
1、修改字节码
在内存中获取到原来的字节码,然后通过一些工具(如ASM,Javaasist)来修改它的byte[]数组,得到一个新的byte数组。其中,
2、使修改后的字节码生效,有两种方法:
1)自定义ClassLoader来加载修改后的字节码;
2)替换掉原来的字节码:在JVM加载用户的Class时,拦截,返回修改后的字节码;或者在运行时,使用Instrumentation.redefineClasses方法来替换掉原来的字节码。
本申请实施例中,在编译期对编译的文件采用字节码技术进行编辑修改,将待热更新组件的父类修改为中间件。因为,编译期为程序还未运行的阶段,所以修改之后的文件就可以直接运行。
在一个实施例中,预设方法包括super方法或invock方法。
预设方法可以是一个可指明调用方法名和参数列表的方法。例如预设方法包括super方法或invock方法。具体的,super方法可以实现调用父类中的方法。从而,通过已注册组件覆盖***组件中的公开方法,并对待热更新组件、已注册组件及中间件中被覆盖的***同名方法增加调用父类的相应预设方法。所以,可以实现当***调用待热更新组件时,可以通过待热更新组件中的预设方法调用父类中的同名方法,即中间件中的同名方法。继而,通过中间件中的相应预设方法调用已注册组件中的同名方法;进而通过已注册组件中的相应预设方法调用到***组件中的公开方法。最终实现了当***调用待热更新组件时,调用到***组件中的公开方法。
具体的,invock方法的具体实现过程如下:
本申请实施例中,预设方法可以是一个可以指明调用方法名和参数列表的方法。其中,super方法是直接指向父类的方法,而invock方法是可以实现反向调用的方法。这两者都是可以指明调用方法名和参数列表的方法,当都实现为调用父类中的方法的时候,便可以实现当***调用待热更新组件时,可以通过待热更新组件中的预设方法调用父类中的同名方法,即中间件中的同名方法。继而,通过中间件中的相应预设方法调用已注册组件中的同名方法;进而通过已注册组件中的相应预设方法调用到***组件中的公开方法。最终实现了当***调用待热更新组件时,调用到***组件中的公开方法。
在一个实施例中,***为操作***,包括安卓***;组件包括安卓***中的activity、service、content provider、broadcast receive。
本申请实施例中,***为操作***,包括安卓***。当然,该***也可以包括其他操作***,只要是像安卓***9.0版本一样要求待热更新组件需要在***中注册,且不能访问***的私有API的操作***。在这些操作***中,采用上述应用程序热更新方法都可以实现不使用***私有API对未注册的待热更新组件进行热更新。
在安卓***中,包括四大组件(activity、service、content provider、broadcastreceive),上述待热更新组件不仅可以是activity,还可以是service、content provider、broadcast receive。所以,上述应用程序热更新方法不仅适用于安卓***中待热更新的activity,还可以是待热更新的service、content provider、broadcast receive,都可以实现不使用***私有API对未注册的待热更新的activity、service、content provider、broadcast receive进行热更新。
其中,Activity(活动)是Android的四大组件之一,是用户操作的可视化界面,为用户提供了一个完成操作指令的窗口。当创建完毕Activity之后,需要调用setContentView()方法来完成界面的显示,以此来为用户提供交互的入口。在AndroidApp中只要能看见的几乎都要依托于Activity,所以Activity是在开发中使用最频繁的一种组件。
service(服务)也是安卓中的四大组件之一,通常用作在后台处理耗时的逻辑,与Activity一样存在自己的生命周期,也需要在AndroidManifest.xml配置相关信息。
广播接受者(Broadcast Receive)也是安卓中的四大组件之一。在Android中,广播是一种广泛运用的在应用程序之间传输信息的机制。而广播接收者是对发送出来的广播进行过滤接受并响应的一类组件,可以使用广播接收器来让应用对一个外部时间做出响应。
内容提供者(Content Provider)也是安卓中的四大组件之一。android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过Content Resolver类从该内容提供者中获取或存入数据。只有需要在多个应用程序间共享数据时才需要使用到内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。内容提供者的好处是统一数据访问方式。
如图6所示,为一个具体的实施例中应用程序热更新方法的程序注释图。FooActivity和BarActivity只是一个名称指代,其中,FooActivity指的是已注册组件,BarActivity指的是待热更新组件。当然,也可以对已注册组件命名为其他名称。对待热更新组件命名为其他名称。例如,当已注册组件为Service(安卓***的四大组件之一)时,可以对已注册组件命名为AService,对待热更新组件命名为BService。以下步骤均在图中进行了注释:
1.FooActivity覆盖了***Activity的onStart()方法,就必须在实现onStart方法的内部调用super.onStart()方法。因为Android***要求Activity在覆盖生命周期方法时必须调用父类的相应生命周期方法。
2.在这样的要求下,希望以正常安装方式开发调试BarActivity,就要求BarActivity也遵循这个规定,所以BarActivity的onStart方法中也有调用super.onStart方法。
3.FooActivity通过代理模式将onStart方法实现成转调BarActivity的onStart方法。
4.BarActivity的父类已经被改成了Middleware,BarActivity调用的super.onStart方法实际上调用的是Middleware的onStart方法。
5.在这个过程中没有按照***规定调用***Activity的onStart方法了,所以FooActivity没有调用super.onStart方法。
6.FooActivity不知道该先调用super.onStart再调用BarActivity的onStart方法,还是反过来调用。
7.所以规定不让FooActivity主动调用super.onStart方法,而是让Middleware的onStart方法实现成调用mContainer.superOnStart方法,FooActivity的superOnStart方法实现成调用super.onStart方法,
8.进而实现BarActivity调用super.onStart方法;调用到Middleware的onStart方法;再调用到FooActivity的superOnStart方法;进而调用到***Activity的onStart方法上。
9.完成***对FooActivity的要求。
同时也使得这一过程和BarActivity正常安装运行时,对super.onStart方法调用的时机保持一致。
本申请实施例中,传统方法中因为待热更新组件未在***中注册,所以***不能直接调用待热更新组件,且待热更新组件也不能直接调用到***组件中的公开方法。本方法通过设置代理,当***调用已注册组件时,根据已注册组件通过代理间接调用到应用程序的待热更新组件。且代理并非***组件的子类就隔离了待热更新组件和***组件之间的直接访问。进而当***调用已注册组件时,根据已注册组件通过代理间接调用到应用程序的待热更新组件。当***调用待热更新组件时,待热更新组件通过代理间接调用到***组件中的公开方法,从而,就可以通过***组件中的公开方法对待热更新组件进行热更新。
应该理解的是,虽然上述流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,上述流程图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图7所示,提供了一种应用程序热更新装置700,包括:已注册组件获取模块702、待热更新组件调用模块704、***组件中的公开方法调用模块706及热更新模块708。其中,
已注册组件获取模块702,用于获取应用程序的已注册组件;
待热更新组件调用模块704,用于当***调用已注册组件时,根据已注册组件通过代理调用到应用程序的待热更新组件,代理并非***组件的子类;
***组件中的公开方法调用模块706,用于当***调用待热更新组件时,待热更新组件通过代理调用到***组件中的公开方法;
热更新模块708,用于通过***组件中的公开方法对待热更新组件进行热更新。
在一个实施例中,如图8所示,提供了一种应用程序热更新装置700,代理为中间件;还包括:
待热更新组件的父类修改模块710,用于将待热更新组件的父类修改为中间件,中间件包括***组件中的公开方法名称及设置已注册组件的方法;
中间件与已注册组件相互持有模块712,用于通过已注册组件动态加载待热更新组件,使得中间件与已注册组件相互持有;
新增预设方法模块714,用于通过已注册组件覆盖***组件中的公开方法,对待热更新组件、已注册组件及中间件中被覆盖的***同名方法增加调用父类的相应预设方法,***同名方法为与中间件中所包括的***组件中的公开方法名称同名的方法。
在一个实施例中,待热更新组件调用模块704,还用于通过已注册组件覆盖***组件中的公开方法,当***调用已注册组件时转调中间件上的同名方法;
在转调中间件上的同名方法之后,转调待热更新组件上的同名方法,以使***调用到待热更新组件。
在一个实施例中,如图9所示,***组件中的公开方法调用模块706,包括:
中间件中的同名方法调用单元706a,用于当***调用待热更新组件时,通过待热更新组件中的相应预设方法调用中间件中的同名方法;
已注册组件中的同名方法调用单元706b,用于当调用中间件中的同名方法时,通过中间件中的相应预设方法调用已注册组件中的同名方法;
***组件中的公开方法调用单元706c,用于当调用已注册组件中的同名方法时,通过已注册组件中的相应预设方法调用到***组件中的公开方法。
在一个实施例中,中间件与已注册组件相互持有模块712,还用于通过已注册组件在实现onCreate方法时动态加载待热更新组件,使得已注册组件持有中间件;根据中间件中所包括的设置已注册组件的方法,使得中间件持有已注册组件。
在一个实施例中,中间件与已注册组件相互持有模块712,还用于通过已注册组件在实现onCreate方法时动态加载待热更新组件,使得已注册组件以中间件类型持有待热更新组件;根据待热更新组件的父类为中间件,得到已注册组件持有中间件。
在一个实施例中,待热更新组件的父类修改模块710,还用于在编译期通过修改字节码将待热更新组件的父类修改为中间件。
在一个实施例中,预设方法包括super方法或invock方法。
在一个实施例中,***为操作***,包括安卓***;组件包括安卓***中的activity、service、content provider、broadcast receive。
图10示出了一个实施例中计算机设备的内部结构图。该计算机设备具体可以是图1中的终端110。如图10所示,该计算机设备包括该计算机设备包括通过***总线连接的处理器、存储器、网络接口、输入装置、显示屏、摄像头、声音采集装置及扬声器。其中,存储器包括非易失性存储介质和内存储器。该计算机设备的非易失性存储介质存储有操作***,还可存储有计算机程序,该计算机程序被处理器执行时,可使得处理器实现上述应用程序热更新方法。该内存储器中也可储存有计算机程序,该计算机程序被处理器执行时,可使得处理器执行上述应用程序热更新方法。计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图10中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,本申请提供的应用程序热更新装置可以实现为一种计算机程序的形式,计算机程序可在如图10所示的计算机设备上运行。计算机设备的存储器中可存储组成该应用程序热更新装置的各个程序模块,比如,图7所示的已注册组件获取模块702、待热更新组件调用模块704、***组件中的公开方法调用模块706及热更新模块708。各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本申请各个实施例的应用程序热更新方法中的步骤。
例如,图10所示的计算机设备可以通过如图7所示的应用程序热更新装置中的已注册组件获取模块702执行步骤S202。计算机设备可通过待热更新组件调用模块704执行步骤S204。计算机设备可通过***组件中的公开方法调用模块706执行步骤S206。计算机设备可通过热更新模块708执行步骤S208。
在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述应用程序热更新方法的步骤。此处应用程序热更新方法的步骤可以是上述各个实施例的应用程序热更新方法中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述应用程序热更新方法的步骤。此处应用程序热更新方法的步骤可以是上述各个实施例的应用程序热更新方法中的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

Claims (18)

1.一种应用程序热更新方法,包括:
获取应用程序的已注册组件;
当***调用所述已注册组件时,根据所述已注册组件通过代理调用到所述应用程序的待热更新组件,所述代理并非***组件的子类,所述代理为中间件;
将所述待热更新组件的父类修改为中间件,所述中间件包括***组件中的公开方法名称及设置所述已注册组件的方法;
通过所述已注册组件动态加载所述待热更新组件,使得所述中间件与所述已注册组件相互持有;
通过所述已注册组件覆盖所述***组件中的公开方法,对所述待热更新组件、所述已注册组件及所述中间件中被覆盖的***同名方法增加调用父类的相应预设方法,所述***同名方法为与所述中间件中所包括的***组件中的公开方法名称同名的方法;
当***调用所述待热更新组件时,所述待热更新组件通过所述代理调用到所述***组件中的公开方法;
通过所述***组件中的公开方法对所述待热更新组件进行热更新。
2.根据权利要求1所述的方法,其特征在于,所述当***调用所述已注册组件时,根据所述已注册组件通过代理调用到所述应用程序的待热更新组件,包括:
通过所述已注册组件覆盖所述***组件中的公开方法,当***调用所述已注册组件时转调所述中间件上的同名方法;
在转调所述中间件上的同名方法之后,转调所述待热更新组件上的同名方法,以使***调用到所述待热更新组件。
3.根据权利要求1所述的方法,其特征在于,所述当***调用所述待热更新组件时,所述待热更新组件通过所述代理调用到所述***组件中的公开方法,包括:
当***调用所述待热更新组件时,通过所述待热更新组件中的相应预设方法调用所述中间件中的同名方法;
当调用所述中间件中的同名方法时,通过所述中间件中的相应预设方法调用所述已注册组件中的同名方法;
当调用所述已注册组件中的同名方法时,通过所述已注册组件中的相应预设方法调用到所述***组件中的公开方法。
4.根据权利要求1所述的方法,其特征在于,所述通过所述已注册组件动态加载所述待热更新组件,使得所述中间件与所述已注册组件相互持有,包括:
通过所述已注册组件在实现onCreate方法时动态加载所述待热更新组件,使得所述已注册组件持有中间件;
根据所述中间件中所包括的设置所述已注册组件的方法,使得所述中间件持有所述已注册组件。
5.根据权利要求4所述的方法,其特征在于,所述通过所述已注册组件在实现onCreate方法时动态加载所述待热更新组件,使得所述已注册组件持有中间件,包括:
通过所述已注册组件在实现onCreate方法时动态加载所述待热更新组件,使得所述已注册组件以中间件类型持有所述待热更新组件;
根据所述待热更新组件的父类为中间件,得到所述已注册组件持有中间件。
6.根据权利要求1所述的方法,其特征在于,所述将所述待热更新组件的父类修改为中间件,包括:
在编译期通过修改字节码将所述待热更新组件的父类修改为中间件。
7.根据权利要求1所述的方法,其特征在于,所述预设方法包括super方法或invock方法。
8.根据权利要求1所述的方法,其特征在于,所述***为操作***,包括安卓***;所述组件包括所述安卓***中的activity、service、content provider、broadcast receive。
9.一种应用程序热更新装置,其特征在于,所述装置包括:
已注册组件获取模块,用于获取应用程序的已注册组件;
待热更新组件调用模块,用于当***调用所述已注册组件时,根据所述已注册组件通过代理调用到所述应用程序的待热更新组件,所述代理并非***组件的子类,所述代理为中间件;
待热更新组件的父类修改模块,用于将所述待热更新组件的父类修改为中间件,所述中间件包括***组件中的公开方法名称及设置所述已注册组件的方法;
中间件与已注册组件相互持有模块,用于通过所述已注册组件动态加载所述待热更新组件,使得所述中间件与所述已注册组件相互持有;
新增预设方法模块,用于通过所述已注册组件覆盖所述***组件中的公开方法,对所述待热更新组件、所述已注册组件及所述中间件中被覆盖的***同名方法增加调用父类的相应预设方法,所述***同名方法为与所述中间件中所包括的***组件中的公开方法名称同名的方法;
***组件中的公开方法调用模块,用于当***调用所述待热更新组件时,所述待热更新组件通过所述代理调用到所述***组件中的公开方法;
热更新模块,用于通过所述***组件中的公开方法对所述待热更新组件进行热更新。
10.根据权利要求9所述的装置,其特征在于,所述待热更新组件调用模块,还用于通过所述已注册组件覆盖所述***组件中的公开方法,当***调用所述已注册组件时转调所述中间件上的同名方法;在转调所述中间件上的同名方法之后,转调所述待热更新组件上的同名方法,以使***调用到所述待热更新组件。
11.根据权利要求9所述的装置,其特征在于,所述公开方法调用模块,包括中间件中的同名方法调用单元、已注册组件中的同名方法调用单元和***组件中的公开方法调用单元;
所述中间件中的同名方法调用单元,用于当***调用所述待热更新组件时,通过所述待热更新组件中的相应预设方法调用所述中间件中的同名方法;
所述已注册组件中的同名方法调用单元,用于当调用所述中间件中的同名方法时,通过所述中间件中的相应预设方法调用所述已注册组件中的同名方法;
所述***组件中的公开方法调用单元,用于当调用所述已注册组件中的同名方法时,通过所述已注册组件中的相应预设方法调用到所述***组件中的公开方法。
12.根据权利要求9所述的装置,其特征在于,所述中间件与已注册组件相互持有模块,还用于通过所述已注册组件在实现onCreate方法时动态加载所述待热更新组件,使得所述已注册组件持有中间件;根据所述中间件中所包括的设置所述已注册组件的方法,使得所述中间件持有所述已注册组件。
13.根据权利要求12所述的装置,其特征在于,所述中间件与已注册组件相互持有模块,还用于通过所述已注册组件在实现onCreate方法时动态加载所述待热更新组件,使得所述已注册组件以中间件类型持有所述待热更新组件;根据所述待热更新组件的父类为中间件,得到所述已注册组件持有中间件。
14.根据权利要求9所述的装置,其特征在于,所述待热更新组件的父类修改模块,还用于在编译期通过修改字节码将所述待热更新组件的父类修改为中间件。
15.根据权利要求9所述的装置,其特征在于,所述预设方法包括super方法或invock方法。
16.根据权利要求9所述的装置,其特征在于,所述***为操作***,包括安卓***;所述组件包括所述安卓***中的activity、service、content provider、broadcastreceive。
17.一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如权利要求1至8中任一项所述方法的步骤。
18.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如权利要求1至8中任一项所述方法的步骤。
CN201910398867.XA 2019-05-14 2019-05-14 应用程序热更新方法、装置和计算机可读存储介质 Active CN111949301B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910398867.XA CN111949301B (zh) 2019-05-14 2019-05-14 应用程序热更新方法、装置和计算机可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910398867.XA CN111949301B (zh) 2019-05-14 2019-05-14 应用程序热更新方法、装置和计算机可读存储介质

Publications (2)

Publication Number Publication Date
CN111949301A CN111949301A (zh) 2020-11-17
CN111949301B true CN111949301B (zh) 2023-10-27

Family

ID=73335639

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910398867.XA Active CN111949301B (zh) 2019-05-14 2019-05-14 应用程序热更新方法、装置和计算机可读存储介质

Country Status (1)

Country Link
CN (1) CN111949301B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116414424B (zh) * 2023-06-09 2023-09-12 建信金融科技有限责任公司 热更新方法、装置、设备及存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103744669A (zh) * 2013-12-26 2014-04-23 世纪龙信息网络有限责任公司 安卓***Activity插件的创建、调用方法及***
CN108399080A (zh) * 2018-03-05 2018-08-14 深圳市华讯方舟软件信息有限公司 一种Android App热更新方法
CN109445832A (zh) * 2018-10-09 2019-03-08 深圳点猫科技有限公司 基于编程语言对应用程序进行热更新的方法以及电子设备

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103744669A (zh) * 2013-12-26 2014-04-23 世纪龙信息网络有限责任公司 安卓***Activity插件的创建、调用方法及***
CN108399080A (zh) * 2018-03-05 2018-08-14 深圳市华讯方舟软件信息有限公司 一种Android App热更新方法
CN109445832A (zh) * 2018-10-09 2019-03-08 深圳点猫科技有限公司 基于编程语言对应用程序进行热更新的方法以及电子设备

Also Published As

Publication number Publication date
CN111949301A (zh) 2020-11-17

Similar Documents

Publication Publication Date Title
US20220398109A1 (en) Dynamically Loaded Plugin Architecture
US8954929B2 (en) Automatically redirecting method calls for unit testing
US10331425B2 (en) Automated source code adaption to inject features between platform versions
US10019598B2 (en) Dynamic service discovery
CN110471690B (zh) 动态链接库so文件的加载方法、装置及存储介质
WO2007137403A1 (en) System and method of generating applications for mobile devices
CN115629971A (zh) 一种应用的开发***和开发方法
CN104731622A (zh) 一种应用程序的加载方法、装置和移动终端
CN114371841A (zh) 前端项目代码生成方法、装置、计算机设备和存储介质
KR20080039080A (ko) 이종언어편집 라이브러리의 인터페이스 기능이 구비된단말장비, api호출방법 및 컴파일함수생성방법
CN111949301B (zh) 应用程序热更新方法、装置和计算机可读存储介质
CN111400256B (zh) 一种应用程序调用资源文件的方法及装置
CN117707543A (zh) 一种应用安装包制作和安装方法、计算设备及存储介质
CN114490103A (zh) 一种操作***接口调用方法、装置以及电子设备
CN114138376B (zh) 一种在应用中加载插件的方法、计算设备及存储介质
CN113031964B (zh) 一种大数据应用的管理方法、装置、设备及存储介质
CN115374083A (zh) 数据源的切换方法、装置、电子设备及存储介质
US11340915B2 (en) Encaching and sharing transformed libraries
CN113722538B (zh) 一种界面动态渲染方法及装置
KR102310766B1 (ko) 어플리케이션의 무결성 검사방법
CN117667246A (zh) 一种浏览器内核管理方法和***
CN117555800A (zh) 一种联机程序测试方法、装置及设备
US20080320447A1 (en) Method of accessing web parameters
CN116679971A (zh) 一种热修复方法、装置、电子设备及存储介质
CN115705289A (zh) 测试方法、Mock框架、用户设备、服务设备和存储介质

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
GR01 Patent grant
GR01 Patent grant