一、Android 隐藏API和类介绍
Android 有两种类型的 API 不能通过 SDK 访问。一种是在 com.android.internal 包中的 API(源码路径为framework/base/core/)。另一种是被标记为 @hide 属性的类和接口。
对于internal API来说,从来都没有计划将其开放出来。它就是Android的“内部厨房”,对开发者来说,应该将其视作黑盒。
Hidden API之所以被隐藏,是想阻止开发者使用SDK中那些未完成或不稳定的部分(接口或类),因为其可能会在后续的版本中被修改或者移除。
当使用 Android SDK 进行开发的时候,应用默认引用了 android.jar,它位于 sdk-platform-{android版本}-android.jar。SDK 中默认移除了所有的被@hide标识的接口或者类以及 internal 包下的类。
当应用在设备上运行时,它会加载 framework.jar。简单来说,framework.jar 和 android.jar 等同,但是没有移除 internal API 和 hidden API。
二、获取带有隐藏和内部API接口的framework.jar
网上的方法很多,感觉挺麻烦, 我这边是直接编译android os源码,拿到classes.jar就可以。
- 编译Android系统源码(eng版本)
- framework源码编译出来的jar路径如下:
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar - 重命名, out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar ----》framework.jar
三、Android Studio导入framework.jar
- 工程目录创建libs目录。
- 复制framework.jar包到libs目录,
- 模块build.gradle添加 compileOnly files('libs/framework.jar')
- 全局build.gradle添加
allprojects {
//.... 省略
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << '-Xbootclasspath/p:app/libs/framework.jar'
}
}
}
四、测试调用系统隐藏接口
通过调用android.os.SystemProperties获取系统属性接口,通常我们使用反射获取系统属性,这里我们可以直接使用SystemProperties接口。
获取系统属性
五、参考博客:
如何构建具有隐藏和内部API的Android SDK?
Android Studio 加载第三方jar包并提高framework.jar包优先级
如何使用hide掉的类及接口
怎样查看并且使用 Android 隐藏 API 和内部 API
网友评论