本发明涉及计算机
技术领域:
:,特别涉及一种基于安卓平台的局部代码补丁更新方法及装置。
背景技术:
::现有技术中,在安卓(Android)系统中,只有在预知要更新的代码区域的情况下,才能将待更新的代码放在子Dex文件中实现,主Dex文件里使用反射调用的方式去调用所有待更新的代码,是当前使用的局部代码更新方式,其中主Dex文件是指APK(AndroidPackage,安卓安装包)文件中的classes.dex文件。当子Dex文件中的代码有新的版本时,就动态更新替换子Dex文件。但在以上现有技术中存在以下缺陷:1、须在开发代码前,预知将来需要更新的代码片段,然后将与更新相关的代码写到子Dex文件中,这种预知很困难;2、主Dex文件调用子Dex文件中的代码,只能使用反射调用的方式去执行,执行方式受限;3、主Dex文件中的代码无法实现局部更新。技术实现要素:有鉴于此,本发明提供一种基于安卓平台的局部代码补丁方法及装置,通过改变子可执行文件中的类与主可执行文件中的类的搜索顺序,改变了子可执行文件中代码的执行方式,并实现了主可执行文件中代码的局部更新,并且无需在开发代码前预知将来需要更新的代码片段,从而可提高代 码更新的灵活性及便捷性。本发明实施例提供一种基于安卓平台的局部代码补丁更新方法,应用于移动终端,包括:启动目标程序,将用于局部代码更新的子可执行文件中的各个目标类配置为优先于所述目标程序的安装包中的主可执行文件中的各个类被加载;加载内存补丁文件,以屏蔽因同一个类存在于多个可执行文件而导致的程序运行错误;重新启动所述目标程序,加载所述子可执行文件中的各个目标类,以及加载所述主可执行文件中除所述目标类之外的其他类。本发明实施例提供一种基于安卓平台的局部代码补丁更新装置,运行于移动终端,包括:启动模块,用于启动目标程序;配置模块,用于将用于局部代码更新的子可执行文件中的各个目标类配置为优先于所述目标程序的安装包中的主可执行文件中的各个类被加载;补丁模块,用于加载内存补丁文件,以屏蔽因同一个类存在于多个可执行文件而导致的程序运行错误;所述启动模块,还用于重新启动所述目标程序;加载模块,用于加载所述子可执行文件中的各个目标类,以及加载所述主可执行文件中除所述目标类之外的其他类。根据上述实施例中的基于安卓平台的局部代码补丁更新方法及装置,通过将用于局部代码更新的子可执行文件中的各个目标类配置为优先于所述目标程序的安装包中的主可执行文件中的各个类被加载,并加载用于屏蔽因同一个类存在于多个可执行文件而导致的程序运行错误的内存补丁代码,使得子可执行文件中的类可优先于主可执行文件中的类被搜索,相较于现有技术,本发明改变了子可执行文件中代码的执行方式,并实现了主可执行文件中代码的局部更新,并且无需在开发代码前预知将来需要更新的代码片段,从而可提高代码更新的灵活性及便捷性。为让本发明的上述和其他目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附图式,作详细说明如下。附图说明图1示出了一种移动终端结构框图;图2为本发明第一实施例中的基于安卓平台的局部代码补丁更新方法的流程示意图;图3为本发明第二实施例中的基于安卓平台的局部代码补丁更新方法的流程示意图;图4为本发明第三实施例中的基于安卓平台的局部代码补丁更新装置的结构示意图;图5为本发明第四实施例中的基于安卓平台的局部代码补丁更新装置的结构示意图。具体实施方式为更进一步阐述本发明为实现预定发明目的所采取的技术手段及功效,以下结合附图及较佳实施例,对依据本发明的具体实施方式、结构、特征及其功效,详细说明如后。请参阅图1,图1为一种移动终端设备结构示意图。移动终端包括存储器102、存储控制器104,一个或多个(图中仅示出一个)处理器106、外设接口108、射频模块110、定位模块112、摄像模块114、音频模块116、触控屏幕118以及按键模块120。这些组件通过一条或多条通讯总线/信号线122相互通讯。可以理解,图1所示的结构仅为示意,移动终端还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。图1中所示的各组件可以采用硬件、软件或其组合实现存储器102可用于存储软件程序以及模块,如本发明实施例中的在终端设备内基于安卓平台的局部代码补丁更新方法及装置对应的程序指令/模 块,处理器106通过运行存储在存储器102内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述基于安卓平台的局部代码补丁更新方法。存储器102可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器102可进一步包括相对于处理器106远程设置的存储器,这些远程存储器可以通过网络连接至移动终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。处理器106以及其他可能的组件对存储器102的访问可在存储控制器104的控制下进行。外设接口108将各种输入/输入装置耦合至CPU以及存储器102。处理器106运行存储器102内的各种软件、指令以执行移动终端的各种功能以及进行数据处理。在一些实施例中,外设接口108,处理器106以及存储控制器104可以在单个芯片中实现。在其他一些实例中,他们可以分别由独立的芯片实现。射频模块110用于接收以及发送电磁波,实现电磁波与电信号的相互转换,从而与通讯网络或者其他设备进行通讯。射频模块110可包括各种现有的用于执行这些功能的电路元件,例如,天线、射频收发器、数字信号处理器、加密/解密芯片、用户身份模块(SIM)卡、存储器等等。射频模块110可与各种网络如互联网、企业内部网、无线网络进行通讯或者通过无线网络与其他设备进行通讯。上述的无线网络可包括蜂窝式电话网、无线局域网或者城域网。上述的无线网络可以使用各种通信标准、协议及技术,包括但并不限于全球移动通信系统(GlobalSystemforMobileCommunication,GSM)、增强型移动通信技术(EnhancedDataGSMEnvironment,EDGE),宽带码分多址技术(widebandcodedivisionmultipleaccess,W-CDMA),码分多址技术(Codedivisionaccess,CDMA)、时分多址技术(timedivisionmultipleaccess,TDMA),蓝牙,无线保真技术(Wireless, Fidelity,WiFi)(如美国电气和电子工程师协会标准IEEE802.11a,IEEE802.11b,IEEE802.11g和/或IEEE802.11n)、网络电话(Voiceoverinternetprotocal,VoIP)、全球微波互联接入(WorldwideInteroperabilityforMicrowaveAccess,Wi-Max)、其他用于邮件、即时通讯及短消息的协议,以及任何其他合适的通讯协议,甚至可包括那些当前仍未被开发出来的协议。定位模块112用于获取移动终端终端的当前位置。定位模块112的实例包括但不限于全球卫星定位系统(GPS)、基于无线局域网或者移动通信网的定位技术。摄像模块114用于拍摄照片或者视频。拍摄的照片或者视频可以存储至存储器102内,并可通过射频模块110发送。音频模块116向用户提供音频接口,其可包括一个或多个麦克风、一个或者多个扬声器以及音频电路。音频电路从外设接口108处接收声音数据,将声音数据转换为电信息,将电信息传输至扬声器。扬声器将电信息转换为人耳能听到的声波。音频电路还从麦克风处接收电信息,将电信号转换为声音数据,并将声音数据传输至外设接口108中以进行进一步的处理。音频数据可以从存储器102处或者通过射频模块110获取。此外,音频数据也可以存储至存储器102中或者通过射频模块110进行发送。在一些实例中,音频模块116还可包括一个耳机播孔,用于向耳机或者其他设备提供音频接口。触控屏幕118在移动终端与用户之间同时提供一个输出及输入界面。具体地,触控屏幕118向用户显示视频输出,这些视频输出的内容可包括文字、图形、视频、及其任意组合。一些输出结果是对应于一些用户界面对象。触控屏幕118还接收用户的输入,例如用户的点击、滑动等手势操作,以便用户界面对象对这些用户的输入做出响应。检测用户输入的技术可以是基于电阻式、电容式或者其他任意可能的触控检测技术。触控屏幕118显示单元的具体实例包括但并不限于液晶显示器或发光聚合物显示器。按键模块120同样提供用户向移动终端进行输入的接口,用户可以通过按下不同的按键以使移动终端执行不同的功能。参见图2,本发明第一实施例提供了一种基于安卓平台的局部代码补丁更新方法,该方法包括:步骤S101、启动目标程序,将用于局部代码更新的子可执行文件中的各个目标类配置为优先于该目标程序的安装包中的主可执行文件中的各个类被加载;目标程序(Application,App)的安装包,即目标程序的Android安装包APK,通过将APK文件直接传到Android模拟器或Android手机中执行即可完成目标程序的安装。可执行文件包括Dex文件,即DalvikExecutable,Dalvik虚拟机可执行文件。一个APK至少由Dex文件、资源文件以及AndroidManifest.xml文件组合而成。一个应用程序的所有代码都以类为载体包含在Dex文件中。子Dex文件用于对主Dex文件进行局部代码更新,其中包含了主Dex文件中需要更新的局部代码。主Dex文件的类名可以为classes.dex。可在启动目标APP后,通过例如:修改主Dex文件中的路径列表(pathList)、hookdefineClassNative或hookdefineClassNative的上下层函数调用等方式,将子Dex文件中的各个目标类配置为优先于主Dex文件中的各个类被加载,从而使得当子Dex文件与主Dex文件中包含相同的类时,目标App只加载子Dex文件中的相同的类,如此可达到利用子Dex文件对主Dex文件中的代码进行局部更新的目的。上述作为补丁的局部代码生效的原理是:Android系统中,在加载一个未存在的类之前,需要寻找该类的实现代码所在的位置,这个寻找的过程是有先后顺序的,找到了包含该类的dex代码后,就不会再继续寻找了。所以,只需要让子dex文件中的类A在主dex文件中的类A之前先被找到,就能达到该目的。而寻找的顺序及寻找的位置都是由当前代码的pathList 决定的,所以只需要将子Dex文件中的pathList中的所有元素插入到主Dex文件中的pathList中的原有元素的最前面就可以了。S102、加载内存补丁文件,以屏蔽因同一个类存在于多个可执行文件而导致的程序运行错误。Android系统dalvik模式中不允许同一个类在多个Dex文件中出现,否则就会出现错误。通过加载预置的内存补丁文件,修改内存中用于检测类是否符合上述规则的代码,从而屏蔽因同一个类存在于多个可执行文件而导致的程序运行错误,确保目标程序可被正常运行。具体地,该内存补丁文件的功能可基于hook函数,或者通过其他修改用于执行上述规则检测的检测代码中的比较汇编指令的方式实现。S103、重新启动该目标程序,加载该子可执行文件中的各个目标类,以及加载该主可执行文件中除该目标类之外的其他类。目标程序在重新启动后,若检测到该子Dex文件的存在,则加载该子Dex文件,然后再加载主Dex文件,若主Dex文件与子Dex文件中存在相同的类,则只加载子Dex文件中的该相同的类而不加载主Dex文件中的该相同的类,从而实现主Dex文件的局部代码更新。本发明实施例中,通过将用于局部代码更新的子可执行文件中的各个目标类配置为优先于所述目标程序的安装包中的主可执行文件中的各个类被加载,并加载用于屏蔽因同一个类存在于多个可执行文件而导致的程序运行错误的内存补丁代码,使得子可执行文件中的类可优先于主可执行文件中的类被搜索,相较于现有技术,本发明改变了子可执行文件中代码的执行方式,并实现了主可执行文件中代码的局部更新,并且无需在开发代码前预知将来需要更新的代码片段,从而可提高代码更新的灵活性及便捷性。参见图3,本发明第二实施例提供了一种基于安卓平台的局部代码补丁更新方法,该方法包括:步骤S201、启动目标程序,将子可执行文件中的路径列表中的所有元素插入主可执行文件中的路径列表的首位,使得当该子可执行文件与该主可执行文件中包含相同的类时,该目标程序只加载该子可执行文件中的该相同的类;目标程序(Application,App)的安装包,即目标程序的Android安装包APK,通过将APK文件直接传到Android模拟器或Android手机中执行即可完成目标程序的安装。可执行文件包括Dex文件,即DalvikExecutable,Dalvik虚拟机可执行文件。一个APK至少由Dex文件、资源文件以及AndroidManifest.xml文件组合而成。一个应用程序的所有代码都以类为载体包含在Dex文件中。子Dex文件用于对主Dex文件进行局部代码更新,其中包含了主Dex文件中需要更新的局部代码。主Dex文件的类名可以为classes.dex。具体地,将用于局部代码更新的子Dex文件中的路径列表(pathList)中的所有元素插入目标程序的APK中的主Dex文件中的pathList的首位,可使得当该子Dex文件与主Dex文件中包含相同的类时,该目标程序只加载该子Dex文件中的该相同的类。举例来说,若子Dex文件与主Dex文件中均包含了某个类A,则在执行完步骤S201和S202之后,移动终端中的目标APP重新启动,当检测到存在子Dex文件时,加载该子Dex文件,然后当加载类A时,如果在主Dex文件与子Dex文件中都发现了类A,则只加载子Dex文件中的类A,以使作为补丁的局部代码生效。上述作为补丁的局部代码生效的原理是:Android系统中,在加载一个未存在的类之前,需要寻找该类的实现代码所在的位置,这个寻找的过程是有先后顺序的,找到了包含该类的dex代码后,就不会再继续寻找了。所以,只需要让子dex文件中的类A在主dex文件中的类A之前先被找到,就能达到该目的。而寻找的顺序及寻找的位置都是由当前代码的pathList决定的,所以只需要将子Dex文件中的pathList中的所有元素插入到主Dex 文件中的pathList中的原有元素的最前面就可以了。进一步地,将用于局部代码更新的子Dex文件中的pathList中的所有元素插入目标程序的APK中的主Dex文件中的pathList的首位具体可包括以下步骤:S2011、通过该目标程序中的AndroidManifest.xml中的Application类的attachBaseContext判断是否存在该子可执行文件;AndroidManifest.xml是每个Android程序中必须具有的文件,它位于整个项目的根目录,描述了安装包(package)中暴露的组件(如activities、services等等),这些组件各自的实现类、各种能被处理的数据和启动位置。每一个AndroidManifest.xml中必须含有一个Application标签,这个标签声明了每一个应用程序的组件及其属性,如icon、label、permission等等。利用Application类的attachBaseContext可以判断是否存在用于局部代码更新的子Dex文件。S2012、若存在该子可执行文件,则获取该子可执行文件的类加载器文件;若存在用于局部代码更新的子Dex文件,则利用DexClassLoader(Android中用于加载Dex文件的类加载器)加载该子Dex文件,得到该子De文件的类加载器文件ClassLoader,并取名dLoader。S2013、获取该主可执行文件的类加载器文件;主Dex文件的类加载器文件,即classes.dex的ClassLoader,并将其取名curLoader。S2014、将该子可执行文件的类加载器文件中的链表成员的所有元素与该主可执行文件的类加载器文件中的链表成员的所有元素合并,并生产新的链表成员,该子可执行文件的类加载器文件中的链表成员的所有元素在该新的链表成员中,位于该主可执行文件的类加载器文件中的链表成员的所有元素之前;将dLoader与curLoader里的链表成员dexElements的所有元素合并成一个新的链表new_Elements,并使得在新的链表new_Elements中,dLoader里的链表成员dexElements中的所有元素排在curLoader里的链表成员dexElements中的所有元素的前面。其中dexElements、new_Elements与pathList含义相同,只是pathList为类型,dexElements、new_Elements为变量名称。S2015、使用该新的链表成员替换该主可执行文件的类加载器文件中的链表成员。使用new_Elements替换curLoader里的dexElements。需要说明的是,让子Dex文件优先执行的方法除了上述修改dexElements成员以外,还可以包括:通过hookdefineClassNative或hookdefineClassNative的上下层函数调用,如:defineClass、loadClassBinaryName、ClassLinker::DefineClass,在目标App启动后需要加载主Dex文件中的类时,替换传入的主Dex文件的ClassLoader参数为子Dex文件的DexClassLoader参数,使得目标App先在子Dex文件中查找目标类并予以加载;若子Dex文件中无法找到目标类,则再替换回主Dex文件的ClassLoader参数继续寻找,从而达到子Dex文件中的类优先得到执行机会的目的。S202、加载内存补丁文件,以屏蔽因同一个类存在于多个可执行文件而导致的程序运行错误;Android系统dalvik模式中不允许同一个类在多个Dex文件中出现,否则就会出现错误。通过加载预置的内存补丁文件,修改内存中用于检测类是否符合上述规则的代码,从而屏蔽因同一个类存在于多个可执行文件而导致的程序运行错误,确保目标程序可被正常运行。作为本发明的一个实施例,上述内存补丁可基于hook函数生成,即使得目标程序在启动后,当检测到同一个类存在于多个可执行文件时,通过预置的hook函数代替原检测函数,返回真(TURE)值。原检测函数例如: dvmResolvClass函数或CheckSuperClassChange函数具体地,该内存补丁文件可包括以下代码:需要说明的是,内存补丁文件除了hook函数以外,其功能还可以通过 其他修改用于执行上述规则检测的检测代码中的比较汇编指令的方式实现,如其他可修改if-else(条件-结果)语句的方式,使得该检测代码总是返回TRUE值,从而达到最终屏蔽因同一个类存在于多个可执行文件而导致的程序运行错误,确保目标程序可被正常运行的目的。S203、重新启动该目标程序,加载该子可执行文件中的各个目标类,以及加载该主可执行文件中除该目标类之外的其他类。当发现主Dex文件包含的代码中某部分需要更新时,将新版本中发生改动的类单独编译成子Dex文件下发到移动终端中。目标程序在重新启动后,若检测到该子Dex文件的存在,则加载该子Dex文件,然后再加载主Dex文件,若主Dex文件与子Dex文件中存在相同的类,则只加载子Dex文件中的该相同的类而不加载主Dex文件中的该相同的类,从而实现主Dex文件的局部代码更新。本发明实施例中,通过将用于局部代码更新的子可执行文件中的路径列表中的所有元素插入该目标程序的安装包中的主可执行文件中的路径列表的首位,并加载用于屏蔽因同一个类存在于多个可执行文件而导致的程序运行错误的内存补丁代码,使得子可执行文件中的类可优先于主可执行文件中的类被搜索,相较于现有技术,本发明改变了子可执行文件中代码的执行方式,并实现了主可执行文件中代码的局部更新,并且无需在开发代码前预知将来需要更新的代码片段,从而可提高代码更新的灵活性及便捷性。参见图4,本发明第三实施例提供了一种基于安卓平台的局部代码补丁更新装置,该装置可设置于图1所示移动终端中,该装置包括:启动模块31,用于启动目标程序;配置模块32,用于将用于局部代码更新的子可执行文件中的各个目标类配置为优先于所述目标程序的安装包中的主可执行文件中的各个类被加载;补丁模块33,用于加载内存补丁文件,以屏蔽因同一个类存在于多个可执行文件而导致的程序运行错误;启动模块31,还用于重新启动所述目标程序;加载模块34,用于加载所述子可执行文件中的各个目标类,以及加载所述主可执行文件中除所述目标类之外的其他类。关于本实施例的装置中各模块实现技术方案的其他细节,可参考第一实施例中的描述,在此不再重复。本发明实施例中,通过将用于局部代码更新的子可执行文件中的各个目标类配置为优先于所述目标程序的安装包中的主可执行文件中的各个类被加载,并加载用于屏蔽因同一个类存在于多个可执行文件而导致的程序运行错误的内存补丁代码,使得子可执行文件中的类可优先于主可执行文件中的类被搜索,相较于现有技术,本发明改变了子可执行文件中代码的执行方式,并实现了主可执行文件中代码的局部更新,并且无需在开发代码前预知将来需要更新的代码片段,从而可提高代码更新的灵活性及便捷性。参见图5,本发明第四实施例提供了一种基于安卓平台的局部代码补丁更新装置,该装置可设置于图1所示移动终端中,该装置包括:启动模块41,用于启动目标程序;配置模块42,用于将用于局部代码更新的子可执行文件中的各个目标类配置为优先于所述目标程序的安装包中的主可执行文件中的各个类被加载;补丁模块43,用于加载内存补丁文件,以屏蔽因同一个类存在于多个可执行文件而导致的程序运行错误;启动模块41,还用于重新启动所述目标程序;加载模块44,用于加载所述子可执行文件中的各个目标类,以及加载所述主可执行文件中除所述目标类之外的其他类。进一步地,配置模块42,还用于将所述子可执行文件中的路径列表中的所有元素插入所述主可执行文件中的路径列表的首位,使得当所述子可执行文件与所述主可执行文件中包含相同的类时,所述目标程序只加载所述子可执行文件中的所述相同的类。进一步地,配置模块42包括:判断模块421,用于通过所述目标程序中的AndroidManifest.xml中的Application类的attachBaseContext判断是否存在所述子可执行文件;获取模块422,用于若存在所述子可执行文件,则获取所述子可执行文件的类加载器文件,以及获取所述主可执行文件的类加载器文件;合并模块423,用于将所述子可执行文件的类加载器文件中的链表成员的所有元素与所述主可执行文件的类加载器文件中的链表成员的所有元素合并,并生产新的链表成员,所述子可执行文件的类加载器文件中的链表成员的所有元素在所述新的链表成员中,位于所述主可执行文件的类加载器文件中的链表成员的所有元素之前;替换模块424,用于使用所述新的链表成员替换所述主可执行文件的类加载器文件中的链表成员。进一步地,所述内存补丁文件基于hook函数生成,所述装置还包括:检测模块45,用于检测所述子可执行文件和所述主可执行文件中是否存在相同的类,并当检测到所述子可执行文件和所述主可执行文件中存在相同的类时,通过预置的hook函数返回真值。进一步地,配置模块42还用于通过hookdefineClassNative或hookdefineClassNative的上下层函数调用,如:defineClass、loadClassBinaryName、ClassLinker::DefineClass,在目标App启动后需要加载主Dex文件中的类时,替换传入的主Dex文件的ClassLoader参数为子Dex文件的DexClassLoader参数,使得目标App先在子Dex文件中查找目标类并予以加载;若子Dex文件中无法找到目标类,则再替换回主Dex文件的ClassLoader参数继续寻 找,从而达到子Dex文件中的类优先得到执行机会的目的。进一步地,补丁模块43,还用于加载内存补丁文件,通过该内存补丁文件修改检测代码中的条件-结果(if-else)语句,使得该检测代码不论检测到该子可执行文件和该主可执行文件中是否存在相同的类,均返回真值。关于本实施例的装置中各模块实现技术方案的其他细节,可参考第一与第二实施例中的描述,在此不再重复。本发明实施例中,通过将用于局部代码更新的子可执行文件中的路径列表中的所有元素插入该目标程序的安装包中的主可执行文件中的路径列表的首位,并加载用于屏蔽因同一个类存在于多个可执行文件而导致的程序运行错误的内存补丁代码,使得子可执行文件中的类可优先于主可执行文件中的类被搜索,相较于现有技术,本发明改变了子可执行文件中代码的执行方式,并实现了主可执行文件中代码的局部更新,并且无需在开发代码前预知将来需要更新的代码片段,从而可提高代码更新的灵活性及便捷性。此外,本发明实施例还提供一种计算机可读存储介质,其内存储有计算机可执行指令,上述的计算机可读存储介质例如为非易失性存储器例如光盘、硬盘、或者闪存。上述的计算机可执行指令用于让计算机或者类似的运算装置完成上述的基于安卓平台的局部代码补丁更新方法中的各种操作。以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭示如上,然而并非用以限定本发明,任何本领域技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容做出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。当前第1页1 2 3 当前第1页1 2 3