Android 内部API (com.android.internal)和隐藏API(@hide)概述

内部API和隐藏代码的例子

在翻阅Android源码的时候有时会遇到一些奇怪的代码,例如下面这个:

//注:这段代码在源码android/provider/Telephony.java中。
import android.util.Patterns;

import com.android.internal.telephony.SmsApplication;

import java.util.HashSet;
//……

还有这种(下面这段摘自同一文件):

        /**
         * //comments...
         * @hide
         */
        public static boolean isOutgoingFolder(int messageType) {
            //method body...
        }

这些代码是什么意思呢?

内部API:android.internal.*

实际上,在SDK的source目录,是找不到所谓android.internal包的。该包下的所有类的源码都是不可见的,仅供系统内部使用。一般而言,在这个包下的都是Android系统核心功能,不对外开放接口和源码。

隐藏代码:@hide

与内部API不同,使用@hide标记的一般并非整个文件或外部类,而一般是内部类、函数或字段,姑且笼统称其为隐藏代码(我个人认为不对外开放的代码不应该叫做Application Programming Interface)。这些隐藏代码在源码中可见,但并不能直接引用。

内部API和隐藏API的不同

从Google的目的看,使用两种不同的方式,是有自己的考虑的,内部API属于系统核心部分,不计划对外开放。系统的核心功能会通过Framework提供一定的访问,但并不需要公布其代码。

而隐藏API则更多是为了考虑Android不同版本间的安全性。很有可能一个正在开发的、并不稳定的Feature被隐藏,直到稳定、成熟后再开放。Android在API Level5之后才出现Bluetooth API,但实际上更早的源码中就已经有这部分代码,只不过被@hide隐藏起来了。可以想见,如果某个应用程序依赖于API 4的Bluetooth API,很有可能在Android2.0(API Level5)的机器上出现不可预料的问题。

当然,内部代码也有可能发生这样的变动,但由于它本身对开发者来说就是个黑盒子,因此它内部的变动我们大可放心交给Google啦。

开发者眼中的不同

目前一般Android开发者使用Eclispe ADT插件进行开发,对于一般的开发者来说,内部API和隐藏代码没什么区别,都没法用嘛。不过,总有那么一些人出于各种目的,希望使用这些API。

在开发的时候我们使用最多的库就是android.jar包,该包下有我们用的几乎所有功能【不排除会使用到android-support-v4.jar】。在该jar包中,我们可以看到,所有的android.internal内的类都不见了,同样,类中也不含有源码中标记为@hide的字段、函数和类。

但是在应用程序真正在设备上运行的时候,系统加载的是framework.jar包,该包未被裁剪,包含所有内部API和隐藏代码。因此开发者可以通过反射机制进行调用。

此外,在使用Eclipse ADT 的时候,ADT插件专门对android.internal包做了访问规则限制。因此,即使将项目下的android.jar替换成未裁剪的android.jar包,也是很难使用内部API的。

不推荐使用内部API和隐藏代码

如前所述,理论上,开发者尽可以使用反射机制进行对这些功能的调用。但是,必须面对以下问题:

  • 使用这样的功能会使程序的代码变得晦涩难懂,难于维护;
  • 不同厂家的Framework包可能略有差别,难以兼顾多种设备;
  • Android版本升级后,其内部功能或者隐藏代码可能发生较大的变化,因此使用了这些代码的程序无法确保向后兼容。

参考资料:使用内部(com.android.internal)和隐藏(@hide)API[第1部分,介绍]

Android 内部API (com.android.internal)和隐藏API(@hide)概述

时间: 2024-10-09 21:36:46

Android 内部API (com.android.internal)和隐藏API(@hide)概述的相关文章

使用内部(com.android.internal)和隐藏(@hide)API[第4部分,定制ADT]

本文翻译自http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-4-customizing-adt/ 在前面的文章中,我讲述了如何创建定制的original-android.jar和创建定制的android平台以使用original-android.jar.这仅仅能够使用隐藏API,还为内部API留有一个障碍: ADT.ADT定义了一个规则禁止使用来自com.android.internal的类. 有几种方

