4

Android アプリケーションのプラグイン アーキテクチャをまとめようとしています。apk「プラグイン」ファイルのディレクトリを調べ、それらを DexClassLoader にロードし、メソッドを呼び出して DerivedLibraryObjects の配列を取得するホスト アプリケーションがあります。

問題は、DerivedLibraryObject が外部 JAR ライブラリに含まれる基本クラスを拡張することだと思います。したがって、ホストとプラグインの両方がこの JAR を参照します。DerivedLibraryObjects の配列を取得しようとすると、次の例外が発生します。

04-01 14:26:57.996: ERROR/AndroidRuntime(23386): java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

私が収集したものから、これはプラグイン内のオブジェクトがホスト内のオブジェクトと一致しないことを意味します。ただし、ホスト アプリケーションとプラグイン アプリケーションの両方が、まったく同じ jar ファイルのコピーにリンクしています。Object を単純に拡張したオブジェクトを返すと、コードは正常に機能しますが、DerivedLibraryObject の処理を​​開始するとすぐに、このエラーがスローされます。

誰か提案はありますか?

4

2 に答える 2

4

私は自分の質問に答えることができます-問題は、ホストとプラグインの両方に外部jarライブラリが含まれているため、クラスローダーが同じクラスの2つのバージョンがあることを発見すると、ベイルします。

あなたができることは、すべてをクラスファイルにコンパイルしてプラグインを手動で構築し (私は Eclipse にこれをさせます)、次に dex を使用して jar/apk を構築することです:

dx --dex --output=<outputdir>\plugin.jar <projectpath>\bin\

projectpath は、Android プロジェクトのルートです。bin ディレクトリに降りると、クラス ファイルが見つかるはずです。

誰かがこれを行うための ant スクリプトを投稿できれば、この質問に追加するとよいでしょう。

于 2011-04-01T21:16:11.180 に答える
0

私はmavenで同じ問題を管理しました。秘訣は、common-library をホスト アプリにのみ含め、プラグインには含めないことです。

これが私のプロジェクトのポンポンの一部です。

共通ライブラリ ポン

(apklib パッケージを使用して)andriod ライブラリとしてビルドし、build-helper-maven-plugin を使用して追加の *jar ファイルをインストールします。

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>build-helper-maven-plugin</artifactId>
   <version>1.7</version>
   <executions>
      <execution>
         <id>attach-artifacts</id>
         <phase>package</phase>
         <goals>
            <goal>attach-artifact</goal>
         </goals>
         <configuration>
            <artifacts>
               <artifact>
                  <file>${basedir}/target/${project.build.finalName}.jar</file>
                  <type>jar</type>
               </artifact>
            </artifacts>
         </configuration>
      </execution>
   </executions>
</plugin>

ホスト アプリケーションの pom include 共通ライブラリへの依存関係

<dependency>
   <groupId>group.id</groupId>
   <artifactId>artifact-id</artifactId>
   <version>common-library-version</version>
   <type>apklib</type>
</dependency>

プラグインの pom は、指定されたスコープで *.jar 依存関係を使用します。Apklib の依存関係は、指定されたスコープをサポートしていません。

<dependency>
   <groupId>your.common.library.group</groupId>
   <artifactId>Your-common-lib-id</artifactId>
   <version>your-common-lib-version</version>
   <scope>provided</scope>
</dependency>

最後に、ある種のアセンブラー プロジェクトを作成し、その pom ファイルに 3 つのプロジェクトすべてを含めます。

maven3とandroid-maven-plugin 3.2.0で問題なく動作します

于 2012-05-24T11:48:56.960 に答える