androidstudio更改优先加载系统包framework.jar的顺序

这篇文章主要针对本地开发系统级应用,使用系统源码中的隐藏方法时,优先加载需要的隐藏api而不是官方的SDK的解决策略。


一、androidstudio编译时加载的顺序。

在我们新建的每一个工程中,在项目名/app目录下都有一个文件,叫做 app.iml .(如图)

androidstudio更改优先加载系统包framework.jar的顺序_第1张图片

这个文件是编译器在运行时候加载需要依赖的库文件的顺序表,打开文件,我们可以观察一下:

androidstudio更改优先加载系统包framework.jar的顺序_第2张图片

我们看到最上面的一条是官方SDK,也就是最先加载的库文件,而我们需要的framework.jar在中间,则不会优先加载。

为了优先加载framework.jar,我们可以选择将需要的一条放置到最上面,这里我在本地需要获取ActivityManager中的一个叫做removeTask方法,这个方法对外是隐藏的,当前情况如图:

androidstudio更改优先加载系统包framework.jar的顺序_第3张图片

这个是framework.jar中ActivityManager中需要使用的方法removeTask。

直接使用导致的问题:

androidstudio更改优先加载系统包framework.jar的顺序_第4张图片

我们会发现无法找到需要的方法。

接下来我们改变一下 app.iml 中的顺序:

androidstudio更改优先加载系统包framework.jar的顺序_第5张图片

我们将framework.jar放置到SDK的前面,

然后观察具体代码中的使用情况:

androidstudio更改优先加载系统包framework.jar的顺序_第6张图片

我们会发现已经可以获得了。

但是,这个只是暂时解决了问题,无法从根本上解决此类问题,因为你会发现从新clear/rebuild一下,顺序又会回到原来的位置。

从根本上解决的方法:

在gradle文件中有个地方:

allprojects {
    repositories {
        jcenter()
    }

在这下面,我们加入一段代码:

gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:F://TvHelper/app/libs/framework.jar')
        }
    }
为了清晰,再放一个截图:

androidstudio更改优先加载系统包framework.jar的顺序_第7张图片

这里:Xbootclasspath/p  是java编址的优先寻址设置,这里我们设置的是绝对路径。

写完这个之后,及时你的api调用的时候无法获取相应的方法,只要使用正确,也是可以完成build的。当然如果你更改了app.iml文件的顺序,那么使用起来会更加舒服一些。

你可能感兴趣的:(android知识类)