java dexclassloader_DexClassLoader加载apk
DexClassLoader
在java環境中,有個概念叫類加載器(ClassLoader),其作用是動態加載class文件,標準的java sdk中,有ClassLoader這個類,可以用來加載想要加載的class文件,每個ClassLoader在初始化的時候必須指定class的路徑。
每個ClassLoader都有一個父ClassLoader,當加載類的時候,子ClassLoader會先請求父ClassLoader去加載class文件,如果父ClassLoader找不到改class文件的時候,子ClassLoader才會繼續去加載改class文件,只是一種安全機制。
在android中加載的是dex文件,dex事經過優化的class文件。Android中事通過DexClassLoader來加載calss的,下面通過一個demo來介紹DexClassLoader的用法。
首先創建一個PluginTest的project。在里面定義一個類,叫PluginClass,代碼如下:
//如果對PluginTest做了混淆,就加上@keep,沒有就忽略
@Keep
public class PluginClass {
public PluginClass() {
Log.e("vonnie", "plugin:PluginClass was initialized");
}
public int add(int a, int b) {
return a + b;
}
}
在manifest文件中加入一個action:
然后編譯運行,把生產的apk裝入手機,接著新建一個叫Host的project,在Activity調用如下代碼:
public void onClick(View view) {
Intent intent = new Intent("com.vonnie.plugintest.client", null);//action 為在pluginTest中添加的action
PackageManager pm = getPackageManager();
List resolveInfos = pm.queryIntentActivities(intent, 0);
if (resolveInfos != null && !resolveInfos.isEmpty()) {
ResolveInfo info = resolveInfos.get(0);
ActivityInfo activityInfo = info.activityInfo;
String packageName = activityInfo.packageName;
String dexPath = activityInfo.applicationInfo.sourceDir;
String dexOutputDir = getApplicationInfo().dataDir;
String libPath = activityInfo.applicationInfo.nativeLibraryDir;
DexClassLoader dcl = new DexClassLoader(dexPath, dexOutputDir
, libPath, this.getClassLoader());
try {
Class> clazz = dcl.loadClass(packageName + ".PluginClass");
Object object = clazz.newInstance();
Method method = clazz.getMethod("add", Integer.TYPE, Integer.TYPE);
int result = (int) method.invoke(object, 1, 1);
Log.e("vonnie", "host: result:" + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
運行之后,log如下:
A5EE630E-EDE2-4CCA-BEAC-1DEA52D95FCD.png
DexClassLoader(String dexPath, String optimizedDirectory, String librarySearchPath, ClassLoader parent)
dexPath:被解壓的apk路徑,不能為空。
optimizedDirectory:解壓后的.dex文件的存儲路徑,不能為空。這個路徑強烈建議使用應用程序的私有路徑,不要放到sdcard上,否則代碼容易被注入攻擊。
libraryPath:os庫的存放路徑,可以為空,若有os庫,必須填寫。
parent:父親加載器,一般為context.getClassLoader(),使用當前上下文的類加載器。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的java dexclassloader_DexClassLoader加载apk的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java aab全排列_编译原理习题课
- 下一篇: oracle 增长型分区,oracle表