前言
本篇文章主要针对在本地开发系统级应用,使用系统源码中的隐藏方法时,优先加载需要的隐藏api而不是官方的SDK的解决策略。
一、AndroidStudio编译时依赖库加载的默认顺序。
1、这里我们新建一个工程MyApplication,并添加对framework.jar包的依赖。
2、更新项目gradle,然后我们在代码MainActivity中引用一些系统类的隐藏属性或者方法,然后编译运行,就会出现如下图所示的错误提示。
3、我们打开.idea/modules/app/MyApplication.app.iml文件(高版本的gradle插件可能没有这个文件,可以直接忽略这一步),这个文件是编译器在运行时候加载需要依赖的库文件的顺序表,该文件的内容如下所示:
通过查看MyApplication.app.iml这个文件我们可以发现,对AndroidSDK的依赖优先级要高于我们新添加的依赖framework.jar包,这样就会导致编译器优先引用AndroidSDK中的类,而AndroidSDK中的关键系统类和隐藏属性和方法都是不允许我们直接引用的,所以编译器就会报错。
二、修改AndroidStudio的编译时依赖库加载的顺序。
1、如果我们想让MainActivity中的代码正常编译运行,就需要修改依赖模块AndroidSDK和framework.jar的先后顺序,只要让framework.jar加载的优先级高于AndroidSDK,MainActivity的代码就可以正常编译运行了。那么如何调整依赖库的优先级呢?只要在app模块的build.gradle中添加如下所示的配置就行了。
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
Set<File> fileSet = options.bootstrapClasspath.getFiles()
List<File> newFileList = new ArrayList<>();
//JAVA语法,可连续调用,输入参数建议为相对路径
newFileList.add(new File("libs/framework.jar"))
//最后将原始参数添加
newFileList.addAll(fileSet)
options.bootstrapClasspath = files(
newFileList.toArray()
)
}
}
2、添加如上图所示的配置之后,更新gradle,这个时候再进行编译,MainActivity中的代码基本上就可以正常编译运行了。