第壹種:
需求:
有時候應用修復了native層壹個小BUG,應用需要更新了,但是用戶必須下載整個APK包進行安裝,而我們需要的只是替換SO
於是想,能不能加載自定義路徑下的 SO 文件呢
答案是完全沒問題:
使用系統方法:
void java.lang.System.load(String pathName)
但是有壹點,pathName 路徑必須有執行權限,意思就是說我們不能加載SD卡上的SO,因為沒有執行權限
那也沒關系,我們復制到應用私有目錄下就OK嘛。
看碼
private void load() {
File dir = getDir("libs", Context.MODE_PRIVATE);
File soFile = new File(dir, "libTestJNI.so");
FileUtils.assetToFile(this, "libTestJNI.so", soFile);
try {
System.load(soFile.getAbsolutePath());
} catch (Exception e) {
}
}
這樣就完全OK,
我們只需要架個服務器,每次啟動時動態監測 SO 文件有沒有更新,有則下載SO,然後加載,這樣就可以避免用戶安裝新的應用,
要知道重新安裝應用的用戶體驗是很差的,要讓用戶無感知的更新他。
第二種:
采用dlopen動態加載第三方庫,無非和system.load壹樣,就是要實現指定路徑加載so的目的,這種方法升級so的話,那就的需要壹個基本so,壹直不變,用來調用dlopen,然後升級另壹個so。
這兩種辦法都會遇到壹個問題,就是不能直接加載SD卡中的so,因為sd卡沒有執行權限,不能直接加載這種二進制文件,需要拷貝到data/data/packagename/files/ 目錄下,再次進行加載即可,拷貝也是有講究的,需要用到context.openFileOutput方法。