Android中动态加载so
原因:如果把so文件直接放在libs目录下,在android程序启动的时候会默认加载libs目录下的所有so库,但这些so库可能会在某些地方存在冲突,使用动态加载so库,就可以通过一些条件判断是否要加载这个so库。
介绍:so的动态加载是把so库打包成apk的时候剔除,在合适的时候通过网络包下载的方式,在运行的时候进行分离加载。
优点:so文件是动态加载的,不是绑定死的,更便于修改,在so库有问题的时候可以动态更新;
so库文件动态加载可以极大地减小apk包的体积;
解决多个第三方库文件同时加载可能出现冲突的问题。
一、Android的so库文件的加载
- Android中加载so:
(1)调用load()方法,传递so文件的绝对路径;
(2)调用loadLibrary()方法,传递so文件的名称,而且so文件必须放在apk的lib目录下,而且so的名称必须去掉前面的lib和后边的“.so”。
只能加载两个目录下的so文件:
(1)/system/lib
(2)应用程序安装包的路径:/data/data/packgename/…
对于两种加载so文件的方法,在Android源码System.java中可以看到
源码链接
public static void load(String filename) {
Runtime.getRuntime().load0(Reflection.getCallerClass(), filename);
}
public static void loadLibrary(String libname) {
Runtime.getRuntime().loadLibrary0(Reflection.getCallerClass(), libname);
}
- 上边两种方法都调用了Runtime中的getRuntime函数,用来获取Runtime的实例
源码链接
public static Runtime getRuntime() {
return currentRuntime;
}
- 在加载so时也调用了loadLibrary0方法
源码链接
在loadLibrary0中可以看到根据ClassLoader是否为空,有两种不同的处理形式。
private synchronized void loadLibrary0(ClassLoader loader, Class<?> callerClass, String libname) {
if (libname