热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

怎样查看并且使用Android隐藏API和内部API

Android有两种类型的API不能通过SDK访问。一种是在com.android.internal包中的API,称之为internalAPI。另一种是被标记为@hide属性的类和

Android 有两种类型的 API 不能通过 SDK 访问。一种是在 com.android.internal 包中的 API,称之为 internal API。另一种是被标记为 @hide 属性的类和方法,这是一组小级别的被隐藏的 API,称之为 hidden API。

当使用 Android SDK 进行开发的时候,应用默认引用了 android.jar,它位于 SDKDir\platforms\android-X 目录下(X 代表 API 级别),默认移除了所有的被@hide标识的方法或者类以及 internal 包下的类。。当应用在设备上运行时,它会加载 framework.jar。简单来说,framework.jar 和 android.jar 等同,但是没有移除 internal API 和 hidden API。Hidden API 之所以被隐藏,是想阻止开发者使用 SDK 中未完成或不稳定的部分。

举个栗子:这是没有移除 internal API 的 android.jar,可以看到包里的类是完整的。

《怎样查看并且使用 Android 隐藏 API 和内部 API》 internal api

比如 AssetManager 的 addAssetPath 方法被 @hide 标记,它属于 hidden API,我们无法直接调用该方法。

/**
* Add an additional set of assets to the asset manager. This can be
* either a directory or ZIP file. Not for use by applications. Returns
* the COOKIE of the added asset, or 0 on failure.
* {@hide}
*/
public final int addAssetPath(String path) {
synchronized (this) {
int res = addAssetPathNative(path);
makeStringBlocks(mStringBlocks);
return res;
}
}

但是,人的需求是无限的。如果我们非要使用不可用的 API 怎么办呢?最简单的就是 Java 的反射,反射 @hiden 的方法或类,修改访问修饰符,然后就可以搞事情了~~还有一种方法是从设备中提取,简单说就是把设备上的 /system/framework/framework.jar 提取出来,经过一系列转换,最终得到完整的 android.jar,具体的步骤可以参考这篇文章:android怎样调用@hide和internal API。另外一种方式非常简单,GitHub 上有一个项目:android-hidden-api,里面提供了众多版本完整的 android.jar 包,下图所示。

《怎样查看并且使用 Android 隐藏 API 和内部 API》 android hidden api

我们把工程 clone 下来,找到对应平台的 android.jar 包,替换掉 Android SDK 下面的 jar,最好先备份一下原始的 jar,重新编译工程或者重启 Studio 就行了。

比如 AssetManager 的 addAssetPath 方法,没有替换之前是这样,Studio 提示错误,编译失败~o(>_<)o ~

《怎样查看并且使用 Android 隐藏 API 和内部 API》 can&#8217;t resolve addAssetPath

但是在使用了完整的 android.jar 后,发现竟然不会报错了,代码可以通过编译,终于可以愉快地使用想要的方法了 O(∩_∩)O~

《怎样查看并且使用 Android 隐藏 API 和内部 API》 can resolve addAssetPath

这种方式对于个人开发来说没有问题,你把 android.jar 替换掉就好了,但是如果面对团队开发,就非常痛苦了 %>_<%,每个人都要替换 SDK 的 android.jar,代价和风险可想而知。那么有没有好的解决办法,既可以让工程编译通过,又能够免去多人替换 jar 的成本呢?答案是有的。

Studio 默认引用的是 SDK 下面的 android.jar,那我们把它的引用改成完整的 jar 的路径不就行了么?
我们把完整的 android.jar 放在工程 libs 目录下,也就是平时依赖 jar 的地方,然后在工程 build.gradle 配置的 dependencies 里,以 provided 的方式引用 android.jar。因为每个工程模块依赖 android.jar 的类型就是 provided,这样不会把 android.jar 打包到应用中,运行环境中存在 framework.jar,应用直接就可以使用。

dependencies {
// compile fileTree(include: ['*.jar'], dir: 'libs') 这行一定要去掉,当然为 android.jar 换个目录也行
testCompile 'junit:junit:4.12'
provided files('libs/hidden_api_23.jar')
}

最后还要在工程根目录的 build.gradle 里面配置当前 project,加上下面的代码就行了。

project('app') { // app是你工程的名字,配置只对当前工程有效
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
// 注意修改 jar 包的路径,替换 app/libs/hidden_api_23.jar,其他部分不要改
// Xbootclasspath/p:是 Java 编译的寻址优先设置,先找缺省路径还是全路径
options.compilerArgs.add('-Xbootclasspath/p:app/libs/hidden_api_23.jar')
}
}
}

现在重新编译工程,虽然会在代码中出现错误提示,但是编译打包运行都是正常的。_

在开发中使用隐藏 API 和内部 API 是不推荐的做法,但是为了实现一些「黑科技」,这些又是必须的~


推荐阅读
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • node.jsurlsearchparamsAPI哎哎哎 ... [详细]
author-avatar
一条游荡在重庆的鱼_759
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有