Android有两类API在SDK中不能使用。
第一类就是位于包com.android.internal的API,我将这些API称为内部API。第二类API就是用@hide标记的类和函数,虽然严格说这不是一个API而是一系列隐藏API的集合,我仍然假定这是一个API,称为隐藏API。
隐藏API的例子
你阅读android的源码,就会发现有些常量、函数和类标记为@hide.
这里有一个隐藏常量的例子,来自WifiManager(source code of API Level 10).
另外一个例子是隐藏函数setWifiAppEnabled,来自WifiManager(source code of API Level 10).
所以您只要看到@hide属性,这就是一个隐藏API。
内部API和隐藏API的不同
隐藏API隐藏是为了防止开发人员使用SDK中未完成或者未稳定(接口和架构方面看)的部分。比如,Bluetooth API在API Level 5(android 2.0)之前就存在,但在API Level 3和4(android 1.5和1.6)中使用@hide隐藏起来了。当该API稳定下来,google的开发人员移除@hide属性,在API Level 5中就有Bluetooth API了。还有很多东西在Level 4和5之间发生了变化。如果程序依赖于某些隐藏API,可能会在新版本的Android OS上运行出现问题。
而内部API则不计划对外开放。这是android的内部餐厅,开发人员可以视为黑盒子。这里面的东西同样可能发生改变。同样的,如果您的程序依赖于内部API,在新的Android发布后,可能遇到麻烦。
下面总结它们之间的不同:
隐藏API = 正在开发中;
内部API = 黑盒
内部和隐藏API的编译时和运行时对比
当您使用Android SDK进行开发时,会引用一个非常重要的jar文件android.jar。它位于Android SDK的平台目录SDK_DIR/platforms/platform-X/android.jar(其中X为API Level,可以是5或者10或其它的数字)。在android.jar中,com.android.internal中所有的类移除了,同样的,所有标记为@hide的类、枚举、字段、方法也移除了。
但是当您在设备中运行应用程序时,加载的是framework.jar(大约等价于android.jar),它没有被裁减,包含所有的内部类和隐藏API。所以您可以使用反射机制来访问隐藏API和内部API(当然,这种方法使用起来不太方便,下面我将介绍不使用反射机制访问这些API的方法)。
关于内部API还有一些特别。Eclipse的ADT插件增加了一条额外规则,禁止使用来自com.android.internal包的任何东西。所以,即使您使用了原始(未裁减)的android.jar,也不容易在eclipse中使用内部API。
您可以自己检查一下。在eclipse中创建一个新的Android工程(或使用现有的),查看它的引用库(右键点击工程,Properties –> Java Build Path –> Libraries)。
重要总结:在SDK中内部API和隐藏API处理方式基本上相同(都从android.jar中移除),但内部API在Eclipse ADT插件中显示禁止了。
不通过反射机制使用内部API和隐藏API
本系列文章的终极目标是给程序员不用反射而使用内部API和隐藏API的方法。如果您完成了在后面文章中的所有步骤,您将可以向象使用官方API那样使用内部API和隐藏API,没有必要使用反射。
但是如果您使用这些非公开的API,必须意识到存在一个巨大的风险。首先不能保证这些API在Android OS升级后不会变化,其次也不能保证在不同厂家的不同设备上有一致的行为。这完全取决您自己。
有以下三种场景:
- 开启内部API和隐藏API(场景A)
- 仅开启隐藏API(场景B)
- 仅开启内部API(场景C)
场景A是场景B和C的综合。场景B是最简单的(不需要修改eclipse ADT插件)。
场景A:阅读1,2,3,4,5
场景B:阅读1,2,3,5
场景C:阅读1,2,3,4,5
分享到:
相关推荐
### 使用internal和hide API #### 一、Introduction 在Android开发过程中,开发人员有时会遇到两种类型的API,它们并未直接包含在官方支持的SDK中,这两种API分别是位于`com.android.internal`包中的API(internal...
在Android系统中,`android.jar`是一个非常关键的组件,它是Android SDK的一部分,包含了所有公开的Android API供开发者使用。然而,除了公开的API之外,Android还存在两类非公开的API:`internal`和`hideApi`。这些...
在Android开发中,Material Design是一种广泛采用的设计规范,它提供了丰富的UI组件和交互方式,提升了应用的用户体验。其中,FlowLayout是一种特殊的布局管理器,用于在水平或垂直方向上动态排列子视图,当一行或一...
The internal API is located in the com.android.internal package which is available in the framework.jar file from a real Android device, while the hidden API is located in the android.jar file with @...
webview全称叫做Android System WebView,它是Android生态系统的重要组成部分,也是Chrome浏览器的内核。可以让你的手机变得瞬间畅通,它会及时优化网页相关数据,有着接入式的操作体验数据,各种类型的应用程序可...
android system webview 适配系统>=5.0
android sdk -26 带 com.android.internal.telephony 包的 jar, 下载后 将名称改为 android.jar 替换 anroid-sdk -> platform -> android-26 文件下的 android.jar 即可直接找到 telephony 下的类, 不会报错
内部API位于包com.android.internal ,可在framework.jar ,而隐藏的API位于具有@hide javadoc属性的android.jar文件中。 现在您知道了区别。 但是我将两者都称为隐藏API。 此存储库包含自定义android.jar ,可用于...
当使用 Android SDK 进行开发的时候,应用默认引用了 android.jar,它位于 SDKDir\platforms\android-X 目录下(X 代表 API 级别),默认移除了所有的被@hide标识的方法或者类以及 internal 包下的类。。当应用在...
包含以下java源文件: ...com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class ...
org.eclipse.swt.browser.HelperAppLauncherDialog_1_9.class org.eclipse.swt.browser.IE.class org.eclipse.swt.browser.InputStream.class org.eclipse.swt.browser.LocationAdapter.class org.eclipse.swt....
`com.sun.org.apache.xpath.internal.operations.String` 是Apache Xalan-Java库的一部分,Xalan是一个流行的XPath和XSLT处理器。XPath(XML Path Language)是一种在XML文档中查找信息的语言,它可以用来选取节点,...
1. **原生API封装**:Android-SDK将Android系统的原生API进行了封装,使得uniapp应用可以调用Android的各种系统服务,如相机、位置、蓝牙等。 2. **性能优化**:通过与HBuilderX(uniapp的开发工具)配合,SDK对...
【4.2到6.0的在已上传,文件太大,一次上传不了】当使用 Android SDK 进行开发的时候,应用默认引用了 android.jar,它位于 SDKDir\platforms\android-X 目录下(X 代表 API 级别),默认移除了所有的被@hide标识的...
在使用IntelliJ IDEA(IDEA)开发Java项目时,我们可能会遇到与Gradle相关的编译错误,如“`No signature of method: org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.DefaultVersionComparator....
在Android开发中,布局管理器是构建用户界面的关键部分,它们负责组织和定位屏幕上的各个组件。LinearLayout是最常见的布局之一,它按照垂直或水平方向排列其子视图。然而,当需要在一个容器中动态地展示数量不定且...
在AIDL创建一个新包文件夹名称必须为com.android.internal.telephony 在该程序包名称中创建AIDL文件必须为ITelephony.aidl 在ITelephony.aidl添加该代码 package com.android.internal.telephony; interface ...
【7.0到9.0在下一个上传,文件太大,一次上传不了】当使用 Android SDK 进行开发的时候,应用默认引用了 android.jar,它位于 SDKDir\platforms\android-X 目录下(X 代表 API 级别),默认移除了所有的被@hide标识...
7. 在文档的第二部分“2.2 Overview of the TEE Internal Core API Specification(2.2 TEE内部核心API规范概述)”中,开始介绍TEE内部核心API的具体内容。其中“2.1 Trusted Applications(2.1 可信应用)”是核心...
java 工具包, async-http-client-1.6.3.jar com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class ...