【问题标题】:I want to hook context.startActivity by using cglib, but got an exception我想通过使用 cglib 来挂钩 context.startActivity,但是遇到了异常
【发布时间】:2017-04-06 20:47:55
【问题描述】:
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);
}

还有例外:

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)

我想勾搭context.startActivity

ActivityThread -> currentActivityThread() -> mInstrumentation

我写了一个扩展Instrumentation的类并设置成mInstrumentationField,它工作正常,但是我使用cglib我得到了这个异常;

我将不胜感激。

【问题讨论】:

    标签: java android cglib


    【解决方案1】:

    Cglib 不适用于 Android。你试图做的事情是不可能的。您可以尝试 Byte Buddy 作为替代方案,其中包含适用于 Android 的类加载策略,可以在 Android 上创建代理。

    【讨论】:

    • 想,但为什么?是关于 dex 的吗?
    • Android 使用与 JVM 不同的类文件格式。一些 Android VM (ART) 也使用实际的机器代码来描述 Android 应用程序。
    猜你喜欢
    • 1970-01-01
    • 2020-08-17
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多