如何使用 dex DexClassLoader 加载 dex 文件?

问题描述 投票:0回答:1

我正在尝试使用以下代码使用 DexClassLoader 类动态加载包含 android 活动类的 dex 文件。

try {
File file = File.createTempFile("input",".dex");
InputStream reader = getResources().openRawResource(R.raw.classes);
OutputStream writer = new FileOutputStream(file.getAbsolutePath());

while(true){ int x = reader.read(); if(x == -1) break; writer.write(x);}

DexClassLoader loader = new DexClassLoader(file.getAbsolutePath(),null,null,MainActivity.this.getClassLoader());

Class<?> c = loader.loadClass("com.example.myapplication2.MainActivity");
Intent intent = new Intent(MainActivity.this.getApplicationContext(),c);
startActivity(intent);
}

catch(Exception e){
e.printStackTrace();
}

但是,在执行前面的代码后,应用程序崩溃并出现以下异常

android.content.ActivityNotFoundException: Unable to find explicit activity class{com.example.myapplication/com.example.myapplication2.MainActivity}; have you declared this activity in your AndroidManifest.xml?
 at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2005)
 at android.app.Instrumentation.execStartActivity(Instrumentation.java:1673)
 at android.app.Activity.startActivityForResult(Activity.java:4586)
 at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:728)
 at android.app.Activity.startActivityForResult(Activity.java:4544)
 at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:709)
 at android.app.Activity.startActivity(Activity.java:4905)
 at android.app.Activity.startActivity(Activity.java:4873)
 at com.example.myapplication.MainActivity$1.onClick(MainActivity.java:82)
 at android.view.View.performClick(View.java:6597)
 at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1219)
 at android.view.View.performClickInternal(View.java:6574)
 at android.view.View.access$3100(View.java:778)
 at android.view.View$PerformClick.run(View.java:25885)
 at android.os.Handler.handleCallback(Handler.java:873)
 at android.os.Handler.dispatchMessage(Handler.java:99)
 at android.os.Looper.loop(Looper.java:193)
 at android.app.ActivityThread.main(ActivityThread.java:6669)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

此外,我注意到 dex 文件的大多数示例包含普通的 java 类而不是活动类,所以我想知道我正在尝试做的事情是否适用以及超出例外的原因

java android apk dex
1个回答
0
投票
  1. 添加依赖build.gradle文件

    实现'androidx.multidex:multidex:2.0.1'

  2. build.gradle 中的 app 文件夹

    multiDexEnabled 真

© www.soinside.com 2019 - 2024. All rights reserved.