恐ろしいメソッド数の制限に常に達している大規模なアプリがあります。プラグインのサポートを含め、もっと多くのことができるようにする方法を考え出すように依頼されました。コードをアンロードする方法を探していると、JNI のヒントに出くわしました。
クラスは、ClassLoader に関連付けられたすべてのクラスがガベージ コレクションできる場合にのみアンロードされます。これはまれですが、Android では不可能ではありません。
これは、次の場合にプラグインをアンロードできることを意味しているように見えました。
DexClassLoader
.jar ファイルごとに新しいものを使用し、- インターフェイス参照を介してのみプラグインを参照し、
- 完了したら、そのインターフェイス参照のすべてのコピーを null にします。
だから、私はテストケースを作成しました:
- それぞれに固有のローダーを使用して、いくつかの簡単なプラグインを作成しました。
ReferenceQueue<ClassLoader>
そのキューを使用して、2 つのローダーへの弱参照を作成しました。無期限にループするスレッドを作成/開始し、キュー.remove()
とレポートを実行しました。- 同様に、キューを使用し
ReferenceQueue<Class<?>>
て各プラグインへの弱参照を作成しました。getClass()
クラス参照キューを監視する別のスレッドを作成/開始しました。 - 1000x1000xARGB_8888 ビットマップを 1000 個作成して、gc を徹底的に強制します。
私の監視スレッドは機能しているようです -誤って両方のプラグインをロードしてloader2
いたときに gc-ed になっているのを見ましloader1
た ;-) - それ以外の場合、私のスレッドは 4.3 でもサイレントのままです。このテストケースで明らかな何かが欠けている可能性がありますか、それともまだそうですか
Dalvik VM は現在、クラスをアンロードしていません
Google の従業員faddenが Android で言うように: クラスはいつシステムによってアンロードされますか?