使用内部(com.android.internal)和隐藏(@hide)API[第3部分,定制android平台]

本文翻译自https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-3-custom-android-platform/ 在前一篇文章中我展示了如何创建定制的original-android.jar,包含内部API和隐藏API中的所有类. 接下的步骤很明显,就是修改现有的android平台(SDK_DIR/platforms/platform-X/android.jar).您可以简单的用第2部分创建的orig

使用内部(com.android.internal)和隐藏(@hide)API[第1部分,介绍]

本文翻译自http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/#more-79 Android有两类API在SDK中不能使用. 第一类就是位于包com.android.internal的API,我将这些API称为内部API.第二类API就是用@hide标记的类和函数,虽然严格说这不是一个API而是一系列隐藏API的集合,我仍然假定这是一个API,称为隐藏API. 隐藏API的

使用内部(com.android.internal)和隐藏(@hide)API[第2部分,定制android.jar]

本文翻译自https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-2-hacking-around/ 在前一篇文章中,我解释了为什么不通过反射机制,不太容易使用com.android.internal包的内部API和标记为@hide的隐藏API,这是由于android.jar文件没有包含内部API和隐藏API的类,这样在编译时刻就没有办法引用这些类了. 本文将说明如何恢复原始的android.jar,这样就

Android中的隐藏API和Internal包的使用之获取应用电量排行

今天老大安排一个任务叫我获取手机中应用耗电排行(时间是前天晚上7点到第二天早上10点),所以在网上各种搜索,没想到这种资料还是很多的,发现了一个主要的类:PowerProfile,但是可以的是,这个类没有曝光给我们开发者,所以我们不能调用它 那怎么办呀?,还是有办法的,这个类是藏在:com.android.internal.os.PowerProfile com.android.internal.os.PowerProfile.PowerProfile这个类就是负责解析记录文件,我们可以创建一个

如何调用Android隐藏API

作为Android应用的开发者,在Android平台上开发,最熟悉的莫过于android sdk.SDK给开发者带来的巨大的便利,使得Android平台的应用开发效率大大提高.不过遗憾的是,Android的功能远不止SDK暴露的那么多,还有很多隐藏的东西Google都没有通过SDK暴露给用户开发者.查看Android源代码时就会发现,这些隐藏的API都有一个共同的特点:类或者方法前都有@hide.如图: <ignore_js_op> 一.如何隐藏API的? 1)  在正常情况下,即不加@hid

Android工程中怎样使用隐藏API

使用android 隐藏api的前提:我们需要得到Android系统源码编译输出的一个文件 out\\target\\common\\obj\\JAVA_LIBRARIES\\framework_intermediates\\classes.jar 这个包里面包含所有的系统api, 隐藏的, 公开的 添加 jar方法 右键功能菜单->Properties->Java Build Path Libraries选项卡 这时应该有一个列表,  如果你没有添加过, 应该只有一项, 就是系统自带的And

自行修改android.jar使其包含隐藏api

1) 从指定版本的rom内获取到framework.jar 2) 解压framework.jar和android sdk内的android.jar 3) 将framework.jar解出来的东西拷到android.jar解出来的东西内,进行覆盖 4) 重新打包 5) 用新的android.jar替换原先的 方便起见,写了一个脚本来完成以上工作,其中解framework.jar用到dex2jar工具,请自行下载并配置环境变量 #!/bin/sh DEX=$1 AJAR=$2 OUT=$3 d2j-

如何得到包含隐藏API的Android类库

Android SDK的很多API是隐藏的,我无法直接使用.但是我们通过编译Android系统源码可以得到完整的API库. 编译Android系统源码后可以在out\target\common\obj\JAVA_LIBRARIES目录中有它所有API库(java). 当然对于一般情况,out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar对于我们来说就足够了. 我们可以通过这个classes.jar这种An