2013-04-02 16 views
2

我試圖根據我的需要調整http://android-developers.blogspot.de/2011/07/custom-class-loading-in-dalvik.html的示例。對於這一點,我有3個項目的設置:自定義類加載失敗,java.lang.IllegalAccessError:預驗證類中的類ref已解析爲意外的實現

classloadingtest: 包含在MainActivity的來源在上面的鏈接標準的Android應用程序項目,略作調整(移動DexClassLoader業務名爲「AndroidClassLoader」級),引用下面的「IFACE」項目

IFACE: 含有隻是一個接口僅具有一個功能(「的getMessage()」)返回字符串的機器人庫項目

可加載: 標準機器人應用項目也引用只包含一個類的「iface」庫很簡單的界面,並用custom_rules.txt文件調整構建過程:

<?xml version="1.0" encoding="UTF-8"?> 
<project name="BuildLoadableDex" default="debug"> 
    <target name="-dex" depends="-compile, -post-compile, -obfuscate"> 
     <echo level="info">Custom -dex target</echo> 
     <property name="out.dex.input.absolute.dir" value="${out.classes.absolute.dir}" /> 
     <dex executable="${dx}" 
       output="${intermediate.dex.file}" 
       dexedlibs="${out.dexed.absolute.dir}" 
       nolocals="@{nolocals}" 
       forceJumbo="${dex.force.jumbo}" 
       disableDexMerger="${dex.disable.merger}" 
       verbose="${verbose}"> 
      <path path="${out.dex.input.absolute.dir}"/> 
     </dex> 
    </target> 

    <target name="-package" depends="-dex, -package-resources"> 
     <echo level="info">Custom -package target</echo> 
     <jar destfile="${out.absolute.dir}/${ant.project.name}.jar" 
      basedir="${out.absolute.dir}" 
      includes="${dex.file.name}" /> 
    </target> 
</project> 

所以這基本上只是修改-dex目標從classes.dex文件離開了庫類(通過dexdump不顯示驗證接口)並更改-package目標以輸出jar文件而不是apk。

然後我將loadable.jar文件複製到classloadingtest/assets並構建該apk文件。

一切編譯罰款,但運行和觸發類加載的時候,我得到了下面的堆棧跟蹤:

W/dalvikvm(14393): Class resolved by unexpected DEX: Lloadable/Test;(0x4294b620):0x5a6a7000 ref [Lclassloading/iface/LoadableClass;] Lclassloading/iface/LoadableClass;(0x42912fb8):0x5a4bf000 
W/dalvikvm(14393): (Lloadable/Test; had used a different Lclassloading/iface/LoadableClass; during pre-verification) 
I/dalvikvm(14393): Failed resolving Lloadable/Test; interface 6 'Lclassloading/iface/LoadableClass;' 
W/dalvikvm(14393): Link of class 'Lloadable/Test;' failed 
D/AndroidRuntime(14393): Shutting down VM 
W/dalvikvm(14393): threadid=1: thread exiting with uncaught exception (group=0x41c622a0) 
E/AndroidRuntime(14393): FATAL EXCEPTION: main 
E/AndroidRuntime(14393): java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation 
E/AndroidRuntime(14393):  at dalvik.system.DexFile.defineClass(Native Method) 
E/AndroidRuntime(14393):  at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:211) 
E/AndroidRuntime(14393):  at dalvik.system.DexPathList.findClass(DexPathList.java:315) 
E/AndroidRuntime(14393):  at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:58) 
E/AndroidRuntime(14393):  at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 
E/AndroidRuntime(14393):  at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 
E/AndroidRuntime(14393):  at classloading.loading.AndroidClassLoader.findClass(AndroidClassLoader.java:56) 
E/AndroidRuntime(14393):  at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 
E/AndroidRuntime(14393):  at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 
E/AndroidRuntime(14393):  at classloading.loading.AndroidClassLoader.loadClass(AndroidClassLoader.java:37) 
E/AndroidRuntime(14393):  at classloading.ClassLoadingTest$1.onClick(ClassLoadingTest.java:60) 
E/AndroidRuntime(14393):  at android.view.View.performClick(View.java:4211) 
E/AndroidRuntime(14393):  at android.view.View$PerformClick.run(View.java:17267) 
E/AndroidRuntime(14393):  at android.os.Handler.handleCallback(Handler.java:615) 
E/AndroidRuntime(14393):  at android.os.Handler.dispatchMessage(Handler.java:92) 
E/AndroidRuntime(14393):  at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(14393):  at android.app.ActivityThread.main(ActivityThread.java:4898) 
E/AndroidRuntime(14393):  at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(14393):  at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(14393):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
E/AndroidRuntime(14393):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
E/AndroidRuntime(14393):  at dalvik.system.NativeStart.main(Native Method) 

我做得到,這意味着某種程度上的LoadableClass接口「似乎」有存在兩次差異,但我不明白這是怎麼發生的,看到APK(classloadingtest)和loadable.jar使用完全相同的庫項目進行編譯,因此我不知道如何解決這個錯誤。

請隨時申請編輯更多的代碼,我只是不知道什麼可能有用,並且不想粘貼的一切

+0

如果不'custom_rules.txt文件調整構建過程',有什麼錯誤,你有嘗試嗎? – Trinea

回答

1

解決了愚蠢,我一直在嘗試加載舊版本的loadable.jar。留在這裏讓其他人可能會受益,而不會浪費那麼多時間。

相關問題