19

を使用するサードパーティの jar (変更できません) がjava.beans.Introspectorありjava.beans.BeanInfoますjava.beans.PropertyDescriptor

Android アプリケーションでその jar を使用するにはどうすればよいですか?

Introspectorサードパーティの jar からのクラス (を使用) のロードに失敗します。

WARN/dalvikvm(780): VFY: unable to resolve static method 6325: Ljava/beans/Introspector;.getBeanInfo (Ljava/lang/Class;)Ljava/beans/BeanInfo;
WARN/dalvikvm(780): VFY: unable to resolve exception class 962 (Ljava/beans/IntrospectionException;)
WARN/dalvikvm(780): Verifier rejected class Lorg/thirdpartyjar/SomeClass;
4

2 に答える 2

18

Android では java.beans パッケージが完全ではないことは明らかです。そして、一般的な解決策は、java.beans とそれらに依存する jar の両方を再パッケージ化して、java.beans の代わりに別のパッケージ名を使用することです。これは、前述の openbeans が行うこととまったく同じです。Android エラー メッセージの興味深い引用文には次のように記載されています。If you find that you cannot do this, then that is an indication that the path you are on will ultimately lead to pain, suffering, grief, and lamentation.

このパスを回避するために、実際に openbeans を使用するオプションを調べ、サードパーティにそれらを使用させるようにすることから始めます。あなたが書いていることから、jarを変更できないのか、それとも変更が許可されていないのかは明らかではありません(両方について言及しています)。jar を変更することの法的影響はわかりませんが、技術的にはいつでも可能です。たとえば、リバース エンジニアリング クラスを試したり、aspectj のようなものでビルド時の計測を行ったりします。これが許可されていない場合は、ランタイム インストルメンテーションを実行できると思います。たとえば、dexmakerは、java.beans を使用しているサードパーティ クラスのプロキシを作成でき、このクラスの一部を再実装できます。

また、私がこれを見たトピックについて少しグーグルで調べました。彼らは単に java.beans パッケージを使用し、Android 用にコンパイルします。これは私には壊れやすいようですが、機能しているようです。

残念ながら、これは解決策ではなく、共有したいアイデアです。それらがお役に立てば幸いです。

于 2013-03-03T11:15:44.213 に答える
11

唯一の解決策はメンテナンスの悪夢です。ソースからすべてのサードパーティの jar をフォークし、それらを書き換えて、java.beans.* クラスを使用しないようにします(おそらくそれらを openbeans に置き換えることによって)。

次に、これらのサード パーティの jar のいずれかがホットフィックスをリリースするたびに (たとえば、重大なセキュリティ バグの場合)、それを最初からやり直します。

于 2013-03-05T14:38:34.197 に答える