9

一般的な質問: ClassLoader を使用して、事前にロードされた (システムによって、たとえば Android の%android%/frameworks/base/preloaded-classesファイルにある) クラスを置き換えることは可能ですか?

特定: アプリケーションで WebView を作成する前に、DexClassLoader を使用して android.net.* にあるクラスを置き換えようとしています。Class オブジェクトを取得できますが、たとえば getMethods() は、変更されていない/元のクラスの実装で期待される配列を提供します。これは preloaded-classes システムによるものですか?

基本的なセットアップと疑似コード:

  1. android.net.* クラスを変更し、いくつかのテスト メソッドなどを追加します。
  2. コンパイルして、classes.dex で終了します。
  3. jar cf mytest.jar classes.dex
  4. APK アセットに mytest.jar を含める
  5. DexClassLoader を作成し、loadClass() を介してクラスを取得します
  6. クラス オブジェクトの getMethods() は、#1 に存在する変更なしで表示されると予想される配列を返します

使用しているセットアップの詳細と、必要に応じてコードを提供できます。

4

1 に答える 1

8

いいえ、あなたがすることはできません。WebView はブート クラス パスの一部であり、基本クラス ローダーです。別のクラスローダーのクラスを使用するためにできることは何もありません。実際、アプリが起動される前に (zygote プロセスの事前初期化の一部として) 既に読み込まれ、使用するクラスにリンクされています。

于 2011-08-17T07:45:17.877 に答える