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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發(fā)布時間:2025/6/17 Android 36 豆豆

文章目錄

  • 一、使用 DexClassLoader 獲取組件類失敗報錯
  • 二、失敗原因分析





一、使用 DexClassLoader 獲取組件類失敗報錯



在上一篇博客 【Android 逆向】啟動 DEX 字節(jié)碼中的 Activity 組件 ( DEX 文件準(zhǔn)備 | 拷貝資源目錄下的文件到內(nèi)置存儲區(qū) | 配置清單文件 | 啟動 DEX 文件中的組件 | 執(zhí)行結(jié)果 ) 中 , 嘗試啟動 DEX 字節(jié)碼文件中的 Activity 組件 , 出現(xiàn)如下報錯信息 :

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)





二、失敗原因分析



使用 DexClassLoader 加載普通的類 com.example.dex_demo.DexTest 并執(zhí)行器 test() 方法 , 是可以執(zhí)行成功的 ; 但是加載 Activity 組件類失敗了 ;

其中的最主要原因是 , 類加載器的雙親委派機制 , 加載 Android 組件類需要使用系統(tǒng)指定的類加載器 , 這些類加載器設(shè)置在 LoadedApk 實例對象中 , 并且這些類加載器只能從特定位置加載字節(jié)碼文件 ;

自己自定義的 DexClassLoader 沒有加載組件類的權(quán)限 ;


如果要加載組件類 , 有兩種方案 :

  • 替換類加載器 : 使用自定義的 DexClassLoader 類加載器替換 ActivityThread 中的 LoadedApk 中的類加載器 , 將原來的 LoadedApk 中的類加載器設(shè)置為新的父節(jié)點類加載器 ;
  • 插入類加載器 : 基于雙親委派機制 , 只要將我們自定義的類加載器插入到系統(tǒng)類加載器之上就可以 , 在 組件類加載器 和 最頂層的啟動類加載器之間插入自定義的 DexClassLoader 類加載器即可 ;

總結(jié)

以上是生活随笔為你收集整理的【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。