Android 应用访问Android 系统hide的api
2023-11-13 本文已影响0人
a_simple_coder
在开发中需要调用隐藏的API,这需求咱们引入包含被隐藏 API 的 jar 包。
一、生成 framework.jar
生成步骤可参考:
写给应用开发的 Android Framework 教程——玩转 AOSP 之使用 Android Studio 开发系统 App
Android 7.1.1 Framework 修改记录(五) 增加全局事件API供上层应用调用
二、集成
注意:网上看将
framework.jar
放到app/libs
目录下,修改app/build.gradle
这里要注意,如果你的代码是在library module
中引用framework.jar
,就要将framework.jar
放到library module/libs
目录下,并修改library module /build.gradle
这里我的代码是在 library
的module中,所以:
2.1、把之前准备好的 framework.jar
拷贝到项目的 library module/libs
文件夹中。
如下所示:
2.2、接着修正项目根目录下的 build.gradle,增加如下内容:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile).tap {
configureEach {
Set<File> fileSet
if (options.bootstrapClasspath != null) {
fileSet = options.bootstrapClasspath.getFiles()
} else {
fileSet = new HashSet<>()
}
List<File> newFileList = new ArrayList<>();
newFileList.add(new File("./libs/framework.jar"))
newFileList.addAll(fileSet)
options.bootstrapClasspath = files(
newFileList.toArray()
)
}
}
}
2.3、修改library module 的 build.gradle
:
repositories{
flatDir {
dirs "libs"
}
}
dependencies {
compileOnly files("libs/framework.jar")
}
然后在java中可以使用hide 的 api 了:
private static ComponentName getTopActivity(int displayId) {
try {
List<ActivityTaskManager.RootTaskInfo> stackInforms = ActivityTaskManager.getService().getAllRootTaskInfosOnDisplay(displayId);
for (int i = 0; i < stackInforms.size(); ++i) {
ActivityTaskManager.RootTaskInfo info = (ActivityTaskManager.RootTaskInfo) stackInforms.get(i);
if (null != info) {
Log.d(TAG, "displayId=====>" + displayId + " RootTaskInfo=====>" + info);
return info.topActivity;
}
}
} catch (Exception e) {
Log.e(TAG, "getTopActivity has Exception:" + e.getMessage());
}
Log.d(TAG, "getTopActivity failed");
return null;
}