第一类就是位于包com.android.internal的API,我将这些API称为内部API;
第二类API就是用@hide标记的类和函数,虽然严格说这不是一个API而是一系列隐藏API的集合,我仍然假定这是一个API,称为隐藏API;
内部API和隐藏API的不同
隐藏API隐藏式为了防止开发人员使用SDK中未完成或者未稳定(接口和架构方面看)的部分。比如,Bluetooth API在API Level5(android 2.0)之前就存在,
但是API Level 3和4(android 1.5和1.6)中使用@hide隐藏起来了。当该API稳定,google的开发人员移除@hide属性。注意:如果APP依赖于某些隐藏API,
可能会在新版本的Android系统上运行出现问题。
内部API则不计划对外开放,开发人员视为黑盒子。
内部和隐藏API的编译时和运行时对比
当使用Android SDK进行开发时,会引用一些非常重要的jar文件android.jar。它位于Android SDK的平台目录SDK_DIR/platforms/platform-X/android.jar(其中X为API Level,可以是5或者10或其它的数字)。(其中X为API Level)。在android.jar中,com.android.internal中所有的类移除了,同样,所有标记为@hide的类、枚举、字段
、方法也被移除。
但是当在设备中运行应用程序时,加载的framework.jar没有被裁减,包含所有的内部类和隐藏API。
编译时,编译不通过;运行时,可加载;
措施:想办法绕过编译,可以使用反射机制来访问隐藏API和内部API。
网上有不使用反射机制使用上述两种API的方法。
关于内部API还有一些需注意点。Eclipse的ADT插件增加一条额外规则,禁止使用来自com.android.internal包的任何东西。
如果使用未裁减的android.jar,也不能再eclipse中使用内部API。
您可以自己检查一下。在eclipse中创建一个新的Android工程(或使用现有的),查看它的引用库(右键点击工程,Properties –> Java Build Path –> Libraries)。