如何调用Android隐藏API
查看Android源代码时就会发现,这些隐藏的API都有一个共同的特点:类或者方法前都有@hide。
如何隐藏API:
在正常情况下,即不加@hide的时候,所有的public的类或者方法,在编译时都会编译生成到stub library的jar文件中。这个stub library其实是个空实现,但是它包含了所有的public方法。所以用这个stub library,应用开发者就可以在eclipse中进行开发了;
但一旦加了@hide,那么在编译生成stublibrary时,凡是被@hide标记的类或者方法都被移除了。所以应用开发者就无法通过这个stub library“直接”调用被隐藏的类或者方法。如果强行在eclipse里调用隐藏的类或者方法,则eclipse会报错。典型的例子就是Android SDK中的android.jar,这个stub library所包含的就是已经被移除的的API。上图中,ActivityManager的forceStopPackage()方法在Android SDK中是无法找到的;
隐藏的API可以调用吗? 应用开发者可以使用这些隐藏的API吗?
答案是肯定的。在真实的运行环境中,所有的API都是存在的并且是被实现的。那么很容易就会想到用“反射”。如果我们已经知道目标类的类名和方法名,以及参数列表,那么这样的方法即使被@hide了,我们依然可以通过反射来调用它。