2011-12-06 13 views
8

主な目標は、Androidシステムクラス(アクティビティ、ビューなど)を自分の実装でオーバーライドすることです。カスタムクラスローディングのためAndroidクラスのロード/オーバーライドカスタムクラス

http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html

クラスローダは、非システムクラス(カスタムクラス)をロードし、実装されて動作します。

しかし、私は私の実装での活動をロードしよう - クラスローダがすでにキャッシュ内にこのクラスを持っているので、それは、ロードされません。

私は代わりに自分のクラスを注入するクラスローダを変更するにはどうすればよい
/** 
* Returns the class with the specified name if it has already been loaded 
* by the virtual machine or {@code null} if it has not yet been loaded. 
* 
* @param className 
*   the name of the class to look for. 
* @return the {@code Class} object or {@code null} if the requested class 
*   has not been loaded. 
*/ 
protected final Class<?> findLoadedClass(String className) { 
    ClassLoader loader; 
    if (this == BootClassLoader.getInstance()) 
     loader = null; 
    else 
     loader = this; 
    return VMClassLoader.findLoadedClass(loader, className); 
} 

をシステムの?

答えて

0

クラスがRootClassLoaderによってロードされると、クラスが最初にアンロードされない限り、再度ロードすることはできません。ただし、クラスのアンロードは、DVMによって自動的に管理されるプロセスです。私も同じ問題で悩んでいます。

3

ブログ投稿からthis solutionが見つかりました。むしろ、リンクをポストするのはスタックオーバーフローポリシーに反しているのですが、テキストは大きすぎて転送されません。

考え方は、低レベルのクラスローディングメカニズムを無効にし、メソッドの実行方法をオーバーライドするCコードを書くことです。これが誰かに助けになるかもしれないことを願っています。