概述
在开发中,我们时常会遇到包体积过大的情况。其中,一个大的第三方so文件,经常会让人头痛。那么,能否动态加载.so文件呢?答案是可以的。
原理
我们知道,如果我们在工程中引入一个so文件,当我们用gradle编译打包时,gradle会将我们jniLibs中的so文件,打到APK包中的lib
文件夹下。具体可以参考我的上篇博客。
然后我们安装APK时,系统会将APK包lib
文件夹中的so文件拷贝到APP的私有目录下。具体来说就是:
/data/user/0/[包名]/app_libs/
所以,我们可以将想要加载的so文件,在程序运行时,拷贝到APP的私有目录的对应位置中,然后使用
System.load(...);
加载我们需要的so文件。
String soPath = Environment.getExternalStorageDirectory().toString() + "/libnative2-lib.so";
File file = new File(soPath);
if (file.exists()){
File dir = context.getDir("libs", Context.MODE_PRIVATE);
String targetDir = dir.getAbsolutePath()+"/libnative2-lib.so";
FileUtils.copySdcardFile(file.toString(), targetDir);
System.load(targetDir);
}
如有问题,欢迎指正。