CN105468410B - 系统升级方法及装置 - Google Patents
系统升级方法及装置 Download PDFInfo
- Publication number
- CN105468410B CN105468410B CN201510825595.9A CN201510825595A CN105468410B CN 105468410 B CN105468410 B CN 105468410B CN 201510825595 A CN201510825595 A CN 201510825595A CN 105468410 B CN105468410 B CN 105468410B
- Authority
- CN
- China
- Prior art keywords
- function
- address
- file
- parameter
- data information
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
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)系统是一个开源的移动设备操作系统。目前很多移动设备操作系统均基于安卓系统开发,为安卓兼容系统。但是所有安卓兼容系统必须兼容所有为安卓系统开发的软件。因此,这些安卓兼容系统不但需要保证自有软件的正常使用,而且需要保证基于安卓系统开发的第三方软件的正常使用。
为了将安卓系统改造为一个新的安卓兼容系统,现有的技术方案,是通过修改源代码来实现的。通过在安卓系统的源代码中,在适当的位置插入或者修改原代码,然后再一起编译来实现。
由于必须修改源代码,才能实现安卓系统的改造,这就导致当安卓系统升级时,必须付出额外的工作进行源代码的合并和修改才可以完成兼容系统的升级,耗费时间多。
发明内容
为克服相关技术中存在的问题,本公开提供一种系统升级方法及装置。
根据本公开实施例的第一方面,提供一种系统升级方法,包括:
对第一文件打补丁,以将原方法替换为第一方法,将所述原方法备份到第二方法中,生成数据信息,并将所述数据信息写入预先创建的第二文件中;
加载所述第二文件,并初始化所述数据信息;
对所述数据信息进行修改,以实现对第三方软件的兼容;
将对所述原方法的调用转换为对所述第一方法的调用,并通过第二方法调用备份的所述原方法。
在一实施例中,所述对第一文件打补丁,以将原方法替换为第一方法,将所述原方法备份到第二方法中,生成数据信息,并将所述数据信息写入预先创建的第二文件中,包括:
接收参数信息;
根据所述参数信息从所述第一文件中获得所述原方法的入口地址,并将所述原方法入口处将要被覆盖的代码备份到所述第二文件中;
在所述原方法的入口处写入第一跳转指令,所述第一跳转指令用于跳转到第一函数,所述第一函数用于将所述原方法的参数转换为所述第一方法的参数;
根据所述参数信息从所述第一文件中获得所述第二方法的入口地址,并在所述第二方法的入口处写入第二跳转指令,所述第二跳转指令用于跳转到第二函数,所述第二函数用于将所述第二方法的参数转换为所述原方法的参数;
根据所述参数信息从所述第一文件中获得所述第一方法的入口地址,生成数据信息,并将所述数据信息写入所述第二文件中。
在一实施例中,所述参数信息包括所述第二文件的加载地址,所述加载所述第二文件,初始化所述数据信息,包括:
根据所述加载地址,将所述第二文件加载到内存中的固定地址;
获取所述第一跳转指令中的第一函数和所述第二跳转指令中的第二函数,并获取第一函数地址和第二函数地址;
使用获取的所述第一函数地址替换所述数据信息中的第一函数地址,使用获取的所述第二函数地址替换所述数据信息中的第二函数地址。
在一实施例中,所述对所述数据信息进行修改,以实现对第三方软件的兼容,包括:
获取第三函数,所述第三函数用于将所述第一方法的参数恢复为所述原方法的参数;
使用所述第三函数替换所述第一函数,以实现对第三方软件的兼容。
在一实施例中,所述将对所述原方法的调用转换为对所述第一方法的调用,包括:
通过所述第一跳转指令跳转到第一函数,通过所述第一函数将所述原方法的参数转换为所述第一方法的参数,以执行所述第一方法。
在一实施例中,所述通过第二方法调用备份的所述原方法,包括:
通过所述第二跳转指令跳转到第二函数,通过所述第二函数将所述第二方法的参数转换为所述原方法的参数,以获取到备份的所述原方法的地址;
根据所述地址跳转执行备份的所述原方法。
根据本公开实施例的第二方面,提供一种系统升级装置,包括:
打补丁模块,被配置为对第一文件打补丁,以将原方法替换为第一方法,将所述原方法备份到第二方法中,生成数据信息,并将所述数据信息写入预先创建的第二文件中;
加载初始化模块,被配置为加载所述第二文件,并初始化所述数据信息;
修改模块,被配置为对所述数据信息进行修改,以实现对第三方软件的兼容;
转换备份模块,被配置为将对所述原方法的调用转换为对所述第一方法的调用,并通过第二方法调用备份的所述原方法。
在一实施例中,所述打补丁模块包括:
接收子模块,被配置为接收参数信息;
获得备份子模块,被配置为根据所述参数信息从所述第一文件中获得所述原方法的入口地址,并将所述原方法入口处将要被覆盖的代码备份到所述第二文件中;
写入子模块,被配置为在所述原方法的入口处写入第一跳转指令,所述第一跳转指令用于跳转到第一函数,所述第一函数用于将所述原方法的参数转换为所述第一方法的参数;
获得写入子模块,被配置为根据所述参数信息从所述第一文件中获得所述第二方法的入口地址,并在所述第二方法的入口处写入第二跳转指令,所述第二跳转指令用于跳转到第二函数,所述第二函数用于将所述第二方法的参数转换为所述原方法的参数;
获得生成写入子模块,被配置为根据所述参数信息从所述第一文件中获得所述第一方法的入口地址,生成数据信息,并将所述数据信息写入所述第二文件中。
在一实施例中,所述参数信息包括所述第二文件的加载地址,所述加载初始化模块包括:
加载子模块,被配置为根据所述加载地址,将所述第二文件加载到内存中的固定地址;
获取子模块,被配置为获取所述第一跳转指令中的第一函数和所述第二跳转指令中的第二函数,并获取第一函数地址和第二函数地址;
替换子模块,被配置为使用获取的所述第一函数地址替换所述数据信息中的第一函数地址,使用获取的所述第二函数地址替换所述数据信息中的第二函数地址。
在一实施例中,所述修改模块包括:
获取子模块,被配置为获取第三函数,所述第三函数用于将所述第一方法的参数恢复为所述原方法的参数;
替换子模块,被配置为使用所述第三函数替换所述第一函数,以实现对第三方软件的兼容。
在一实施例中,所述转换备份模块包括:
跳转转换执行子模块,被配置为通过所述第一跳转指令跳转到第一函数,通过所述第一函数将所述原方法的参数转换为所述第一方法的参数,以执行所述第一方法。
在一实施例中,所述转换备份模块包括:
跳转转换子模块,被配置为通过所述第二跳转指令跳转到第二函数,通过所述第二函数将所述第二方法的参数转换为所述原方法的参数,以获取到备份的所述原方法的地址;
执行子模块,被配置为根据所述地址跳转执行备份的所述原方法。
根据本公开实施例的第三方面,提供一种系统升级装置,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,处理器被配置为:
对第一文件打补丁,以将原方法替换为第一方法,将所述原方法备份到第二方法中,生成数据信息,并将所述数据信息写入预先创建的第二文件中;
加载所述第二文件,并初始化所述数据信息;
对所述数据信息进行修改,以实现对第三方软件的兼容;
将对所述原方法的调用转换为对所述第一方法的调用,并通过第二方法调用备份的所述原方法。
本公开的实施例提供的技术方案可以包括以下有益效果:通过对第一文件打补丁,使得系统启动时,可以完成方法替换,通过在系统启动后初始化数据信息,以及在软件启动时对数据信息进行修改,使得对原方法的调用转换为对第一方法的调用,并通过第二方法调用备份的原方法,从而在不修改源代码的情况下,实现兼容系统的升级,大大地节省了时间、减少了出错率以及提高了升级效率。
可以实现将原方法替换为第一方法,将原方法备份到第二方法中,生成数据信息,并将数据信息写入第二文件中,从而为后续实现方法调用转换提供了条件。
通过一次初始化数据信息可以作用到所有软件进程,提高了初始化效率,从而为后续实现方法调用转换提供了条件。
使用第三函数替换第一函数,为实现对第三方软件的兼容提供了条件。
可以通过参数转换实现由原方法到第一方法的调用,由于第一方法中包含了升级后的新代码,因此,该实施例可以在不修改源代码的情况下实现系统升级。
通过根据地址跳转执行备份的原方法,可以实现对第三方软件的兼容。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本发明的实施例,并与说明书一起用于解释本发明的原理。
图1A是根据一示例性实施例示出的一种系统升级方法的流程图。
图1B是根据一示例性实施例示出的一种打补丁的过程示意图。
图2A是根据一示例性实施例示出的一种方法替换过程的流程图。
图2B是根据一示例性实施例示出的另一种方法替换过程的流程图。
图3是根据一示例性实施例示出的一种初始化数据信息的流程图。
图4是根据一示例性实施例示出的一种对数据信息进行修改的流程图。
图5是根据一示例性实施例示出的一种对原方法的调用转换为对第一方法的调用的流程图。
图6是根据一示例性实施例示出的一种第三函数的工作流程图。
图7是根据一示例性实施例示出的一种系统升级装置的框图。
图8是根据一示例性实施例示出的另一种系统升级装置的框图。
图9是根据一示例性实施例示出的另一种系统升级装置的框图。
图10是根据一示例性实施例示出的另一种系统升级装置的框图。
图11是根据一示例性实施例示出的另一种系统升级装置的框图。
图12是根据一示例性实施例示出的另一种系统升级装置的框图。
图13是根据一示例性实施例示出的一种适用于系统升级装置的框图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的装置和方法的例子。
图1A是根据一示例性实施例示出的一种系统升级方法的流程图,如图1A所示,该系统升级方法可应用于移动终端上,该移动终端可以包括手机、平板电脑、PDA(PersonalDigital Assistant,个人数字助理)等,该方法包括以下步骤S101-S104:
在步骤S101中,对第一文件打补丁,以将原方法替换为第一方法,将原方法备份到第二方法中,生成数据信息,并将数据信息写入预先创建的第二文件中。
由于Android系统大部分采用java语言编写,而Java语音是一种解释型语言,运行java系统必须安装一个虚拟机软件。虚拟机软件读取字节码,并根据字节码的含义,执行不同的运算。在5.0以前的版本中,Android使用Dalvik虚拟机。从5.0开始,Android引入了一个名为ART的虚拟机。如图1B所示,在ART的执行过程中,将Dalvik字节码转换为指令代码,并存储在文件中,这种文件的格式,被ART称为OAT文件,即图1B中的boot.oat。
其中,OAT文件存储的是java的类(Class)信息以及方法的指令代码。一个使用java语言编写的软件,其程序由一组class组成,每个Class由若干个域(Field)和Method组成。Field用来定义数据。一个Field定义一条数据。Class内部的所有Field,定义了该Class所拥有的数据集合。而Class内部所有的Method共同操作这组数据集合。每个Class的每个Method的数据,都包含了该Method的指令数据的位置。由于本公开实施例不涉及Field,因此,下文将自动忽略Class内部的Field集合。
在该实施例中,第一文件是指ART生成的OAT文件,即图1B中的boot.oat,通过对第一文件打补丁,可以将原方法替换为第一方法,将原方法备份到第二方法中,并生成数据信息。
另外,需要创建第二文件,其中,第二文件是指图1B中的boot-proxy.img。如图1B所示,在对boot.oat打补丁之后,会产生两个文件即新的boot.oat和boot-proxy.img。然后由CPU同时加载这两个文件,并将这两个文件中的指令代码结合在一起执行。需要说明的是,新boot.oat和打补丁之前的boot.oat内容不同,相对于打补丁之前的boot.oat,新boot.oat内原方法入口处的代码已经被修改。
由于Android系统大部分采用java语言编写,而Java语言的最小执行单位是方法(Method)。因此,本实施例以方法为单位进行替换。其中,方法是一组程序代码的集合,该组程序代码能够接受一组输入数据作为参数,并返回计算结果。
在该实施例中,如图2A所示,S101可以包括以下步骤S1011-1015:
在步骤S1011中,接收参数信息。
在该实施例中,参数信息可以包括:boot.oat的路径,Boot-proxy.img的路径,保存了原方法列表的文件:hooked-classes.txt以及Boot-proxy.img的加载地址。
在步骤S1012中,根据参数信息从第一文件中获得原方法的入口地址,并将原方法入口处将要被覆盖的代码备份到第二文件中。
在该实施例中,可以根据boot.oat的路径从boot.oat中获得原方法的入口地址。
在步骤S1013中,在原方法的入口处写入第一跳转指令。
第一跳转指令用于跳转到第一函数,第一函数用于将原方法的参数转换为第一方法的参数。
在步骤S1014中,根据参数信息从第一文件中获得第二方法的入口地址,并在第二方法的入口处写入第二跳转指令。
第二跳转指令用于跳转到第二函数,第二函数用于将第二方法的参数转换为原方法的参数。
在步骤S1015中,根据参数信息从第一文件中获得第一方法的入口地址,生成数据信息,并将数据信息写入第二文件中。
在该实施例中,数据信息可以包括:第一函数的地址、第二函数的地址、第一方法的入口地址、第二方法的入口地址以及被覆盖代码的地址。
由此可见,通过上述步骤S1011-S1015,可以实现方法间的替换且生成数据信息,从而为后续实现方法调用的转换提供条件。
在步骤S102中,加载第二文件,并初始化数据信息。
在Android系统中,所有软件的进程都是由Zygote进程孕育(fork)出来的。Zygote进程在系统启动时被创建出来,并且在系统运行过程中一直存在的进程,它是所有Android软件的管理进程。fork是Android系统创建新线程的方法。fork的含义是:根据当前进程,创建一个一模一样的新进程。当前进程被称为父进程,fork出来的进程被称为子进程。当子进程刚被fork出后,子进程和父进程共享所有的内存和数据;只有当子进程或者父进程改变自己的数据时,Android系统才会为它们各自复制一份独立的数据。这种机制被称为写时复制(CopyOnWrite)技术。当然,Android系统不会复制全部的数据,而是按照页(Page)为单位,复制那些被改变的数据,没有被改变的数据仍旧在子进程和父进程之间共享。Page的大小一般是4K。
当Zygote进程启动后,会加载boot.oat文件,但是boot.oat文件此时已经被修改,这时必须加载boot-proxy.img,否则会导致系统崩溃。
通过初始化数据信息,完成数据信息中函数地址的替换。
在步骤S103中,对数据信息进行修改,以实现对第三方软件的兼容。
因为Zygote实现了函数替换,这个函数替换会在整个系统内生效,这就会影响到第三方的软件,为了实现对第三方软件的兼容,需要对数据信息进行修改。
在步骤S104中,将对原方法的调用转换为对第一方法的调用,并通过第二方法调用备份的原方法。
在该实施例中,由于在原方法的入口处写入第一跳转指令,因此,可以通过第一跳转指令跳转到第一函数,并通过第一函数将原方法的参数转换为第一方法的参数,从而执行第一方法。
同样地,由于在第二方法的入口处写入第二跳转指令,因此,可以通过第二跳转指令跳转到第二函数,并通过第二函数将第二方法的参数转换为原方法的参数,以获取到备份的原方法的地址,并根据该地址跳转执行原方法。
上述实施例,通过对第一文件打补丁,使得系统启动时,可以完成方法替换,通过在系统启动后初始化数据信息,以及在软件启动时对数据信息进行修改,使得启动软件的时间大大减少,实验表明通过本实施例提供的系统升级方式启动软件大约需要消耗1毫秒左右。
而在软件启动之后、正式打开之前完成方法替换的方式,会导致软件打开的速度减慢,实验表明通过这种方式启动软件大约需要消耗为10-15毫秒。另外,这种方式在完成方法替换的过程中,需要将方法保存在内存区域,故需要额外占用内存空间。由此可见,本公开实施例提供的系统升级方式,可以明显地提高软件的启动速度且不需要额外占用内存空间。
上述系统升级方法实施例,通过对第一文件打补丁,使得系统启动时,可以完成方法替换,通过在系统启动后初始化数据信息,以及在软件启动时对数据信息进行修改,使得对原方法的调用转换为对第一方法的调用,并通过第二方法调用备份的原方法,从而在不修改源代码的情况下,实现兼容系统的升级,大大地节省了时间、减少了出错率以及提高了升级效率。
图2B是根据一示例性实施例示出的另一种方法替换过程的流程图,如图2B所示,该方法包括如下步骤S201-S211:
在步骤S201中,从保存了原方法列表的文件中读取所有方法,并保存到一数组中。
在步骤S202中,打开第一文件。
在该实施例中,可以根据第一文件的路径打开第一文件。
在步骤S203中,打开第二文件。
在该实施例中,可以根据第二文件的路径打开第二文件。
在步骤S204中,判断数组是否全部读完,若全部读完,操作结束,若未全部读完,则执行步骤S205。
在步骤S205中,从数组中读取一个原方法。
在步骤S206中,从第一文件中得到该原方法的入口地址。
在步骤S207中,将该原方法将要被覆盖的代码写入第二文件。
在步骤S208中,在该原方法的入口处写入第一跳转指令。
在步骤S209中,从第一文件中找到第二方法的入口地址。
在步骤S210中,在第二方法的入口处写入第二跳转指令。
在步骤S211中,从第一文件中获得第一方法的入口地址,生成数据信息,并将数据信息写入第二文件中。
上述实施例,可以实现将原方法替换为第一方法,将原方法备份到第二方法中,生成数据信息,并将数据信息写入第二文件中,从而为后续实现方法调用转换提供了条件。
图3是根据一示例性实施例示出的一种初始化数据信息的流程图,如图3所示,该方法包括以下步骤:
在步骤S301中,将第二文件加载到内存中的固定地址。
在该实施例中,可以获得第二文件的加载地址,并根据该加载地址将第二文件加载到内存中的固定地址。
在步骤S302中,获取第一跳转指令中的第一函数和第二跳转指令中的第二函数,并获取第一函数地址和第二函数地址。
在该实施例中,第一函数和第二函数被编译为一个动态库,当这个动态库被加载到内存后,动态库内的所有函数的地址都会被重新计算。因此,第一函数地址和第二函数地址只有在运行时才能确定,并且是从动态库中获取。
在步骤S303中,使用获取的第一函数地址替换数据信息中的第一函数地址,使用获取的第二函数地址替换数据信息中的第二函数地址。
上述系统升级方法实施例,通过一次初始化数据信息可以作用到所有软件进程,提高了初始化效率,从而为后续实现方法调用转换提供了条件。
图4是根据一示例性实施例示出的一种对数据信息进行修改的流程图,如图4所示,该方法包括以下步骤:
在步骤S401中,获取第三函数。
在该实施例中,第三函数用于将第一方法的参数恢复为原方法的参数。
在步骤S402中,使用第三函数替换第一函数,以实现对第三方软件的兼容。
该步骤在所有安卓兼容程序例如米柚程序启动时执行。
上述实施例,使用第三函数替换第一函数,为实现对第三方软件的兼容提供了条件。
图5是根据一示例性实施例示出的一种对原方法的调用转换为对第一方法的调用的流程图,如图5所示,该方法包括以下步骤S501-S506:
在步骤S501中,保存被使用的寄存器。
由于寄存器可能保存有其他信息,因此,在寄存器被写入新数据前,需要保存被使用的寄存器。
在步骤S502中,获取跳转目标地址,并将其写入到寄存器中。
在该实施例中,处理器不能直接跳转到任意一个指定的地址,而只能先将目标地址写入一个寄存器,处理器从寄存器中读取目标地址并执行。例如,目前流行的处理器架构中(如ARM CPU),就采用这种方式。
其中,跳转目标地址可以为第一跳转指令中的第一函数地址。
在步骤S503中,跳转到第一函数。
在步骤S504中,恢复被保存的寄存器。
此时,保存了第一函数地址的寄存器已经完成跳转任务,不再使用,这时需要恢复之前保存的寄存器。
需要说明的是,本公开所有实施例在使用寄存器之前,均需保存被使用的寄存器,在使用完寄存器之后,均需恢复之前保存的寄存器。
另外,该实施例以R0寄存器(R0寄存器为ARM CPU的16个寄存器中的一个)为例进行描述,在实际应用中,可以采用其他方式跳转到第一函数。例如,其他架构的处理器(如x86)允许将目标地址直接写入到跳转指令中。这种情况下,不需要额外的寄存器来保存跳转地址。但是,它仍需要遵循寄存器的“保存-使用-恢复”原则,以保证数据不会丢失,从而保证数据的完整性和一致性。
在步骤S505中,将原方法的参数转换为第一方法的参数。
在该实施例中,通过第一函数将原方法的参数转换为第一方法的参数。
在步骤S506中,获取第一方法的入口,并跳转到第一方法。
在参数转换完成后,可以获取到第一方法的入口,从而可以跳转执行第一方法。
上述实施例,可以通过参数转换实现由原方法到第一方法的调用,由于第一方法中包含了升级后的新代码,因此,该实施例可以在不修改源代码的情况下实现系统升级。
图6是根据一示例性实施例示出的一种第三函数的工作流程图,如图6所示,该方法包括以下步骤:
在步骤S601中,恢复被占用的寄存器。
在步骤S602中,获取被覆盖代码的地址。
由于第二文件中包含被覆盖代码的地址,因此,在加载第二文件后,可以获取到被覆盖代码的地址。
在步骤S603中,根据该地址跳转执行被覆盖代码。
在该实施例中,当第二文件被加载后,使用第三函数代替第一函数,对数据信息进行修改。这样,被zygote fork出的软件,就不再实现方法替换。
当软件需要进行方法替换时,可以在自己的进程内再次执行一次替换,即用第一函数替换第三函数即可。
由于替换是在软件自己的进程内部完成,所以不会影响到其他进程。
上述实施例,通过根据被覆盖代码的地址跳转执行被覆盖代码,可以实现对第三方软件的兼容。
与前述系统升级方法实施例相对应,本公开还提供了系统升级装置实施例。
图7是根据一示例性实施例示出的一种系统升级装置的框图,如图7所示,系统升级装置包括:打补丁模块71、加载初始化模块72、修改模块73和转换备份模块74。
打补丁模块71被配置为对第一文件打补丁,以将原方法替换为第一方法,将原方法备份到第二方法中,生成数据信息,并将数据信息写入预先创建的第二文件中。
由于Android系统大部分采用java语言编写,而Java语音是一种解释型语言,运行java系统必须安装一个虚拟机软件。虚拟机软件读取字节码,并根据字节码的含义,执行不同的运算。在5.0以前的版本中,Android使用Dalvik虚拟机。从5.0开始,Android引入了一个名为ART的虚拟机。如图1B所示,在ART的执行过程中,将Dalvik字节码转换为指令代码,并存储在文件中,这种文件的格式,被ART称为OAT文件,即图1B中的boot.oat。
其中,OAT文件存储的是java的类(Class)信息以及方法的指令代码。一个使用java语言编写的软件,其程序由一组class组成,每个Class由若干个域(Field)和Method组成。Field用来定义数据。一个Field定义一条数据。Class内部的所有Field,定义了该Class所拥有的数据集合。而Class内部所有的Method共同操作这组数据集合。每个Class的每个Method的数据,都包含了该Method的指令数据的位置。由于本公开实施例不涉及Field,因此,下文将自动忽略Class内部的Field集合。
在该实施例中,第一文件是指ART生成的OAT文件,即图1B中的boot.oat,通过对第一文件打补丁,可以将原方法替换为第一方法,将原方法备份到第二方法中,并生成数据信息。
另外,需要创建第二文件,其中,第二文件是指图1B中的boot-proxy.img。如图1B所示,在对boot.oat打补丁之后,会产生两个文件即新的boot.oat和boot-proxy.img。然后由CPU同时加载这两个文件,并将这两个文件中的指令代码结合在一起执行。需要说明的是,新boot.oat和打补丁之前的boot.oat内容不同,相对于打补丁之前的boot.oat,新boot.oat内原方法入口处的代码已经被修改。
由于Android系统大部分采用java语言编写,而Java语言的最小执行单位是方法(Method)。因此,本实施例以方法为单位进行替换。其中,方法是一组程序代码的集合,该组程序代码能够接受一组输入数据作为参数,并返回计算结果。
加载初始化模块72被配置为加载第二文件,并初始化数据信息。
在Android系统中,所有软件的进程都是由Zygote进程孕育(fork)出来的。Zygote进程在系统启动时被创建出来,并且在系统运行过程中一直存在的进程,它是所有Android软件的管理进程。fork是Android系统创建新线程的方法。fork的含义是:根据当前进程,创建一个一模一样的新进程。当前进程被称为父进程,fork出来的进程被称为子进程。当子进程刚被fork出后,子进程和父进程共享所有的内存和数据;只有当子进程或者父进程改变自己的数据时,Android系统才会为它们各自复制一份独立的数据。这种机制被称为写时复制(CopyOnWrite)技术。当然,Android系统不会复制全部的数据,而是按照页(Page)为单位,复制那些被改变的数据,没有被改变的数据仍旧在子进程和父进程之间共享。Page的大小一般是4K。
当Zygote进程启动后,会加载boot.oat文件,但是boot.oat文件此时已经被修改,这时必须加载boot-proxy.img,否则会导致系统崩溃。
通过初始化数据信息,完成数据信息中函数地址的替换。
修改模块73被配置为对数据信息进行修改,以实现对第三方软件的兼容。
因为Zygote实现了函数替换,这个函数替换会在整个系统内生效,这就会影响到第三方的软件,为了实现对第三方软件的兼容,需要对数据信息进行修改。
转换备份模块74被配置为将对原方法的调用转换为对第一方法的调用,并通过第二方法调用备份的原方法。
在该实施例中,由于在原方法的入口处写入第一跳转指令,因此,可以通过第一跳转指令跳转到第一函数,并通过第一函数将原方法的参数转换为第一方法的参数,从而执行第一方法。
同样地,由于在第二方法的入口处写入第二跳转指令,因此,可以通过第二跳转指令跳转到第二函数,并通过第二函数将第二方法的参数转换为原方法的参数,以获取到备份的原方法的地址,并根据该地址跳转执行原方法。
如图7所示的装置用于实现上述如图1A所示的方法流程,涉及到的相关内容描述相同,此处不赘述。
上述系统升级装置实施例,通过对第一文件打补丁,使得系统启动时,可以完成方法替换,通过在系统启动后初始化数据信息,以及在软件启动时对数据信息进行修改,使得对原方法的调用转换为对第一方法的调用,并通过第二方法调用备份的原方法,从而在不修改源代码的情况下,实现兼容系统的升级,大大地节省了时间、减少了出错率以及提高了升级效率。
图8是根据一示例性实施例示出的另一种系统升级装置的框图,如图8所示,在上述图7所示实施例的基础上,打补丁模块71可包括:接收子模块711、获得备份子模块712、写入子模块713、获得写入子模块714和获得生成写入子模块715。
接收子模块711被配置为接收参数信息。
在该实施例中,参数信息可以包括:boot.oat的路径,Boot-proxy.img的路径,保存了原方法列表的文件:hooked-classes.txt以及Boot-proxy.img的加载地址。
获得备份子模块712被配置为根据参数信息从第一文件中获得原方法的入口地址,并将原方法入口处将要被覆盖的代码备份到第二文件中。
在该实施例中,可以根据boot.oat的路径从boot.oat中获得原方法的入口地址。
写入子模块713被配置为在原方法的入口处写入第一跳转指令,第一跳转指令用于跳转到第一函数,第一函数用于将原方法的参数转换为第一方法的参数。
第一跳转指令用于跳转到第一函数,第一函数用于将原方法的参数转换为第一方法的参数。
获得写入子模块714被配置为根据参数信息从第一文件中获得第二方法的入口地址,并在第二方法的入口处写入第二跳转指令,第二跳转指令用于跳转到第二函数,第二函数用于将第二方法的参数转换为原方法的参数。
获得生成写入子模块715被配置为根据参数信息从第一文件中获得第一方法的入口地址,生成数据信息,并将数据信息写入第二文件中。
在该实施例中,数据信息可以包括:第一函数的地址、第二函数的地址、第一方法的入口地址、第二方法的入口地址以及被覆盖代码的地址。
如图8所示的装置用于实现上述如图2A所示的方法流程,涉及到的相关内容描述相同,此处不赘述。
上述系统升级装置实施例,可以实现将原方法替换为第一方法,将原方法备份到第二方法中,生成数据信息,并将数据信息写入第二文件中,从而为后续实现方法调用转换提供了条件。
图9是根据一示例性实施例示出的另一种系统升级装置的框图,如图9所示,在上述图8所示实施例的基础上,参数信息包括第二文件的加载地址,加载初始化模块72可包括:加载子模块721、获取子模块722和替换子模块723。
加载子模块721被配置为根据加载地址,将第二文件加载到内存中的固定地址。
在该实施例中,可以获得第二文件的加载地址,并根据该加载地址将第二文件加载到内存中的固定地址。
获取子模块722被配置为获取第一跳转指令中的第一函数和第二跳转指令中的第二函数,并获取第一函数地址和第二函数地址。
在该实施例中,第一函数和第二函数被编译为一个动态库,当这个动态库被加载到内存后,动态库内的所有函数的地址都会被重新计算。因此,第一函数地址和第二函数地址只有在运行时才能确定,并且是从动态库中获取。
替换子模块723被配置为使用获取的第一函数地址替换数据信息中的第一函数地址,使用获取的第二函数地址替换数据信息中的第二函数地址。
如图9所示的装置用于实现上述如图3所示的方法流程,涉及到的相关内容描述相同,此处不赘述。
上述系统升级装置,通过一次初始化数据信息可以作用到所有软件进程,提高了初始化效率,从而为后续实现方法调用转换提供了条件。
图10是根据一示例性实施例示出的另一种系统升级装置的框图,如图10所示,在上述图9所示实施例的基础上,修改模块73可包括:获取子模块731和替换子模块732。
获取子模块731被配置为获取第三函数。
第三函数用于将第一方法的参数恢复为原方法的参数。
替换子模块732被配置为使用第三函数替换第一函数,以实现对第三方软件的兼容。
替换子模块732在所有安卓兼容程序例如米柚程序启动时执行。
如图10所示的装置用于实现上述如图4所示的方法流程,涉及到的相关内容描述相同,此处不赘述。
上述系统升级装置,使用第三函数替换第一函数,为实现对第三方软件的兼容提供了条件。
图11是根据一示例性实施例示出的另一种系统升级装置的框图,如图11所示,在上述图8或9所示实施例的基础上,转换备份模块74可以包括:
跳转转换执行子模块741被配置为通过第一跳转指令跳转到第一函数,通过第一函数将原方法的参数转换为第一方法的参数,以执行第一方法。
如图11所示的装置用于实现上述如图5所示的方法流程,涉及到的相关内容描述相同,此处不赘述。
上述系统升级装置,可以通过参数转换实现由原方法到第一方法的调用,由于第一方法中包含了升级后的新代码,因此,该实施例可以在不修改源代码的情况下实现系统升级。
图12是根据一示例性实施例示出的另一种系统升级装置的框图,如图12所示,在上述图8或9所示实施例的基础上,转换备份模块74可以包括:
跳转转换子模块742被配置为通过第二跳转指令跳转到第二函数,通过第二函数将第二方法的参数转换为原方法的参数,以获取到备份的原方法的地址。
执行子模块743被配置为根据地址跳转执行备份的原方法。
如图12所示的装置用于实现上述如图6所示的方法流程,涉及到的相关内容描述相同,此处不赘述。
上述系统升级装置,通过根据地址跳转执行备份的原方法,可以实现对第三方软件的兼容。
关于上述实施例中的装置,其中各个模块、子模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
图13是根据一示例性实施例示出的一种适用于系统升级装置的框图。例如,装置1300可以是移动电话,计算机,数字广播终端,消息收发设备,游戏控制台,平板设备,医疗设备,健身设备,个人数字助理,飞行器等。
参照图13,装置1300可以包括以下一个或多个组件:处理组件1302,存储器1304,电源组件1306,多媒体组件1308,音频组件1310,输入/输出(I/O)的接口1312,传感器组件1314,以及通信组件1316。
处理组件1302通常控制装置1300的整体操作,诸如与显示,电话呼叫,数据通信,相机操作和记录操作相关联的操作。处理元件1302可以包括一个或多个处理器1320来执行指令,以完成上述的方法的全部或部分步骤。此外,处理组件1302可以包括一个或多个模块,便于处理组件1302和其他组件之间的交互。例如,处理部件1302可以包括多媒体模块,以方便多媒体组件1308和处理组件1302之间的交互。
存储器1304被配置为存储各种类型的数据以支持在设备1300的操作。这些数据的示例包括用于在装置1300上操作的任何应用程序或方法的指令,联系人数据,电话簿数据,消息,图片,视频等。存储器1304可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。
电力组件1306为装置1300的各种组件提供电力。电力组件1306可以包括电源管理系统,一个或多个电源,及其他与为装置1300生成、管理和分配电力相关联的组件。
多媒体组件1308包括在所述装置1300和用户之间的提供一个输出接口的屏幕。在一些实施例中,屏幕可以包括液晶显示器(LCD)和触摸面板(TP)。如果屏幕包括触摸面板,屏幕可以被实现为触摸屏,以接收来自用户的输入信号。触摸面板包括一个或多个触摸传感器以感测触摸、滑动和触摸面板上的手势。所述触摸传感器可以不仅感测触摸或滑动动作的边界,而且还检测与所述触摸或滑动操作相关的持续时间和压力。在一些实施例中,多媒体组件1308包括一个前置摄像头和/或后置摄像头。当设备1300处于操作模式,如拍摄模式或视频模式时,前置摄像头和/或后置摄像头可以接收外部的多媒体数据。每个前置摄像头和后置摄像头可以是一个固定的光学透镜系统或具有焦距和光学变焦能力。
音频组件1310被配置为输出和/或输入音频信号。例如,音频组件1310包括一个麦克风(MIC),当装置1300处于操作模式,如呼叫模式、记录模式和语音识别模式时,麦克风被配置为接收外部音频信号。所接收的音频信号可以被进一步存储在存储器1304或经由通信组件1316发送。在一些实施例中,音频组件1310还包括一个扬声器,用于输出音频信号。
I/O接口1312为处理组件1302和外围接口模块之间提供接口,上述外围接口模块可以是键盘,点击轮,按钮等。这些按钮可包括但不限于:主页按钮、音量按钮、启动按钮和锁定按钮。
传感器组件1314包括一个或多个传感器,用于为装置1300提供各个方面的状态评估。例如,传感器组件1314可以检测到设备1300的打开/关闭状态,组件的相对定位,例如所述组件为装置1300的显示器和小键盘,传感器组件1314还可以检测装置1300或装置1300一个组件的位置改变,用户与装置1300接触的存在或不存在,装置1300方位或加速/减速和装置1300的温度变化。传感器组件1314可以包括接近传感器,被配置用来在没有任何的物理接触时检测附近物体的存在。传感器组件1314还可以包括光传感器,如CMOS或CCD图像传感器,用于在成像应用中使用。在一些实施例中,该传感器组件1314还可以包括加速度传感器,陀螺仪传感器,磁传感器,压力传感器或温度传感器。
通信组件1316被配置为便于装置1300和其他设备之间有线或无线方式的通信。装置1300可以接入基于通信标准的无线网络,如WiFi,2G或3G,或它们的组合。在一个示例性实施例中,通信部件1316经由广播信道接收来自外部广播管理系统的广播信号或广播相关信息。在一个示例性实施例中,所述通信部件1316还包括近场通信(NFC)模块,以促进短程通信。例如,在NFC模块可基于射频识别(RFID)技术,红外数据协会(IrDA)技术,超宽带(UWB)技术,蓝牙(BT)技术和其他技术来实现。
在示例性实施例中,装置1300可以被一个或多个应用专用集成电路(ASIC)、数字信号处理器(DSP)、数字信号处理设备(DSPD)、可编程逻辑器件(PLD)、现场可编程门阵列(FPGA)、控制器、微控制器、微处理器或其他电子元件实现,用于执行上述方法。
在示例性实施例中,还提供了一种包括指令的非临时性计算机可读存储介质,例如包括指令的存储器1304,上述指令可由装置1300的处理器1320执行以完成上述方法。例如,所述非临时性计算机可读存储介质可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
本领域技术人员在考虑说明书及实践这里公开的公开后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
Claims (11)
1.一种系统升级方法,其特征在于,所述方法包括:
对第一文件打补丁,以将原方法替换为第一方法,将所述原方法备份到第二方法中,生成数据信息,并将所述数据信息写入预先创建的第二文件中,所述数据信息包括:第一函数的地址、第二函数的地址、第一方法的入口地址、第二方法的入口地址以及被覆盖代码的地址;
加载所述第二文件,并初始化所述数据信息;
对所述数据信息进行修改,以实现对第三方软件的兼容;
将对所述原方法的调用转换为对所述第一方法的调用,并通过第二方法调用备份的所述原方法;
所述对第一文件打补丁,以将原方法替换为第一方法,将所述原方法备份到第二方法中,生成数据信息,并将所述数据信息写入预先创建的第二文件中,包括:
接收参数信息;
根据所述参数信息从所述第一文件中获得所述原方法的入口地址,并将所述原方法入口处将要被覆盖的代码备份到所述第二文件中;
在所述原方法的入口处写入第一跳转指令,所述第一跳转指令用于跳转到第一函数,所述第一函数用于将所述原方法的参数转换为所述第一方法的参数;
根据所述参数信息从所述第一文件中获得所述第二方法的入口地址,并在所述第二方法的入口处写入第二跳转指令,所述第二跳转指令用于跳转到第二函数,所述第二函数用于将所述第二方法的参数转换为所述原方法的参数;
根据所述参数信息从所述第一文件中获得所述第一方法的入口地址,生成数据信息,并将所述数据信息写入所述第二文件中。
2.根据权利要求1所述的系统升级方法,其特征在于,所述参数信息包括所述第二文件的加载地址,所述加载所述第二文件,初始化所述数据信息,包括:
根据所述加载地址,将所述第二文件加载到内存中的固定地址;
获取所述第一跳转指令中的第一函数和所述第二跳转指令中的第二函数,并获取第一函数地址和第二函数地址;
使用获取的所述第一函数地址替换所述数据信息中的第一函数地址,使用获取的所述第二函数地址替换所述数据信息中的第二函数地址。
3.根据权利要求2所述的系统升级方法,其特征在于,所述对所述数据信息进行修改,以实现对第三方软件的兼容,包括:
获取第三函数,所述第三函数用于将所述第一方法的参数恢复为所述原方法的参数;
使用所述第三函数替换所述第一函数,以实现对第三方软件的兼容。
4.根据权利要求1或2所述的系统升级方法,其特征在于,所述将对所述原方法的调用转换为对所述第一方法的调用,包括:
通过所述第一跳转指令跳转到第一函数,通过所述第一函数将所述原方法的参数转换为所述第一方法的参数,以执行所述第一方法。
5.根据权利要求1或2所述的系统升级方法,其特征在于,所述通过第二方法调用备份的所述原方法,包括:
通过所述第二跳转指令跳转到第二函数,通过所述第二函数将所述第二方法的参数转换为所述原方法的参数,以获取到备份的所述原方法的地址;
根据所述地址跳转执行备份的所述原方法。
6.一种系统升级装置,其特征在于,所述装置包括:
打补丁模块,被配置为对第一文件打补丁,以将原方法替换为第一方法,将所述原方法备份到第二方法中,生成数据信息,并将所述数据信息写入预先创建的第二文件中,所述数据信息包括:第一函数的地址、第二函数的地址、第一方法的入口地址、第二方法的入口地址以及被覆盖代码的地址;
加载初始化模块,被配置为加载所述第二文件,并初始化所述数据信息;
修改模块,被配置为对所述数据信息进行修改,以实现对第三方软件的兼容;
转换备份模块,被配置为将对所述原方法的调用转换为对所述第一方法的调用,并通过第二方法调用备份的所述原方法;
所述打补丁模块包括:
接收子模块,被配置为接收参数信息;
获得备份子模块,被配置为根据所述参数信息从所述第一文件中获得所述原方法的入口地址,并将所述原方法入口处将要被覆盖的代码备份到所述第二文件中;
写入子模块,被配置为在所述原方法的入口处写入第一跳转指令,所述第一跳转指令用于跳转到第一函数,所述第一函数用于将所述原方法的参数转换为所述第一方法的参数;
获得写入子模块,被配置为根据所述参数信息从所述第一文件中获得所述第二方法的入口地址,并在所述第二方法的入口处写入第二跳转指令,所述第二跳转指令用于跳转到第二函数,所述第二函数用于将所述第二方法的参数转换为所述原方法的参数;
获得生成写入子模块,被配置为根据所述参数信息从所述第一文件中获得所述第一方法的入口地址,生成数据信息,并将所述数据信息写入所述第二文件中。
7.根据权利要求6所述的系统升级装置,其特征在于,所述参数信息包括所述第二文件的加载地址,所述加载初始化模块包括:
加载子模块,被配置为根据所述加载地址,将所述第二文件加载到内存中的固定地址;
获取子模块,被配置为获取所述第一跳转指令中的第一函数和所述第二跳转指令中的第二函数,并获取第一函数地址和第二函数地址;
替换子模块,被配置为使用获取的所述第一函数地址替换所述数据信息中的第一函数地址,使用获取的所述第二函数地址替换所述数据信息中的第二函数地址。
8.根据权利要求7所述的系统升级装置,其特征在于,所述修改模块包括:
获取子模块,被配置为获取第三函数,所述第三函数用于将所述第一方法的参数恢复为所述原方法的参数;
替换子模块,被配置为使用所述第三函数替换所述第一函数,以实现对第三方软件的兼容。
9.根据权利要求6或7所述的系统升级装置,其特征在于,所述转换备份模块包括:
跳转转换执行子模块,被配置为通过所述第一跳转指令跳转到第一函数,通过所述第一函数将所述原方法的参数转换为所述第一方法的参数,以执行所述第一方法。
10.根据权利要求6或7所述的系统升级装置,其特征在于,所述转换备份模块包括:
跳转转换子模块,被配置为通过所述第二跳转指令跳转到第二函数,通过所述第二函数将所述第二方法的参数转换为所述原方法的参数,以获取到备份的所述原方法的地址;
执行子模块,被配置为根据所述地址跳转执行备份的所述原方法。
11.一种系统升级装置,其特征在于,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为:
对第一文件打补丁,以将原方法替换为第一方法,将所述原方法备份到第二方法中,生成数据信息,并将所述数据信息写入预先创建的第二文件中,所述数据信息包括:第一函数的地址、第二函数的地址、第一方法的入口地址、第二方法的入口地址以及被覆盖代码的地址;
加载所述第二文件,并初始化所述数据信息;
对所述数据信息进行修改,以实现对第三方软件的兼容;
将对所述原方法的调用转换为对所述第一方法的调用,并通过第二方法调用备份的所述原方法;
所述对第一文件打补丁,以将原方法替换为第一方法,将所述原方法备份到第二方法中,生成数据信息,并将所述数据信息写入预先创建的第二文件中,包括:
接收参数信息;
根据所述参数信息从所述第一文件中获得所述原方法的入口地址,并将所述原方法入口处将要被覆盖的代码备份到所述第二文件中;
在所述原方法的入口处写入第一跳转指令,所述第一跳转指令用于跳转到第一函数,所述第一函数用于将所述原方法的参数转换为所述第一方法的参数;
根据所述参数信息从所述第一文件中获得所述第二方法的入口地址,并在所述第二方法的入口处写入第二跳转指令,所述第二跳转指令用于跳转到第二函数,所述第二函数用于将所述第二方法的参数转换为所述原方法的参数;
根据所述参数信息从所述第一文件中获得所述第一方法的入口地址,生成数据信息,并将所述数据信息写入所述第二文件中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510825595.9A CN105468410B (zh) | 2015-11-24 | 2015-11-24 | 系统升级方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510825595.9A CN105468410B (zh) | 2015-11-24 | 2015-11-24 | 系统升级方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105468410A CN105468410A (zh) | 2016-04-06 |
CN105468410B true CN105468410B (zh) | 2019-02-12 |
Family
ID=55606148
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510825595.9A Active CN105468410B (zh) | 2015-11-24 | 2015-11-24 | 系统升级方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105468410B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107451474B (zh) * | 2016-05-31 | 2020-06-26 | 百度在线网络技术(北京)有限公司 | 用于终端的软件漏洞修复方法和装置 |
CN107783776B (zh) * | 2016-08-26 | 2021-10-15 | 斑马智行网络(香港)有限公司 | 固件升级包的处理方法及装置、电子设备 |
CN106445662B (zh) * | 2016-09-13 | 2019-09-10 | 广东欧珀移动通信有限公司 | 一种移植应用程序的方法及终端设备 |
CN107423093B (zh) * | 2017-07-21 | 2020-09-15 | 珠海市魅族科技有限公司 | 控制方法及装置、计算机装置和计算机可读存储介质 |
CN108446219B (zh) * | 2018-03-01 | 2021-07-13 | 网易宝有限公司 | 应用程序的操作方法、系统、介质和计算设备 |
CN110618824B (zh) * | 2018-06-20 | 2023-07-21 | 中移(杭州)信息技术有限公司 | 一种软件升级方法、装置、介质和设备 |
CN111290773B (zh) * | 2020-03-12 | 2024-01-19 | 深圳Tcl新技术有限公司 | 系统升级方法、设备及可读存储介质 |
CN112947986B (zh) * | 2020-09-29 | 2024-05-24 | 深圳市明源云科技有限公司 | 多版本代码签入控制方法、装置、客户端及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104239082A (zh) * | 2013-06-20 | 2014-12-24 | 上海博达数据通信有限公司 | 嵌入式系统的热补丁实现方法 |
CN104281443A (zh) * | 2013-07-12 | 2015-01-14 | 重庆重邮信科通信技术有限公司 | 利用tcm实现代码、数据替换的方法 |
CN104981778A (zh) * | 2013-02-22 | 2015-10-14 | 马维尔国际贸易有限公司 | 修补只读存储器的引导代码 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7310800B2 (en) * | 2001-02-28 | 2007-12-18 | Safenet, Inc. | Method and system for patching ROM code |
US7523299B2 (en) * | 2005-07-29 | 2009-04-21 | Broadcom Corporation | Method and system for modifying operation of ROM based boot code of a network adapter chip |
-
2015
- 2015-11-24 CN CN201510825595.9A patent/CN105468410B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104981778A (zh) * | 2013-02-22 | 2015-10-14 | 马维尔国际贸易有限公司 | 修补只读存储器的引导代码 |
CN104239082A (zh) * | 2013-06-20 | 2014-12-24 | 上海博达数据通信有限公司 | 嵌入式系统的热补丁实现方法 |
CN104281443A (zh) * | 2013-07-12 | 2015-01-14 | 重庆重邮信科通信技术有限公司 | 利用tcm实现代码、数据替换的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN105468410A (zh) | 2016-04-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105468410B (zh) | 系统升级方法及装置 | |
EP2945058B1 (en) | Processing method and device for application program | |
KR102470275B1 (ko) | 음성 제어 방법 및 전자 장치 | |
CN109101352B (zh) | 图像处理算法架构、算法调用方法、装置、存储介质及移动终端 | |
CN104281478B (zh) | 更新应用程序的方法及装置 | |
JP6259122B2 (ja) | ファームウェアアップグレード方法、装置、プログラム及び記録媒体 | |
KR102400384B1 (ko) | 외장 메모리를 구비하는 전자장치 및 그 동작 방법 | |
CN107967141A (zh) | 操作系统升级方法、装置及终端 | |
CN110262818A (zh) | Java代码热更新方法、装置、电子设备及存储介质 | |
CN106528255B (zh) | 类加载方法及装置 | |
CN105335200B (zh) | 系统升级方法及装置 | |
US20180196584A1 (en) | Execution of multiple applications on a device | |
CN115328563B (zh) | 系统启动方法及电子设备 | |
EP4271124A1 (en) | Switch module in a dual sim terminal | |
CN113867848A (zh) | 图形接口的调用方法、装置、设备及可读存储介质 | |
CN109725943B (zh) | 一种程序跳转方法、装置、电子设备及存储介质 | |
Dongre et al. | A Research On Android Technology With New Version Naugat (7.0, 7.1) | |
CN113656089B (zh) | 应用程序中的类验证方法和装置 | |
KR102188685B1 (ko) | 애플리케이션 패키지를 생성하는 장치 및 방법 | |
WO2022111664A1 (zh) | 打补丁的方法、相关设备及系统 | |
CN115827076A (zh) | 操作系统引导启动方法、设备、存储介质及程序产品 | |
CN113885928B (zh) | 程序更新方法和电子设备 | |
CN110569037A (zh) | 数据写入的方法和装置 | |
CN116743908B (zh) | 壁纸显示方法及相关装置 | |
CN109933357A (zh) | 应用程序升级方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |