本发明涉及一种互联网通信技术领域,特别涉及一种安卓art虚拟机中动态加载加密后插件的解决方法。
背景技术:
在android4.4之后,开始出现了新的android运行环境art(androidruntime),用来替代之前的dalvik运行环境,art的机制与dalvik不同,在dalvik下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率,而在art环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用,即预编译(aot,ahead-of-time),免去了dalvik模式要实时转换代码,这样的话,应用的启动和执行都会变得更加快速。
dalvik虚拟机中直接加载dex文件的方案已经不适用于android4.4之后的手机了,所以需要一种新的方法加载dex文件来运行插件。
技术实现要素:
为克服现有技术的不足,本发明目的在于提供一种能够克服上述问题或者至少能够部分解决上述问题中的加载加密后的dex文件,防止dex文件被反编译,克服或者能部分解决上述问题中的直接调用art中dexfile导致的复杂度提高。
本发明采用了反射调用java文件中makepathelements来加载插件,并且动态使用加密后的dex文件替换apk中的原文件的方案,从而实现保护代码、实现简单及适配性强的目的。
本发明的方法如下:
1.调用安卓art环境下的dexpathlist,加载插件的apk文件,获得apk文件中的资源文件,加载对应的dex文件;优选的,如上所述的apk文件,其中的dex文件为一个加密后的dex文件。
2.反射调用安卓art环境下dexpathlist中的makepathelements来将待加载的dex文件转换为dexelements对象;优选的,如上所述的待加载的dex文件,所调用的为解密后的一个file文件;优选的,如上所述的动态加载dex的方法,所述上层dexelements对象为应用程序框架层dexpathlist文件dalvik/system/dexpathlist中的element对象;将转换后的dexelement对象通过反射替换掉现有dexpathlist对象中的dexelement对象。
本发明中还提供了一种在安卓art环境中动态加载加密后dex文件的装置,该装置包括;
1.dex文件加解密模块,用于将加密后的dex文件进行解密,完成待解密dex文件的解密,得到解密后可以动态加载的dex文件;优选的,如上述所说的解密模块应当放置于主程序中,并且通过加固或混淆等手段进行保护,防止解密方法被反编译等手段获得。
2.系统加载dex文件模块,用于创建一个dexclassloader对象,加载指定路径中apk文件中的dex文件;优选的,如上所述的系统加载dex文件模块,所述加载的apk文件中的dex文件,是经过加密替换的dex文件;优选的,如上所述的系统加载dex文件模块,所述dexclassloader对象为应用程序框架层dexclassloader文件对dalvik/system/dexclassloader。
3.系统加载函数反射模块,用于反射调用art环境下的dexpathlist文件中的makepathelements函数,得到转换后的dex文件。用于反射获得art环境下的dexpathlist文件中的dexelements对象并替换为转换后的dex文件。
本发明本发明技术方案带来的有益效果:
本发明可以将插件apk中的dex文件进行加密操作,可以有效防止被反编译,导致代码泄漏,工作成果被窃取。并且只需要调用安卓上层,即java层即可完成操作,不需要像现有技术一样操作底层,即本地框架层、native层,可以有效避免增加复杂度。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1为本发明的一种安卓art虚拟机中动态加载加密后插件的流程示意图;
图2为本发明的整体流程示意图;
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
结合附图1实施流程步骤如下:
步骤1:通过下载等方式,获取加密后的dex文件并且存储在手机存储器中;
步骤2:通过下载的等方式,获取插件的apk文件并且存储在手机存储器中;
步骤3:使用dex文件加密模块,对已经在手机存储器中的dex文件进行解密,获得对应的file文件对象,等待步骤4开始加载之后,进行动态替换;
步骤4:调用系统本身的dexclassloader,对步骤2中获取的插件apk进行加载,并且获得dexclassloader对象,其中apk文件中的dex文件是加密后的文件;
步骤5:将步骤3中解密后的dex文件获得file文件对象,然后反射调用dexpathlist中的makepathelements函数,获得elements对象;
步骤6:将步骤4中获得的dexclassloader对象中的dexpathlist对象中的dexelements对象替换为步骤5中获得的对象;
步骤7:正常加载插件。
结合附图2实施流程步骤如下:
步骤1:正常开发一个安卓工程;
步骤2:将步骤1中开发的安卓工程导出为一个apk文件;
步骤3:从apk中得到dex文件进行加密,并且将加密后的dex文件替换掉apk中的dex文件;
步骤4:将步骤3中得到的加密后的dex文件单独保存;
步骤5:主程序分别获得步骤2中得到的apk以及步骤4中保存的加密后apk,其中步骤2中的apk经过步骤3替换了dex文件;
步骤6:正常运行插件。
以上对本发明实施例所提供的一种安卓art虚拟机中动态加载加密后插件的解决方法进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。