CN106708550B - 一种共享对象库加载的方法及装置 - Google Patents
一种共享对象库加载的方法及装置 Download PDFInfo
- Publication number
- CN106708550B CN106708550B CN201510789797.2A CN201510789797A CN106708550B CN 106708550 B CN106708550 B CN 106708550B CN 201510789797 A CN201510789797 A CN 201510789797A CN 106708550 B CN106708550 B CN 106708550B
- Authority
- CN
- China
- Prior art keywords
- file
- library
- loading
- reason
- failure
- 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
Images
Landscapes
- Stored Programmes (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种共享对象(SO)库加载的方法及装置,其中方法包括:确定SO库加载失败的原因;依据SO库加载失败的原因选择以下加载方式之一加载SO库:释放并重新安装包含所述SO库的安装包;使用全路径的方式或者使用文件加载的方式加载SO库;使用文件锁的方式保证仅多个进程之一加载SO库。通过本发明提供的SO库加载的方法及装置,可以基于SO库自身的调用逻辑对可能导致SO库加载失败的难以捕捉的原因进行排查,并依据SO库加载失败的原因选择多个加载方式之一加载SO库,从而保证了SO库尽量加载成功。
Description
【技术领域】
本发明涉及计算机技术领域,尤其涉及一种共享对象库加载的方法及装置。
【背景技术】
在安卓(Android)开发中,可以通过Java本地接口(Java Native Interface,缩写成JNI)的方式来调用和访问用C/C++实现的代码,这些代码以共享对象(SharedObject,缩写成SO)文件的方式存在于共享对象库,即SO库中。
当Java层在调用本地(Native)层时,有时会存在在预加载的SO库中没有找到要调用的SO文件而导致加载失败的情况,虽然是低概率事件,但一旦加载失败则会导致整个应用崩溃。
现有技术中当通过JNI接口加载SO库中的例如以“lib*.SO”表示的SO文件时,如果加载不成功,则会采用异常处理try-catch的方式的跳到异常处理部分。
其中try-catch中的try可以保证程序的正常运行,其用于捕获程序的异常,而catch则用于输出为什么出错。
采用try-catch的具体方式为:在try-catch的执行过程中,首先逐个从上到下执行try块中的语句,如果没有发生异常,则执行完try块后跳过catch块。如果try块中某条语句存在异常,则跳到相对应的catch块中,执行完该catch块中的语句,然后跳过其它的catch块,接着往下走,其语句后面通常跟着语句finally,以提供一个统一的出口。
例如执行下面的try-catch:
try{
int i=1/0;
}catch(Exception e){
........
}
如果try块中计算“int i=1/0”除数为0,则跳到相对应的catch块中“Exceptione”而报错,如果没有try的话,程序直接崩溃。用try的话,则可以让程序运行下去,并且输出为什么出错。
现有技术中通过使用try-catch的方式,虽然可以在SO库加载失败时提示加载错误,但其仅能够发现问题,并不能帮助有效的加载SO库。
【发明内容】
本发明的解决方案主要是保证能成功加载SO库,确保上层Java层调用本地Native层正常。具体为:
本发明提供了一种SO库加载的方法和装置,。
具体技术方案如下:
一种共享对象SO库加载的方法,所述方法包括:
确定SO库加载失败的原因;
依据SO库加载失败的原因选择以下加载方式之一加载SO库:
释放并重新安装包含所述SO库的安装包;
使用全路径的方式或者使用文件加载的方式加载SO库;
使用文件锁的方式保证仅多个进程之一加载SO库。
根据本发明一优选实施例,如果确定SO库加载失败的原因是所述SO库中的SO文件不存在、SO文件不完整、或者SO文件被篡改,则选择所述释放并重新安装包含所述SO库的安装包的方式加载SO库。
根据本发明一优选实施例,确定SO库加载失败的原因为SO文件不完整的方式包括:解析SO库安装包,将加载的当前目录下的SO文件的文件大小与所述解析SO库安装包中解析出的SO文件的文件大小进行比较,如果加载的SO文件的文件大小与安装包中的SO文件的文件大小不一致,则确定SO库加载失败的原因是SO文件不完整。
根据本发明一优选实施例,确定SO库加载失败的原因为SO文件被篡改的方式包括:将加载的当前目录下的SO文件的更新时间与安装SO库安装包的安装时间进行比较,如果更新时间和安装时间不一致,则确定SO库加载失败的原因是SO文件被篡改。
根据本发明一优选实施例,如果确定SO库加载失败的原因是找不到SO库中SO文件的目录,则选择所述使用全路径的方式或者使用文件加载的方式加载SO库。
根据本发明一优选实施例,所述使用全路径的方式具体包括:通过调用定义了SO文件的全路径名参数的System.load函数来寻找SO文件目录。
根据本发明一优选实施例,所述使用文件加载的具体方式包括:通过调用定义了SO文件的文件名参数的System.loadLibrary函数来寻找SO文件目录。
根据本发明一优选实施例,如果确定SO库加载失败的原因是多进程加载SO库导致的加载冲突,则选择所述使用文件锁的方式保证仅多个进程之一加载SO库。
根据本发明一优选实施例,所述使用文件锁的方式具体包括:当多个进程之一加载SO库并对所述SO库中的SO文件执行写操作时,使用文件锁对执行写操作的所述SO文件加锁,当所述写操作结束后释放文件锁。
根据本发明一优选实施例,在执行所述选择以下加载方式之一加载SO库后,如果加载仍然失败,则转至执行所述确定SO库加载失败的原因的操作。
一种SO库加载的装置,所述装置包括:
确定单元,用于确定SO库加载失败的原因;
加载单元,用于依据SO库加载失败的原因选择以下加载方式之一加载SO库:
释放并重新安装包含所述SO库的安装包;
使用全路径的方式或者使用文件加载的方式加载SO库;
使用文件锁的方式保证仅多个进程之一加载SO库。
根据本发明一优选实施例,如果所述确定单元确定SO库加载失败的原因是所述SO库中的SO文件不存在、SO文件不完整、或者SO文件被篡改,则所述加载单元选择所述释放并重新安装包含所述SO库的安装包的方式加载SO库。
根据本发明一优选实施例,所述确定单元确定SO库加载失败的原因为SO文件不完整的方式包括:解析SO库安装包,将加载的当前目录下的SO文件的文件大小与所述解析SO库安装包中解析出的SO文件的文件大小进行比较,如果加载的SO文件的文件大小与安装包中的SO文件的文件大小不一致,则确定SO库加载失败的原因是SO文件不完整。
根据本发明一优选实施例,所述确定单元确定SO库加载失败的原因为SO文件被篡改的方式包括:将加载的当前目录下的SO文件的更新时间与安装SO库安装包的安装时间进行比较,如果更新时间和安装时间不一致,则确定SO库加载失败的原因是SO文件被篡改。
根据本发明一优选实施例,如果所述确定单元确定SO库加载失败的原因是找不到SO库中SO文件的目录,则加载单元选择所述使用全路径的方式或者使用文件加载的方式加载SO库。
根据本发明一优选实施例,所述使用全路径的方式具体包括:通过调用定义了SO文件的全路径名参数的System.load函数来寻找SO文件目录。
根据本发明一优选实施例,所述使用文件加载的具体方式包括:通过调用定义了SO文件的文件名参数的System.loadLibrary函数来寻找SO文件目录。
根据本发明一优选实施例,如果所述确定单元确定SO库加载失败的原因是多进程加载SO库导致的加载冲突,则所述加载单元选择所述使用文件锁的方式保证仅多个进程之一加载SO库。
根据本发明一优选实施例,所述使用文件锁的方式具体包括:当多个进程之一加载SO库并对所述SO库中的SO文件执行写操作时,使用文件锁对执行写操作的所述SO文件加锁,当所述写操作结束后释放文件锁。
根据本发明一优选实施例,在所述加载单元执行所述选择以下加载方式之一加载SO库后,如果加载仍然失败,则转至由确定单元执行所述确定SO库加载失败的原因的操作。
由以上技术方案可以看出,本发明提供的方法和装置,基于SO库自身的调用逻辑对可能导致SO库加载失败的难以捕捉的原因进行排查,并依据SO库加载失败的原因选择多个加载方式之一加载SO库,从而保证了SO库尽量加载成功。
【附图说明】
图1为本发明实施例一提供的一种SO库加载方法的流程图;
图2为本发明实施例二提供的一种依次确定SO库加载失败的原因并选择对应的加载方式的SO库加载方法流程图;
图3为本发明实施例三提供的一种SO库加载装置的结构示意图;
图4为本发明实施例四提供的一种依次确定SO库加载失败的原因并选择对应的加载方式的SO库加载装置的结构示意图。
【具体实施方式】
为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。
实施例一、
参照图1,图1示出了根据本发明实施例一的一种SO库加载的方法的流程图,具体流程为:
101、确定SO库加载失败的原因。
当应用加载SO库失败时,可能会提示没有文件或目录,例如会显示这样的提示信息“error while loading shared libraries:libtcmal loc_mininal.SO.4No such fileor directory”。
当SO库中的SO文件不存在、不完整或者被篡改等,该SO文件自身存在的一系列问题可能造成SO库加载失败,因此可以先确定SO库加载失败是否是由SO文件不存在、不完整或者被篡改等其自身原因导致的。
其中导致SO文件不存在的原因又有很多,例如由于在Android中调用SO文件时,往往都要将对应的SO文件打包进安装包(apk)。因此提示SO文件不存在的这种情况通常是因为所需要的apk包没有安装;除此之外,SO文件拷入不成功、该文件已被第三方应用删除、文件丢失等,也可能使SO文件不存在,在此不再一一列举。
本发明所指的apk是AndroidPacKage的缩写,即Android安装包(apk)。apk是类似Symbian Sis或Sisx的文件格式。通过将apk文件直接传到Android模拟器或Android手机中执行即可安装。apk文件其实是zip格式,但后缀名被修改为apk。Android系统在运行一个程序时首先需要将apk通过UnZip解压,然后直接执行安装。
而应用找不到SO库中SO文件的相应目录、多进程加载冲突也是导致SO库加载失败的原因。
因此步骤101中需要首先确定SO库加载失败的原因是1011、SO文件不存在,1012、SO文件不完整或被篡改,1013、找不到SO库中SO文件的目录,或者1014、多进程加载SO库导致的加载冲突等等多个原因中的哪一种,从而依据SO库加载失败的原因选择相应的记载方式来加载SO库。
102、依据SO库加载失败的原因选择以下加载方式之一加载SO库:1021、释放并重新安装包含所述SO库的安装包,1022、通过使用全路径的方式加载SO库,1023、使用文件加载的方式加载SO库,或者1024、使用文件锁的方式保证仅多个进程之一加载SO库。
具体地,可以通过校验来确定SO库加载失败的原因101是否是SO库中的SO文件不存在1011,SO文件不完整或者被篡改1012,如果确定是上述原因之一,可以通过释放并重新安装apk包的方式1021加载SO库。
另外,在执行了一次释放并重新安装apk包加载SO库后,可以再次尝试一次校验来确定是否存在SO文件不存在、不完整、或者被篡改的原因,从而最大限度的排除由SO文件自身原因导致的加载失败。
当然,也可以再次尝试一次以上的校验,其尝试的任何次数均在本发明的保护范围内。
如果在SO文件的相应目录下并没有相应的SO文件,则确定文件不存在。
如果通过解析SO库安装包,将加载的当前目录下的SO文件的文件大小与解析SO库安装包中解析出的SO文件的文件大小进行比较,发现加载的SO文件的文件大小与安装包中的SO文件的文件大小不一致,则可以确定SO库加载失败的原因是SO文件不完整。
如果将加载的当前目录下的SO文件的更新时间与安装SO库安装包的安装时间进行比较,发现更新时间和安装时间不一致,则可以确定SO库加载失败的原因是SO文件被篡改。
以上对确定SO文件是否不存在、不完整或是否被篡改仅举出了一种示例,但并不限于上述示例,其他确定SO文件是否不存在、不完整或被篡改的具体方式均包含在本发明所保护的范围内。
如果确定SO库加载失败的原因是找不到SO库中SO文件的目录,则选择所述使用全路径的方式或者使用文件加载的方式加载SO库。
其中,可以通过调用定义了SO文件的全路径名参数的System.load函数来使用全路径方式寻找SO文件目录。也可以通过调用定义了SO文件的文件名参数的System.loadLibrary函数来使用文件加载的方式寻找SO文件目录。
在通过全路径方式寻找SO文件目录失败后,还可以进一步通过释放并重新安装apk包的方式再次加载SO库。
如果确定SO库加载失败的原因是多进程加载SO库导致的加载冲突,可以在多个进程之一加载SO库并对SO库中的SO文件执行写操作时,使用文件锁对执行写操作的SO文件加锁,当写操作结束后释放文件锁,从而使用文件锁的方式保证仅多个进程之一加载SO库。
在执行所述选择以下加载方式之一加载SO库后,如果加载仍然失败,则转至执行101的步骤,重新确定SO库加载失败的原因并有针对性的执行相应操作。
本实施例中可以依据SO库加载失败的原因而选择不同的SO库加载方式来加载SO库,多个SO库加载方式中,其执行不分先后顺序,一切能够保证SO库成功加载的执行顺序的组合方式均在本发明的保护范围内。
虽然多个SO库加载方式的执行不分先后顺序,只要能通过各流程而成功加载SO库文件,则均在本发明的保护范围内。但为了便于理解,以下选取了一种执行顺序的组合,并从依次确定SO库加载失败的原因并选择对应的加载方式加载SO库的角度,对实施例一描述的SO库加载方法进行了进一步说明。
实施例二、
参照图2,图2示出了根据本发明实施例二的一种依次确定SO库加载失败的原因并选择对应的加载方式的SO库加载方法流程图,具体流程为:
201、校验SO文件是否存在,以排除SO文件不存在而导致的SO库加载失败。
在步骤201中,如果应用加载SO库失败,可以通过校验的方式确定SO文件是否存在。如果发现SO文件不存在时,可以通过释放apk包并重新安装的方式来解决,并且在重新安装apk包后,再次尝试一次SO文件是否存在的校验,以保证SO文件的真实存在。
如果通过步骤201发现系统要加载的SO库中SO文件已经存在于相应的目录下面,但仍然提示无法加载SO库,则有可能是SO文件由于不完整或被篡改而导致其加载失败,因此可以通过流程202对SO文件进行进一步校验。
202、校验SO文件是否完整或是否被篡改。
当SO文件已经存在,但加载SO库仍然失败时,其加载失败有可能是由已经存在的SO文件不完整、被篡改等原因导致的。而SO文件缺少字节、被损坏、被修改均可以引起SO文件不完整或被篡改。
第一种:校验SO文件的大小。
校验SO文件大小的方式可以为,解析apk包,将当前位于SO文件目录下的SO文件与所解析的apk包中的相应文件进行比较,以确定加载的SO文件的大小与apk包中的文件大小是否一致。如果一致,说明文件是完整的,则继续校验SO文件是否给篡改;反之,则校验失败,由此表明SO文件不完整。
在通过校验发现SO文件不完整时,可以通过释放apk包并重新安装的方式来解决,并且在重新安装apk包后,再次尝试一次SO完整性的校验,以保证SO文件的准确性。
第二种,校验SO文件的更新时间。
如果加载的SO文件相比于安装apk的安装时间,该SO文件的更新时间发生改变,则有可能SO文件遭到过篡改或破坏,从而导致加载失败。
优选地,可以通过检查时间戳的方式来校验SO文件的更新时间,具体地:
当安装apk包时,基于安装apk的时间设置时间戳,优选地,可以基于首次安装的apk包设置时间戳,将当前目录下的SO文件更新时间与时间戳进行比较,如果一致,说明文件是原始文件,没有被篡改,该原因排查后,可以进行全路径方式加载;反之,SO文件在安装apk包以后的时间被进行过修改,则校验失败,由此表明SO文件被篡改。
在校验SO文件发现其被篡改时,可以通过释放apk包并重新安装的方式来解决,并且在重新安装apk包后,再次尝试一次SO是否被篡改的校验,以保证SO文件的准确性。
如果通过201发现系统要加载的SO文件已经存在,通过202校验确定SO文件完整且没有被篡改,即校验成功,但SO库仍然加载失败时,则还有可能是系统没有找到已有SO文件的加载目录而导致其加载失败,因此可以进入203,通过全路径加载SO文件的方式寻找目录。
如果在201和202中经过有限次的校验发现SO文件仍然不存在、不完整或被篡改,则校验失败,不再继续尝试SO库加载。
203、通过全路径的方式加载SO库。
全路径是指从根目录开始的路径,使用全路径可以唯一定位一个文件或者文件夹。
本实施例可以使用System.load函数加载SO文件,此函数的参数为SO文件全路径名。
例如System.load("/usr/lib/TestJNI.SO"),其中libTestJNI.SO是java.library.path所指向的路径。
当系统本身发生读取失败、解码操作失败等错误时,可以导致通过路径加载SO库失败,上述失败的概率虽然相比于SO文件不存在、不完整或被篡改的概率小,但若存在问题则会产生较大的影响。因此如果全路径加载失败时,可以通过释放apk包并重新安装的方式来解决,并且在重新安装apk包后,再次尝试一次全路径加载SO文件,以确保加载成功。
本实施例中仅以再次尝试一次校验或者再次尝试一次全路径加载进行了描述,然而并不限于此,其他有限次数的尝试加载均在本发明保护的范围内。
由于系统中通过全路径加载的方式是在固定的几个路径下去查找,加载的是路径而不是文件,该方式排除了其路径之外的所有查找SO文件的手段,因此在通过释放并重新安装apk包,或者再次尝试全路径加载仍然失败时,可以通过204来尝试使用除全路径外的其他查找手段来加载SO文件。
204、通过加载文件的方式加载SO库。
本实施例可以通过使用System.loadLibrary函数来加载SO库,System.loadLibrary的功能是查找并加载某个库文件,其参数为库文件名,使用此方法可加载系统目录中的SO文件。
例如
System.loadLibrary("data/data/xxx.xxx.xxx/lib/xx.SO")或者
System.loadLibrary("xx")。
通过加载文件的方式,可以在通过全路径加载SO库失败时,以另一种方式再次尝试查找SO文件从而实现SO库的加载,以此确保加载成功。
当尝试完所有查找手段加载SO库时,仍然可能出现SO库加载失败的问题,而多进程加载SO库所引起的冲突,也会成为导致加载失败的原因,因此可以通过205来解决多进程加载失败的问题。
205、如果是多个进程加载SO库,则使用文件锁。
具体地,若多个进程加载SO库,例如一个进程未释放SO库而另一个进程在写过程,上述操作同样会引起SO库的加载错误,因此当多个进程加载SO库时,可以使用文件锁(filelock)在写操作时对其中一个可写文件(w)加锁(trylock),保证同时只有一个进程可以拿到文件锁,这个进程从而可以对文件做访问,直到该进程的操作完成时再通过FileLock.release()语句释放文件锁。
通过文件锁可以控制不同程序对同一文件的并发访问,这样的机制保证了某进程获得文件锁后,操作系统将保证其它进程无法对文件做操作,这样,进程就可以通过FileLock来实现进程间的互斥运行。从而避免由于多个进程同时对SO库的操作而引起SO库加载失败。
实施例三、
参照图3,图3示出了根据本发明实施例三的一种SO库加载装置的结构示意图,该SO库加载装置可以包括:确定单元301和加载单元302,以下对各个单元的构成和功能进行详细描述:
确定单元301,用于确定SO库加载失败的原因。
当SO库中的SO文件不存在、不完整或者被篡改等,该SO文件自身存在的一系列问题可能造成SO库加载失败,因此可以先确定SO库加载失败是否是由SO文件不存在、不完整或者被篡改等其自身原因导致的。
其中导致SO文件不存在的原因又有很多,例如由于在Android中调用SO文件时,往往都要将对应的SO文件打包进安装包(apk)。因此提示SO文件不存在的这种情况通常是因为所需要的apk包没有安装;除此之外,SO文件拷入不成功、该文件已被第三方应用删除、文件丢失等,也可能使SO文件不存在,在此不再一一列举。
而应用找不到SO库中SO文件的相应目录、多进程加载冲突也是导致SO库加载失败的原因。
因此需要首先通过确定单元301确定SO库加载失败的原因是SO文件不存在,SO文件不完整或被篡改,找不到SO库中SO文件的目录,或者多进程加载SO库导致的加载冲突等等多个原因中的哪一种,从而依据SO库加载失败的原因选择相应的记载方式来加载SO库。
加载单元302,用于依据SO库加载失败的原因选择以下加载方式之一加载SO库:释放并重新安装包含所述SO库的安装包,通过使用全路径的方式加载SO库,使用文件加载的方式加载SO库,或者使用文件锁的方式保证仅多个进程之一加载SO库。
具体地,确定单元可以通过校验来确定SO库加载失败的原因是否是SO库中的SO文件不存在,SO文件不完整或者被篡改,如果确定是上述原因之一,则可以使加载单元执行释放并重新安装apk包的操作加载SO库。
另外,在执行了一次释放并重新安装apk包加载SO库后,可以再次尝试一次校验来确定是否存在SO文件不存在、不完整、或者被篡改的原因,从而最大限度的排除由SO文件自身原因导致的加载失败。
当然,也可以再次尝试一次以上的校验,其尝试的任何次数均在本发明的保护范围内。
如果确定单元在SO文件的相应目录下并没有相应的SO文件,则确定文件不存在。
如果确定单元通过解析SO库安装包,将加载的当前目录下的SO文件的文件大小与解析SO库安装包中解析出的SO文件的文件大小进行比较,发现加载的SO文件的文件大小与安装包中的SO文件的文件大小不一致,则可以确定SO库加载失败的原因是SO文件不完整。
如果确定单元将加载的当前目录下的SO文件的更新时间与安装SO库安装包的安装时间进行比较,发现更新时间和安装时间不一致,则可以确定SO库加载失败的原因是SO文件被篡改。
以上对确定SO文件是否不存在、不完整或是否被篡改仅举出了一种示例,但并不限于上述示例,其他确定SO文件是否不存在、不完整或被篡改的具体方式均包含在本发明所保护的范围内。
如果确定SO库加载失败的原因是找不到SO库中SO文件的目录,则加载单元选择使用全路径的方式或者使用文件加载的方式加载SO库。
其中,加载单元302可以通过调用定义了SO文件的全路径名参数的System.load函数来使用全路径方式寻找SO文件目录。也可以通过调用定义了SO文件的文件名参数的System.loadLibrary函数来使用文件加载的方式寻找SO文件目录。
在通过全路径方式寻找SO文件目录失败后,还可以进一步通过释放并重新安装apk包的方式再次加载SO库。
如果确定SO库加载失败的原因是多进程加载SO库导致的加载冲突,加载单元可以在多个进程之一加载SO库并对SO库中的SO文件执行写操作时,使用文件锁对执行写操作的SO文件加锁,当写操作结束后释放文件锁,从而使用文件锁的方式保证仅多个进程之一加载SO库。
在执行所述选择以下加载方式之一加载SO库后,如果加载仍然失败,则转至由确定单元301重新确定SO库加载失败的原因并有针对性的执行相应操作。
本实施例中可以依据SO库加载失败的原因而选择不同的SO库加载方式来加载SO库,多个SO库加载方式中,其执行不分先后顺序,一切能够保证SO库成功加载的执行顺序的组合方式均在本发明的保护范围内。
虽然加载单元加载SO库的顺序不分先后,只要其能够成功加载SO库文件就均在本发明的保护范围内,但为了便于理解,以下选取了一种加载单元加载SO库的执行顺序的组合,并从依次确定SO库加载失败的原因并选择对应的加载方式加载SO库的角度,对实施例三描述的SO库加载装置进行了进一步说明。
实施例四、
参照图4,图4示出了根据本发明实施例三的一种依次确定SO库加载失败的原因并选择对应的加载方式的SO库加载装置的结构示意图,该装置具体包括:
校验单元401,用于校验SO文件是否存在、是否完整或是否被篡改,以排除SO文件不存在而导致的SO库加载失败。
具体地,如果应用加载SO库失败,可以通过校验单元401来确定SO文件是否存在。如果发现SO文件不存在时,可以通过第一安装单元4012执行释放apk包并重新安装的操作来解决SO文件不存在的问题,并且在重新安装apk包后,再次尝试一次SO文件是否存在的校验,以保证SO文件的真实存在。
如果经校验发现系统要加载的SO库中SO文件已经存在于相应的目录下面,但仍然提示无法加载SO库,则有可能是SO文件由于不完整或被篡改而导致其加载失败,因此可以通过校验装置401继续对SO文件进行不完整或被篡改的校验。
其中,SO文件缺少字节、被损坏、被修改均可以引起SO文件不完整或被篡改。
校验单元401可以通过以下方式对SO文件是否不完整或是否被篡改进行校验
第一种:校验SO文件的大小。
校验SO文件大小的方式可以为,解析apk包,将当前位于SO文件目录下的SO文件与所解析的apk包中的相应文件进行比较,以确定加载的SO文件的大小与apk包中的文件大小是否一致。如果一致,说明文件是完整的,则继续校验SO文件是否给篡改;反之,则校验失败,由此表明SO文件不完整。
在通过校验发现SO文件不完整时,可以通过释放apk包并重新安装的方式来解决,并且在重新安装apk包后,再次尝试一次SO完整性的校验,以保证SO文件的准确性。
第二种,校验SO文件的更新时间。
如果加载的SO文件相比于安装apk的安装时间,该SO文件的更新时间发生改变,则有可能SO文件遭到过篡改或破坏,从而导致加载失败。
优选地,可以通过检查时间戳的方式来校验SO文件的更新时间,具体地:
当安装apk包时,基于安装apk的时间设置时间戳,优选地,可以基于首次安装的apk包设置时间戳,将当前目录下的SO文件更新时间与时间戳进行比较,如果一致,说明文件是原始文件,没有被篡改,该原因排查后,可以进行全路径方式加载;反之,SO文件在安装apk包以后的时间被进行过修改,则校验失败,由此表明SO文件被篡改。
在校验SO文件发现其被篡改的问题时,可以通过第二安装单元4022执行释放apk包并重新安装的操作来解决,并且在重新安装apk包后,再次尝试一次SO文件是否被篡改的校验,以保证SO文件的准确性。
如果通过校验装置401的校验发现系统要加载的SO文件已经存在,且其完整和没有被篡改,即校验成功,但SO库仍然加载失败时,则还有可能是系统没有找到已有SO文件的加载目录而导致其加载失败,因此可以通过全路径加载单元402执行全路径加载SO文件,以寻找SO文件的目录。
如果校验单元401经过有限次的校验发现SO文件仍然不存在、不完整或被篡改,则校验失败,不再继续尝试SO库加载。
全路径加载单元402,用于通过全路径的方式加载SO库。
全路径是指从根目录开始的路径,使用全路径可以唯一定位一个文件或者文件夹。
本实施例可以使用System.load函数加载SO文件,此函数的参数为SO文件全路径名。
当系统本身发生读取失败、解码操作失败等错误时,可以导致通过路径加载SO库失败,上述失败的概率虽然相比于SO文件不存在、不完整或被篡改的概率小,但若存在问题则会产生较大的影响。因此如果全路径加载失败时,可以通过释放apk包并重新安装的方式来解决,并且在重新安装apk包后,再次尝试一次全路径加载SO文件,以确保加载成功。
本实施例中仅以再次尝试一次校验或者再次尝试一次全路径加载进行了描述,然而并不限于此,其他有限次数的尝试加载均在本发明保护的范围内。
由于系统中通过全路径加载的方式是在固定的几个路径下去查找,加载的是路径而不是文件,该方式排除了其路径之外的所有查找SO文件的手段,因此在通过释放并重新安装apk包,或者再次尝试全路径加载仍然失败时,可以通过加载文件单元403来尝试使用除全路径外的其他查找手段来加载SO文件。
加载文件单元403,用于通过加载文件的方式加载SO库。
本实施例可以通过使用System.loadLibrary函数来加载SO库,System.loadLibrary的功能是查找并加载某个库文件,其参数为库文件名,使用此方法可加载系统目录中的SO文件。
通过加载文件的方式,可以在通过全路径加载SO库失败时,以另一种方式再次尝试查找SO文件从而实现SO库的加载,以此确保加载成功。
当尝试完所有查找手段加载SO库时,仍然可能出现SO库加载失败的问题,而多进程加载SO库所引起的冲突,也会成为导致加载失败的原因,因此可以通过多进程加载单元404来解决多进程加载失败的问题。
多进程加载单元404,用于当多个进程加载SO库时,使用文件锁锁定进程。
具体地,若多个进程加载SO库,例如一个进程未释放SO库而另一个进程在写过程,上述操作同样会引起SO库的加载错误,因此当多个进程加载SO库时,可以使用文件锁(filelock)在写操作时对其中一个可写文件(w)加锁(trylock),保证同时只有一个进程可以拿到文件锁,这个进程从而可以对文件做访问,直到该进程的操作完成时再通过FileLock.release()语句释放文件锁。
通过文件锁可以控制不同程序对同一文件的并发访问,这样的机制保证了某进程获得文件锁后,操作系统将保证其它进程无法对文件做操作,这样,进程就可以通过FileLock来实现进程间的互斥运行。从而避免由于多个进程同时对SO库的操作而引起SO库加载失败。
基于本发明实施例所提供的SO库加载的方法和装置,当在SO库加载中遇到加载失败的问题时,提出了一种解决加载失败的具体解决方案,即从SO库加载中可能导致加载失败的可能原因入手,基于不同的原因给出相对应的解决手段,通过在当前目录下释放、安装apk包的形式重新加载SO库,或者采用其他加载方式尝试加载SO库,从而保证加载SO库的成功率。
结合实施例三和实施例四不难看出,确定单元301中可以包含校验单元401,而加载单元302中可以包含第一安装单元4012、第二安装单元4022、全路径加载单元402、加载文件单元403,或多进程加载单元404。
在本发明所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
Claims (20)
1.一种共享对象SO库加载的方法,其特征在于,所述方法包括:
确定SO库加载失败的原因;
依据SO库加载失败的原因选择以下加载方式之一加载SO库:
释放并重新安装包含所述SO库的安装包;
使用全路径的方式或者使用文件加载的方式加载SO库;
使用文件锁的方式保证仅多个进程之一加载SO库。
2.根据权利要求1所述的方法,其特征在于:如果确定SO库加载失败的原因是所述SO库中的SO文件不存在、SO文件不完整或者SO文件被篡改,则选择所述释放并重新安装包含所述SO库的安装包的方式加载SO库。
3.根据权利要求2所述的方法,其特征在于,确定SO库加载失败的原因为SO文件不完整的方式包括:解析SO库安装包,将加载的当前目录下的SO文件的文件大小与从所述解析SO库安装包中解析出的SO文件的文件大小进行比较,如果加载的SO文件的文件大小与安装包中的SO文件的文件大小不一致,则确定SO库加载失败的原因是SO文件不完整。
4.根据权利要求2所述的方法,其特征在于,确定SO库加载失败的原因为SO文件被篡改的方式包括:将加载的当前目录下的SO文件的更新时间与安装SO库安装包的安装时间进行比较,如果更新时间和安装时间不一致,则确定SO库加载失败的原因是SO文件被篡改。
5.根据权利要求1所述的方法,其特征在于:如果确定SO库加载失败的原因是找不到SO库中SO文件的目录,则选择所述使用全路径的方式或者使用文件加载的方式加载SO库。
6.根据权利要求5所述的方法,其特征在于,所述使用全路径的方式具体包括:通过调用定义了SO文件的全路径名参数的System.load函数来寻找 SO文件目录。
7.根据权利要求5所述的方法,其特征在于,所述使用文件加载的具体方式包括:通过调用定义了SO文件的文件名参数的System.loadLibrary函数来寻找SO文件目录。
8.根据权利要求1所述的方法,其特征在于,如果确定SO库加载失败的原因是多进程加载SO库导致的加载冲突,则选择所述使用文件锁的方式保证仅多个进程之一加载SO库。
9.根据权利要求8所述的方法,其特征在于,所述使用文件锁的方式具体包括:当多个进程之一加载SO库并对所述SO库中的SO文件执行写操作时,使用文件锁对执行写操作的所述SO文件加锁,当所述写操作结束后释放文件锁。
10.根据权利要求1-9任意一项所述的方法,其特征在于:在执行所述选择以下加载方式之一加载SO库后,如果加载仍然失败,则转至执行所述确定SO库加载失败的原因的操作。
11.一种共享对象SO库加载的装置,其特征在于,所述装置包括:
确定单元,用于确定SO库加载失败的原因;
加载单元,用于依据SO库加载失败的原因选择以下加载方式之一加载SO库:
释放并重新安装包含所述SO库的安装包;
使用全路径的方式或者使用文件加载的方式加载SO库;
使用文件锁的方式保证仅多个进程之一加载SO库。
12.根据权利要求11所述的装置,其特征在于:如果所述确定单元确定SO库加载失败的原因是所述SO库中的SO文件不存在、SO文件不完整或者SO文件被篡改,则所述加载单元选择所述释放并重新安装包含所述SO库的安装包的方式加载SO库。
13.根据权利要求12所述的装置,其特征在于,所述确定单元确定SO库加载失败的原因为SO文件不完整的方式包括:解析SO库安装包,将加载的当前目录下的SO文件的文件大小与从所述解析SO库安装包中解析出的SO文件的文件大小进行比较,如果加载的SO文件的文件大小与安装包中的SO文件的文件大小不一致,则确定SO库加载失败的原因是SO文件不完整。
14.根据权利要求12所述的装置,其特征在于,所述确定单元确定SO库加载失败的原因为SO文件被篡改的方式包括:将加载的当前目录下的SO文件的更新时间与安装SO库安装包的安装时间进行比较,如果更新时间和安装时间不一致,则确定SO库加载失败的原因是SO文件被篡改。
15.根据权利要求11所述的装置,其特征在于:如果所述确定单元确定SO库加载失败的原因是找不到SO库中SO文件的目录,则加载单元选择所述使用全路径的方式或者使用文件加载的方式加载SO库。
16.根据权利要求15所述的装置,其特征在于,所述使用全路径的方式具体包括:通过调用定义了SO文件的全路径名参数的System.load函数来寻找 SO文件目录。
17.根据权利要求15所述的装置,其特征在于,所述使用文件加载的具体方式包括:通过调用定义了SO文件的文件名参数的System.loadLibrary函数来寻找SO文件目录。
18.根据权利要求11所述的装置,其特征在于,如果所述确定单元确定SO库加载失败的原因是多进程加载SO库导致的加载冲突,则所述加载单元选择所述使用文件锁的方式保证仅多个进程之一加载SO库。
19.根据权利要求18所述的装置,其特征在于,所述使用文件锁的方式具体包括:当多个进程之一加载SO库并对所述SO库中的SO文件执行写操作时,使用文件锁对执行写操作的所述SO文件加锁,当所述写操作结束后释放文件锁。
20.根据权利要求11-19任意一项所述的装置,其特征在于:在所述加载单元执行所述选择以下加载方式之一加载SO库后,如果加载仍然失败,则转至由确定单元执行所述确定SO库加载失败的原因的操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510789797.2A CN106708550B (zh) | 2015-11-17 | 2015-11-17 | 一种共享对象库加载的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510789797.2A CN106708550B (zh) | 2015-11-17 | 2015-11-17 | 一种共享对象库加载的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106708550A CN106708550A (zh) | 2017-05-24 |
CN106708550B true CN106708550B (zh) | 2020-05-29 |
Family
ID=58933301
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510789797.2A Active CN106708550B (zh) | 2015-11-17 | 2015-11-17 | 一种共享对象库加载的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106708550B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109408137A (zh) * | 2018-09-19 | 2019-03-01 | 北京城市网邻信息技术有限公司 | 共享方法文件加载方法、装置、移动终端及存储介质 |
CN110045998B (zh) * | 2019-04-22 | 2021-07-16 | 腾讯科技(深圳)有限公司 | 加载动态库的方法及装置 |
CN113568680B (zh) * | 2021-07-23 | 2023-08-11 | 杭州网易智企科技有限公司 | 应用程序的动态链接库保护方法、装置、设备及介质 |
CN113987471A (zh) * | 2021-10-29 | 2022-01-28 | 山西大鲲智联科技有限公司 | 可执行文件执行方法、装置、电子设备和计算机可读介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101556550A (zh) * | 2009-05-22 | 2009-10-14 | 北京星网锐捷网络技术有限公司 | 一种自动化测试日志分析方法和装置 |
CN102184138A (zh) * | 2011-05-19 | 2011-09-14 | 广东威创视讯科技股份有限公司 | 一种软件错误自动重现和定位的方法及系统 |
CN102184264A (zh) * | 2011-06-16 | 2011-09-14 | 东信和平智能卡股份有限公司 | 一种动态链接库的远程联调方法 |
CN102473223A (zh) * | 2010-05-13 | 2012-05-23 | 松下电器产业株式会社 | 信息处理装置以及信息处理方法 |
CN103200022A (zh) * | 2012-01-09 | 2013-07-10 | 华为终端有限公司 | 一种数据下载异常处理方法、设备及系统 |
US9009014B2 (en) * | 2012-07-11 | 2015-04-14 | Landmark Graphics Corporation | System, method and computer program product to simulate the progressive failure of rupture disks in downhole environments |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7339891B2 (en) * | 2002-01-09 | 2008-03-04 | Mverify Corporation | Method and system for evaluating wireless applications |
CN101719090A (zh) * | 2009-12-25 | 2010-06-02 | 珠海市君天电子科技有限公司 | 对计算机软件系统崩溃原因进行自动分析的方法 |
US9176015B1 (en) * | 2012-02-08 | 2015-11-03 | The United States Of America As Represented By The Secretary Of The Navy | Point load sensor |
CN103729597B (zh) * | 2014-01-16 | 2017-11-17 | 宇龙计算机通信科技(深圳)有限公司 | 系统启动校验方法、系统启动校验装置和终端 |
-
2015
- 2015-11-17 CN CN201510789797.2A patent/CN106708550B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101556550A (zh) * | 2009-05-22 | 2009-10-14 | 北京星网锐捷网络技术有限公司 | 一种自动化测试日志分析方法和装置 |
CN102473223A (zh) * | 2010-05-13 | 2012-05-23 | 松下电器产业株式会社 | 信息处理装置以及信息处理方法 |
CN102184138A (zh) * | 2011-05-19 | 2011-09-14 | 广东威创视讯科技股份有限公司 | 一种软件错误自动重现和定位的方法及系统 |
CN102184264A (zh) * | 2011-06-16 | 2011-09-14 | 东信和平智能卡股份有限公司 | 一种动态链接库的远程联调方法 |
CN103200022A (zh) * | 2012-01-09 | 2013-07-10 | 华为终端有限公司 | 一种数据下载异常处理方法、设备及系统 |
US9009014B2 (en) * | 2012-07-11 | 2015-04-14 | Landmark Graphics Corporation | System, method and computer program product to simulate the progressive failure of rupture disks in downhole environments |
Also Published As
Publication number | Publication date |
---|---|
CN106708550A (zh) | 2017-05-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9910743B2 (en) | Method, system and device for validating repair files and repairing corrupt software | |
CN102736978B (zh) | 一种检测应用程序的安装状态的方法及装置 | |
KR100868762B1 (ko) | 임베디드용 소프트웨어의 오류 검출 방법 | |
CN106371940B (zh) | 一种程序崩溃解决方法及装置 | |
US7908521B2 (en) | Process reflection | |
CN106708550B (zh) | 一种共享对象库加载的方法及装置 | |
US11748245B2 (en) | Object-oriented regression-candidate filter | |
US7284237B2 (en) | Testing flow control at test assertion level | |
US9606905B2 (en) | Systems, methods, and media for testing software patches | |
US10579513B2 (en) | Test run control method and apparatus | |
US11436131B2 (en) | Systems and methods for software testing using a disposable code | |
US9317254B1 (en) | Fault tolerance model, methods, and apparatuses and their validation techniques | |
Talebi et al. | Undo workarounds for kernel bugs | |
CN112965913A (zh) | 一种Java软件依赖冲突问题自动化修复的方法 | |
US10783027B2 (en) | Preemptive crash data capture | |
CN109408133B (zh) | 一种启动组件的方法和设备 | |
CN106909434B (zh) | 可执行程序中未定义函数的检测方法及装置 | |
CN111352631A (zh) | 一种接口兼容性检测方法及装置 | |
CN115543399A (zh) | 一种软件处理系统、软件处理方法以及装置 | |
CN112925549A (zh) | 基于安卓框架的系统应用升级系统 | |
CN112527371A (zh) | 一种引导加载程序升级方法、装置、电子设备及存储介质 | |
EP4222603B1 (en) | Verified stack trace generation and accelerated stack-based analysis with shadow stacks | |
CN114443617B (zh) | 迁移异常的智能化校验处理方法及装置 | |
CN114020638A (zh) | 漏洞检测插件更新方法及系统 | |
Seyed Talebi et al. | Undo Workarounds for Kernel Bugs |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |