• 资源列表-GPRS


    1.GPRS的调用是通过ConnectivityManager.setMobileDataEnabled方法

    2.官方把方法定义为private类型来对外禁用,需要java中的反射调用

    3.反射机制会不会在smali文件中体现出调用底层方法的痕迹呢?

    4.关键代码:

    private ConnectivityManager mCM;
    
    mCM = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);    
    
    Class cmClass       = mCM.getClass();    
    
    Class[] argClasses  = new Class[1];    
    
    argClasses[0]       = boolean.class;    
    
    try    
    
    {    
    
            Method method = cmClass.getMethod(methodName, argClasses);    
    
        method.invoke(mCM, isEnable);    
    
    } catch (Exception e)    
    
    {    
    
          e.printStackTrace();    
    
    }    

     5.反编译出来的smali文件长这样:

    .method private setGprsEnabled(Ljava/lang/String;Z)V
        .locals 8
        .param p1, "methodName"    # Ljava/lang/String;
        .param p2, "isEnable"    # Z
    
        .prologue
        const/4 v6, 0x1
    
        const/4 v5, 0x0
    
        .line 78
        iget-object v4, p0, Lcom/example/gprstest/MainActivity;->mCM:Landroid/net/ConnectivityManager;
    
        invoke-virtual {v4}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
    
        move-result-object v1
    
        .line 79
        .local v1, "cmClass":Ljava/lang/Class;
        new-array v0, v6, [Ljava/lang/Class;
    
        .line 80
        .local v0, "argClasses":[Ljava/lang/Class;
        sget-object v4, Ljava/lang/Boolean;->TYPE:Ljava/lang/Class;
    
        aput-object v4, v0, v5
    
        .line 84
        :try_start_0
        invoke-virtual {v1, p1, v0}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
    
        move-result-object v3
    
        .line 85
        .local v3, "method":Ljava/lang/reflect/Method;
        iget-object v4, p0, Lcom/example/gprstest/MainActivity;->mCM:Landroid/net/ConnectivityManager;
    
        const/4 v5, 0x1
    
        new-array v5, v5, [Ljava/lang/Object;
    
        const/4 v6, 0x0
    
        invoke-static {p2}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
    
        move-result-object v7
    
        aput-object v7, v5, v6
    
        invoke-virtual {v3, v4, v5}, Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
        :try_end_0
        .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0
    
        .line 90
        .end local v3    # "method":Ljava/lang/reflect/Method;
        :goto_0
        return-void
    
        .line 86
        :catch_0
        move-exception v2
    
        .line 88
        .local v2, "e":Ljava/lang/Exception;
        invoke-virtual {v2}, Ljava/lang/Exception;->printStackTrace()V
    
        goto :goto_0
    .end method

    6.只有反射的痕迹......如何知道底层的调用?

    7.最后附上以后学习可以参考的网址:

    http://zwz94.blog.163.com/blog/static/3206039520140259468250/

    http://www.blogjava.net/midea0978/archive/2012/01/04/367847.html

    http://bbs.pediy.com/showthread.php?p=1117963

    好吧,经过学长解答,具体的反射函数需要在寄存器中查看...

  • 相关阅读:
    idea插件-RestfulToolkit
    java 调试技巧
    js foreach 不能中断的现象及理解
    SpringBoot 内嵌Tomcat的默认线程配置
    SpringMVC中从doDispatch如何一步步调用到controller的方法
    干掉hao123的第n+1种方法
    查找——二叉排序树(代码超详细注释)
    为什么单螺旋桨飞机会左偏?
    【转】Python 魔法方法大全
    通俗的讲解Python中的__new__()方法
  • 原文地址:https://www.cnblogs.com/o-din/p/5441577.html
Copyright © 2020-2023  润新知