文章目录
一、DEX 字节码文件准备
二、拷贝 Assets 目录下的 classes2.dex 字节码文件到内置存储区
三、在 AndroidManifest.xml 清单文件中配置组件
四、启动 DEX 文件中的 Activity
一、DEX 字节码文件准备
在 dex_demo 应用 Module 中 , 创建 com.example.dex_demo.MainActivity2 类 ;
代码主要内容为 :
package com.example.dex_demo; import android.os.Bundle; import android.util.Log; import androidx.appcompat.app.AppCompatActivity; public class MainActivity2 extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i("MainActivity2", "com.example.dex_demo.MainActivity2 onCreate"); } }
编译上述 Module 生成 APK 文件 dex_demo-debug.apk , 解压 APK 文件到 dex_demo-debug 目录中 , 将 dex_demo-debug 目录中的 classes.dex 复制一份 , 重名为 classes2.dex , 这是为了与上一个示例中的文件重名而修改的 ;
二、拷贝 Assets 目录下的 classes2.dex 字节码文件到内置存储区
将 app\src\main\assets\classes2.dex 文件 , 拷贝到 /data/user/0/com.example.classloader_demo/files/classes2.dex 位置 ;
最终的拷贝结果如下 :
代码示例 :
/** * 测试调用 Dex 字节码文件中的方法 * @param context * @param dexFilePath */ private void testDex(Context context, String dexFilePath) { // 优化目录 File optFile = new File(getFilesDir(), "opt_dex"); // 依赖库目录 , 用于存放 so 文件 File libFile = new File(getFilesDir(), "lib_path"); // 初始化 DexClassLoader DexClassLoader dexClassLoader = new DexClassLoader( dexFilePath, // Dex 字节码文件路径 optFile.getAbsolutePath(), // 优化目录 libFile.getAbsolutePath(), // 依赖库目录 context.getClassLoader() // 父节点类加载器 ); // 加载 com.example.dex_demo.DexTest 类 // 该类中有可执行方法 test() Class<?> clazz = null; try { clazz = dexClassLoader.loadClass("com.example.dex_demo.DexTest"); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 获取 com.example.dex_demo.DexTest 类 中的 test() 方法 if (clazz != null) { try { // 获取 test 方法 Method method = clazz.getDeclaredMethod("test"); // 获取 Object 对象 Object object = clazz.newInstance(); // 调用 test() 方法 method.invoke(object); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }