日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java dexclassloader_DexClassLoader加载apk

發布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。