使用内部(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的例子

你阅读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升级后不会变化,其次也不能保证在不同厂家的不同设备上有一致的行为。这完全取决您自己。

有以下三种场景:

  1. 开启内部API和隐藏API(场景A)

  2. 仅开启隐藏API(场景B)

  3. 仅开启内部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

原文:http://mogoweb.net/archives/87

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

时间: 2024-12-18 02:08:32

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

使用内部(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[第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 (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; //-- 还有这种(下面这段摘自同一文件):         /**          *

使用android hide API

使用androidhide API Android有两种类型的API是不能经由SDK访问的. 第一种是位于com.android.internal包中的API.我将称之为internalAPI.第二种API类型是一系列被标记为@hide属性的类和方法.从严格意义上来讲,这不是一个单一的API,而是一组小的被隐藏的API,但我仍将其假设为一种API,并称之为hiddenAPI. 使用hide具体步骤分为:调用hideapi和获得使用hideAPI权限 第一,调用hideAPI 第一种方法就是使用J

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

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

如何使用android系统隐藏hide的类和方法

如何使用android系统隐藏hide的类和方法 欢迎访问 wxtlife.com 在应用开发过程中,可能会需要使用到系统的方法,比如:SystemProperties 以及系统隐藏hide的方法和类,比如:Android 4.2中的 Surface.screenshot(x,y)方法是隐藏的, Android 4.3后面上面的那个方法变成了SurfaceControl.screenshot(x,y) 并且SurfaceControl这个类也变成了隐藏的了.那么要直接在eclipse或者andr

Android漏洞——将Android恶意代码隐藏在图片中

研究人员发现了Android上又一个严重的安全漏洞:将Android恶意代码隐藏在图片中(Hide Android Applications in Images). 在该漏洞向外界公开之前,Google已经发布了补丁.不过,仍然有大量Android手机用户没有选择升级. 恶意程序研究人员Axelle Apvrille和逆向工程师Ange Albertin开发了一种定制的工具AngeCryption(Python脚本)加密恶意程序的APK文件(Android application package

[转载]Android应用方法隐藏及反调试技术浅析

本文转载自: http://drops.wooyun.org/tips/9471 0x00 前言 Android应用的加固和对抗不断升级,单纯的静态加固效果已无法满足需求,所以出现了隐藏方法加固,运行时动态恢复和反调试等方法来对抗,本文通过实例来分析有哪些对抗和反调试手段. 0x01 对抗反编译 首先使用apktool进行反编译,发现该应用使用的加固方式会让apktool卡死,通过调试apktool源码(如何调试apktool可参见前文<Android应用资源文件格式解析与保护对抗研究>),发