Android 动态加载so文件

概述

在开发中,我们时常会遇到包体积过大的情况。其中,一个大的第三方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);
        }

如有问题,欢迎指正。

你可能感兴趣的:(Android 动态加载so文件)