Android利用反射调用影藏API

原文链接:http://bbs.51cto.com/thread-1035852-1.html

作为Android应用的开发者,在Android平台上开发,最熟悉的莫过于Android SDKSDK给开发者带来的巨大的便利,使得Android平台的应用开发效率大大提高。不过遗憾的是,Android的功能远不止SDK暴露的那么多,还有很多隐藏的东西Google都没有通过SDK暴露给用户开发者。查看Android源代码时就会发现,这些隐藏的API都有一个共同的特点:类或者方法前都有@hide。如图:

 

一、 如何隐藏 API 的?
1)
在正常情况下,即不加 @hide 的时候,所有的 public 的类或者方法,在编译时都会编译生成到 stub library jar 文件中。这个 stub library 其实是个空实现,但是它包含了所有的 public 方法。所以用这个 stub library ,应用开发者就可以在 eclipse 中进行开发了。
2)
但一旦加了 @hide ,那么在编译生成 stublibrary 时,凡是被 @hide 标记的类或者方法都被移除了。所以应用开发者就无法通过这个 stub library “直接”调用被隐藏的类或者方法。如果强行在 eclipse 里调用隐藏的类或者方法,则 eclipse 会报错。典型的例子就是 Android SDK 中的 android.jar ,这个 stub library 所包含的就是已经被移除的的 API 。上图中, ActivityManager forceStopPackage() 方法在 Android SDK 中是无法找到的。
二、 隐藏的 API 可以调用吗?
1)
那么应用开发者可以使用这些隐藏的 API 答案是肯定的。在真实的运行环境中,所有的 API 都是存在的并且是被实现的。那么很容易就会想到用“反射”。如果我们已经知道目标类的类名和方法名,以及参数列表,那么这样的方法即使被 @hide 了,我们依然可以通过反射来调用它。对于 Java 反射,这里我们不准备展开,不是很了解的同学请自行学习研究。下面是一个反射的例子。
IActivitManageram = ActivityManagerNative.getDefault();
Method forceStopPackage = am.getClass().getDeclaredMethod("forceStopPackage", String.class); forceStopPackage.setAccessible(true); 
forceStopPackage.invoke(am, yourpkgname);  


2)
反射虽好,不过写起来真麻烦,本来一个调用代码,一行就可以搞定,但是现在用发射写的话,需要好多行。有没有其他更加方便的办法呢,其实是有的。上面我们提到在 Android SDK 中的 android.jar 是一个阉割版,如果我们能生成一个完整版,这个问题就迎刃而解了。方法是现在整套 Android 源代码,然后做一次完整的编译。在 out/target/common/obj/JAVA_LIBRARIES/ 目录下可以根据需要提取自己所要的 stublibrary 。以 framework 为例 : out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar 复制到 eclipse 开发环境中,用 userlibrary 的方式挂载,使其的优先级比 android.jar 要高即可。
以下是在 eclipse 中的设置步骤:
 

 

 

 

 

 

 

 

 

一、 需要注意的一些问题
1)
无论是反射还是使用自编译的 stublibrary ,只能解决调用隐藏 API 的问题,而无法越过权限检查。
2)
Google 之所以将有些 API 隐藏,有些原因可能是因为这些 API 属于内部逻辑,不想对外暴露,也有可能是 API 接口还未最终确定下来。所以在低版本 Android 上的隐藏 API 不一定能在高版本的 Android 上使用。这点是一定要注意的。也就说隐藏 API 的兼容性比较差。因此利用反射调用隐藏 API 时,一定要注意根据 Android 的版本采用不同的方式去反射。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值