外掛程式載入帶有動態庫so的apk處理

2021-06-27 00:53:13 字數 2089 閱讀 3718

外掛程式載入帶有動態庫的apk時,會報unsatisfiedlinkerror找不到動態庫的錯誤。

解決方法是在dexclassloader中

dalvik.system.dexclassloader.dexclassloader(string dexpath, string optimizeddirectory, string librarypath, classloader parent)

第三個引數是指定動態庫的路徑,因此我們需要把動態庫給解壓出來放到data/data/xx(package),arm手機的t卡是載入不了

因此我需要找到對應的手機cpu型別,並解壓對應的動態庫,對應的**如下:

private static boolean isdirequals(string srcfile,string objdir)

else if(null != firstdirname && firstdirname.equalsignorecase(objdir))

}catch(exception e)

return false;

} public static void unzipspecificfile(string zipfile, string targetdir,arraylistobjdirlist)

}if(false == find)

continue;

file entryfile = new file(targetdir + strentry);

file entrydir = new file(entryfile.getparent());

if (!entrydir.exists())

fileoutputstream fos = new fileoutputstream(entryfile);

dest = new bufferedoutputstream(fos, buffer);

while ((count = zis.read(data, 0, buffer)) != -1)

dest.flush();

} catch (exception ex) finally

}} catch (exception e) finally catch (ioexception e)

} }

// 獲取手機cpu型別資訊

final static public string getcpuinfo() ; // 1-cpu型號 //2-cpu頻率

string arrayofstring;

filereader fr = null;

bufferedreader localbufferedreader = null;

try

str2 = localbufferedreader.readline();

arrayofstring = str2.split("\\s+");

cpuinfo[1] += arrayofstring[2]; // cpu頻率。

localbufferedreader.close();

} catch (ioexception e) finally catch (ioexception e)

} // log.i(tag, "cpuinfo:" + cpuinfo[0] + " " + cpuinfo[1]);

if ((cpuinfo[0].tolowercase().contains("armv7"))) else if ((cpuinfo[0].tolowercase().contains("arm"))) else if ((cpuinfo[0].tolowercase().contains("mips"))) else

}

解壓完lib/***(armeabi/armeabi-v7a等)放到對應的目錄,並使用

system.loadlibrary
來載入動態庫就ok了,其中這個方法會根據之前的classloader傳入的路徑去查詢檔案。

後面找lib庫貌似有點多餘,應該只需要找到apk的lib資料夾就可以避免列舉整個apk檔案,這個是後面需要改進的方向。

讓android自動載入動態庫so

在ios上可以利用越獄後cydia substrate框架的mobileloader完成,吧plist和dylib放在 library mobilesubstrate dynamiclibraries目錄下即可 然而android上的cydia框架卻沒有類似的便利,同時系統好像也沒有此類支援,此時該...

ndk stack 定位錯誤 動態載入的so

我們一般都是使用ndk stack 定位libs下的so錯誤,動態載入sd卡上的so時不能 多次load了,否則會出現定位位置出錯。操作命令 adb路徑 adb logcat ndk stack路徑 ndk stack sym 專案jni路徑 obj local armeabi v7a 或者arme...

so動態庫未能成功載入解決辦法

move db error while loading shared libraries libmysqlclient.so.15 cannot open shared object file no such file or directory 第一步 確認有哪些lib無法load ldd move...