您的位置:首页 > 其它

资源列表-GPRS

2016-04-28 10:10 302 查看
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
好吧,经过学长解答,具体的反射函数需要在寄存器中查看...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: