如何调用Android隐藏API 作为Android应用的开发者,在Android平台上开发,最熟悉的莫过于android sdkSDK给开发者带来的巨大的便利,使得Android平台的应用开发效率大大提高。不过遗憾的是,Android的功能远不止SDK暴露的那么多,还有很多隐藏的东西Google都没有通过SDK暴露给用户开发者。查看Android源代码时就会发现,这些隐藏的API都有一个共同的特点:类或者方法前都有@hide。如图: <ignore_js_op> 一、如何隐藏API的? 1)在正常情况下,即不加@hide的时候,所有的public的类或者方法,在编译时都会编译生成到stub libraryjar文件中。这个stub library其实是个空实现,但是它包含了所有的public方法。所以用这个stub library,应用开发者就可以在eclipse中进行开发了。 2)但一旦加了@hide,那么在编译生成stublibrary时,凡是被@hide标记的类或者方法都被移除了。所以应用开发者就无法通过这个stub library“直接”调用被隐藏的类或者方法。如果强行在eclipse里调用隐藏的类或者方法,则eclipse会报错。典型的例子就是Android SDK中的android.jar,这个stub library所包含的就是已经被移除的的API。上图中,ActivityManagerforceStopPackage()方法在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中的设置步骤: <ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op> 三、需要注意的一些问题 1)无论是反射还是使用自编译的stublibrary,只能解决调用隐藏API的问题,而无法越过权限检查。 2)Google之所以将有些API隐藏,有些原因可能是因为这些API属于内部逻辑,不想对外暴露,也有可能是API接口还未最终确定下来。所以在低版本Android上的隐藏API不一定能在高版本的Android上使用。这点是一定要注意的。也就说隐藏API的兼容性比较差。因此利用反射调用隐藏API时,一定要注意根据Android的版本采用不同的方式去反射。

更多相关文章

  1. Android与js交互实例
  2. lua学习笔记 1 android 调用Lua, Lua脚本中启动Intent
  3. android调用系统发短信界面功能
  4. Android获取OAID设备标识
  5. android中View.measure方法详解
  6. android 调用js中的方法
  7. android webview
  8. Android(安卓)控件的可见,不可见,隐藏的设置【已解决】
  9. Dealing with bitmap object in android NDK

随机推荐

  1. layout居中
  2. [置顶] android canvas 绘图笔记
  3. Android 无线连接及连接状态研究
  4. Android消息推送接收后,通知栏的显示
  5. Android下如何获得通话记录和短信记录
  6. Android SharedPreferences的工具类 - 简
  7. Emergency Call 分析 (Android 4.4 R1)
  8. 转android项目开发 工作日志 2011.10.8--
  9. android 分享到QQ空间的所有操作
  10. Android log抓取工具