2017-04-06 10 views
0
private void cghookMInstrumentation() throws Exception { 

    //get mInstrumentation 
    Class<?> activityThreadClass = Class.forName("android.app.ActivityThread"); 
    Method currentActivityThread = activityThreadClass.getDeclaredMethod("currentActivityThread"); 
    currentActivityThread.setAccessible(true); 
    Object sCurrentActivityThread = currentActivityThread.invoke(null);//ActivityThread instance 

    Method getInstrumentation = activityThreadClass.getDeclaredMethod("getInstrumentation"); 
    getInstrumentation.setAccessible(true); 
    Instrumentation instrumentation = (Instrumentation) getInstrumentation.invoke(sCurrentActivityThread);//Instrumentation 

    Field mInstrumentationField = activityThreadClass.getDeclaredField("mInstrumentation"); 
    mInstrumentationField.setAccessible(true); 

    Enhancer enHancer = new Enhancer(); 
    CglibProxy cglibProxy = new CglibProxy(); 
    enHancer.setSuperclass(instrumentation.getClass()); 
    enHancer.setCallback(cglibProxy); 

    Instrumentation mInstrumentation = (Instrumentation) enHancer.create(); 

    //replace Instrumentation 
    mInstrumentationField.set(instrumentation, mInstrumentation); 
} 

と例外ました:私はCGLIBを使用してcontext.startActivityをフックしたいのですが、例外

Caused by: java.lang.UnsupportedOperationException: can't load this type of class file 
at java.lang.ClassLoader.defineClass(ClassLoader.java:300) 
at java.lang.reflect.Method.invoke(Native Method)  
at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:384)  
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:219)  
at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)  
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:117)  
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)  
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)  
at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)  
at cn.chx.hooklib.CgLibHookClickListener.cghookMInstrumentation(CgLibHookClickListener.java:52)  
at cn.chx.hooklib.CgLibHookClickListener.onClick(CgLibHookClickListener.java:28)  
at android.view.View.performClick(View.java:5198)  
at android.view.View$PerformClick.run(View.java:21147)  
at android.os.Handler.handleCallback(Handler.java:739)  
at android.os.Handler.dispatchMessage(Handler.java:95)  
at android.os.Looper.loop(Looper.java:148)  
at android.app.ActivityThread.main(ActivityThread.java:5417)  
at java.lang.reflect.Method.invoke(Native Method)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

は、私はクラスがInstrumentationを拡張書くcontext.startActivity

ActivityThread -> currentActivityThread() -> mInstrumentation 

をフックしたいですmInstrumentationFieldに設定してもうまく動作しますが、私はこの例外を持っています。

私は何か助けていただきありがとうございます。

答えて

0

CglibはAndroidでは動作しません。あなたがしようとしていることは不可能です。 Byte BuddyをAndroid用のクラスローディング戦略が含まれているAndroidのプロキシ作成を可能にすることもできます。

+0

だと思いますがなぜですか?デクスについてですか? – Hansey

+0

Androidは、JVMとは異なるクラスファイル形式を使用します。一部のAndroid VM(ART)では、実際のマシンコードを使用してAndroidアプリケーションを記述しています。 –

+0

ok.i参照、考えて! – Hansey

関連する問題