如何调用Android隐藏API

 我来答
du基咪7649ca
推荐于2016-09-05 · TA获得超过2540个赞
知道大有可为答主
回答量:3097
采纳率:30%
帮助的人:1760万
展开全部
一、如何隐藏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的方式挂载
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式