概述
在開(kāi)發(fā)中琳猫,我們時(shí)常會(huì)遇到包體積過(guò)大的情況。其中私痹,一個(gè)大的第三方so文件脐嫂,經(jīng)常會(huì)讓人頭痛。那么紊遵,能否動(dòng)態(tài)加載.so文件呢账千?答案是可以的。
原理
我們知道暗膜,如果我們?cè)诠こ讨幸胍粋€(gè)so文件匀奏,當(dāng)我們用gradle編譯打包時(shí),gradle會(huì)將我們jniLibs中的so文件学搜,打到APK包中的lib
文件夾下娃善。具體可以參考我的上篇博客。
然后我們安裝APK時(shí)瑞佩,系統(tǒng)會(huì)將APK包lib
文件夾中的so文件拷貝到APP的私有目錄下聚磺。具體來(lái)說(shuō)就是:
/data/user/0/[包名]/app_libs/
所以,我們可以將想要加載的so文件炬丸,在程序運(yùn)行時(shí)瘫寝,拷貝到APP的私有目錄的對(duì)應(yīng)位置中,然后使用
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);
}
如有問(wèn)題矢沿,歡迎指正。