http://android-developers.blogspot.de/2011/07/custom-class-loading-in-dalvik.htmlの例を自分のニーズに合わせて調整しようとしています。このために、私は3つのプロジェクトのセットアップを持っています:
classloadingtest: 上記のリンクの MainActivity のソースを含む標準の Android アプリケーション プロジェクトを少し調整 (DexClassLoader ビジネスを「AndroidClassLoader」という名前のクラスに移動)、以下の「iface」プロジェクトを参照
iface: 文字列を返す関数 ("getMessage()") を 1 つだけ持つインターフェイスのみを含む Android ライブラリ プロジェクト
ロード可能: 標準の Android アプリケーション プロジェクトも、非常に単純なインターフェイスを実装するクラスを 1 つだけ含む "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 ターゲットを変更して apk ではなく jar ファイルを出力します。
次に、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 インターフェイスが違いを伴って 2 回存在するように見えることを意味しますが、APK (classloadingtest) と loadable.jar の両方がまったく同じライブラリ プロジェクトを使用していることを確認すると、これがどのように発生するのか理解できません。コンパイルするため、このエラーを修正する方法がわかりません。
より多くのコードで編集をリクエストしてください.