文章目录

  • 一、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 {@Overrideprotected 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");// 初始化 DexClassLoaderDexClassLoader 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();}}}

三、在 AndroidManifest.xml 清单文件中配置组件


com.example.dex_demo.DexTest 组件类配置到 AndroidManifest.xml 清单文件中 ;

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.classloader_demo"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.ClassLoader_Demo"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name="com.example.dex_demo.MainActivity2"/></application></manifest>

四、启动 DEX 文件中的 Activity


初始化 DexClassLoader 类加载器 , 加载 com.example.dex_demo.MainActivity2 类 , 然后直接启动该组件 ;

代码示例 :

    /*** 不修改类加载器的前提下* @param context* @param dexFilePath*/private void startDexActivityWithoutClassLoader(Context context, String dexFilePath) {// 优化目录File optFile = new File(getFilesDir(), "opt_dex");// 依赖库目录 , 用于存放 so 文件File libFile = new File(getFilesDir(), "lib_path");// 初始化 DexClassLoaderDexClassLoader 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.MainActivity2");} catch (ClassNotFoundException e) {e.printStackTrace();}// 启动 com.example.dex_demo.MainActivity2 组件if (clazz != null) {context.startActivity(new Intent(context, clazz));} }

执行结果 :

2021-12-12 01:02:01.431 25158-25158/? E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.example.classloader_demo, PID: 25158java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.classloader_demo/com.example.dex_demo.MainActivity2}: java.lang.ClassNotFoundException: Didn't find class "com.example.dex_demo.MainActivity2" on path: DexPathList[[zip file "/data/app/com.example.classloader_demo-sAY0kit-c9kqTzgMRXYoBA==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.classloader_demo-sAY0kit-c9kqTzgMRXYoBA==/lib/arm64, /system/lib64]]at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2881)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)at android.os.Handler.dispatchMessage(Handler.java:106)at android.os.Looper.loop(Looper.java:193)at android.app.ActivityThread.main(ActivityThread.java:6718)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)Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.dex_demo.MainActivity2" on path: DexPathList[[zip file "/data/app/com.example.classloader_demo-sAY0kit-c9kqTzgMRXYoBA==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.classloader_demo-sAY0kit-c9kqTzgMRXYoBA==/lib/arm64, /system/lib64]]at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)at java.lang.ClassLoader.loadClass(ClassLoader.java:379)at java.lang.ClassLoader.loadClass(ClassLoader.java:312)at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69)at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)at android.app.Instrumentation.newActivity(Instrumentation.java:1215)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2869)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6718) 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)

【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区 | 配置清单文件 | 启动 DEX 文件中的组件 | 执行结果 )相关推荐

  1. 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )

    文章目录 一.使用 DexClassLoader 获取组件类失败报错 二.失败原因分析 一.使用 DexClassLoader 获取组件类失败报错 在上一篇博客 [Android 逆向]启动 DEX ...

  2. 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )

    文章目录 一.拷贝 Assets 目录下的 classes.dex 字节码文件到内置存储区 二.加载 DEX 文件并执行其中的方法 三.MainActivity 及执行结果 四.博客资源 一.拷贝 A ...

  3. 【Android 插件化】Hook 插件化框架 ( 创建插件应用 | 拷贝插件 APK | 初始化插件包 | 测试插件 DEX 字节码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  4. 在 Java 中,如何批量读取本项目资源目录下的所有文件

    在 Java 中,如何批量读取本项目资源目录下的所有文件 读取资源目录下的指定文件 方法 1:使用 JDK 中原始 API 方法 2:借助 Spring 附录 将 InputStream 转化为 by ...

  5. 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader )

    文章目录 前言 一.在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader 1.创建 DexClassLoader 2.使用 DexClassL ...

  6. 【Android Gradle 插件】DexOptions 配置 ⑤ ( additionalParameters 属性配置 | --minimal-main-dex 参数最小化主 dex 字节码 )

    文章目录 一.dx --minimal-main-dex 参数 1.参数简介 2.配置 main dex 保留文件 3.配置 android#buildTypes 4.配置 android#dexOp ...

  7. 【Android 安装包优化】Android 应用中 7zr 可执行程序准备 ( Android Studio 导入可执行 7zr 程序 | 从 Assets 资源文件拷贝 7zr 到内置存储 )

    文章目录 一.Android Studio 导入可执行 7zr 程序 二.从 Assets 资源文件拷贝 7zr 到内置存储空间 三.参考资料 一.Android Studio 导入可执行 7zr 程 ...

  8. android存储文件数据恢复,教程:如何恢复安卓设备内置存储中已删除的文件

    感谢网友mumu214的投稿: 大家好,本教程将指导你如何恢复从任何Android设备的内置存储中删除的文件. 在开始之前先介绍一些数据恢复方面的基础知识: 想必大家在平常使用可存储设备(包括电脑.手 ...

  9. android文件恢复功能,安卓设备内置存储中已删除的文件如何恢复

    在开始之前先介绍一些数据恢复方面的基础知识: 想必大家在平常使用可存储设备(包括电脑.手机.U盘.移动硬盘等等)都会有遇到这种情况:不小心删除(包括直接删除.清空回收站.格式化.重新分区等)了一些存储 ...

最新文章

  1. Ms Sql Server 基本管理脚本(1)
  2. Data Guard搭建困境突围(一)
  3. opencv连通域去除小块面积_晋中市建成区面积排名,榆次区最大,榆社县最小,来了解一下?...
  4. TJA1050只能RX不能TX
  5. 【ubuntu-anaconda-dlib】undefined symbol: _ZTTNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESa
  6. 计算机软件记不住设置,想知道电脑密码记不住了怎么办
  7. antd vue表单上传文件_vue+axios+antD的上传图片踩坑
  8. nt6启动菜单自动修复工具_轻量级windows系统修复,清理工具——Dism++
  9. eval()函数和zip()函数用法、enumerate()
  10. java web项目自动部署到Tomcat的原因
  11. Dell R720服务器安装Ubuntu 16.04 Server 版步骤
  12. C++程序注册Dll
  13. WKWebView OC与JS交互
  14. vCenter Server 相关介绍
  15. 多种方式带你玩转 javascript 实现关闭浏览器页签
  16. 如何过滤好的和坏的价格交易信号
  17. 八、Pytorch学习之十九种损失函数
  18. 4月上旬国内网站流量:360安全中心超淘宝居第三
  19. 批量采集多个淘宝商品的洋淘买家秀图片并统一保存
  20. hypermesh 连接单元_Hypermesh三维网格划分技能,以汽车发动机连杆结构为例

热门文章

  1. python 输入纯数字
  2. 图形学相关期刊和会议的基本信息
  3. 关于AR识别地面的个人理解
  4. 设计模式COF23【单例模式】
  5. 欢迎您来到谷歌搜索在中国的新家 Google.com.hk
  6. UVM——sequence、sequencer、driver概述
  7. w ndows9,第9章 Wndows窗体应用程序开发.ppt
  8. python 类函数调用外部函数_python类中调用外部函数,python 函数中 定义类
  9. Docker 文件存储驱动:AUFS 文件系统原理及生产环境的最佳配置
  10. QT制作计算器终极版