2

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 の両方がまったく同じライブラリ プロジェクトを使用していることを確認すると、これがどのように発生するのか理解できません。コンパイルするため、このエラーを修正する方法がわかりません。

より多くのコードで編集をリクエストしてください.

4

1 に答える 1

1

愚かさは解決しました。古いバージョンの loadable.jar をロードしようとしています。これをここに残しておくと、他の人が利益を得て、それほど多くの時間を無駄にしないかもしれません.

于 2013-04-02T18:10:36.330 に答える