系统jar包优先级

有些Android项目如果需要使用framework.jar(android.jar)去使用hide方法使的编译通过时,网上会给出下列代码,但是某些情况下,这种方式可能会不生效:

allprojects {
gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
        	//../framework.jar 为相对位置,需要参照着修改
            options.compilerArgs.add('-Xbootclasspath/p:../framework.jar')
        }
    }
}
Android Studio 最近升级到4.2.2版本

最近升级Android Studio后项目编译报一堆错,但是hide方法无法调用。判断就是上面这种写法失效了。

依赖多个系统jar包

如果多个模块,且不同模块使用了不同的 framework.jar ,比如模块a 使用了 framework1.jar ,模块b 使用了 framework2.jar。理想当然会在模块a,b 的 build.gradle 里分别加上 -Xbootclasspath/p…
这么做,在本地 用AndroidStudio编译没有遇到问题,但是项目代码,放到 jenkins 上 编译就报错了。
(PS. 不要怀疑为什么会有这么奇怪的用法,在多版本的定制系统使用统一的APP, 同时又想使用系统api时,很容易使用这种做法)

解决办法
gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            Set<File> fileSet = options.bootstrapClasspath.getFiles()
            List<File> newFileList =  new ArrayList<>();
            //"../framework.jar" 为相对位置,需要参照着修改,或者用绝对位置
            newFileList.add(new File("../framework.jar"))
            newFileList.addAll(fileSet)
            options.bootstrapClasspath = files(
                    newFileList.toArray()
            )
        }
    }
原因

其实在于 jenkins 上,每个模块单独写的 -Xbootclasspath/p 指定jar包比原生 sdk 优先加载失效了,只有在项目的 build.gradle 指定 allprojects 才有效。这里应该是个 bug .但是暂时没找到根本的原因。(PS. 最近AndroidStudio 升级到4.2.2后,allprojects里面这样写也失效了,参照上面修改就行。)

通过查询相关资料后,其实是可以指定 bootstrapClasspath ,来换种方式解决的,修改前的 bootstrapClasspath 除了原生的 jar 其实还有其他的类的。所以是在 bootstrapClasspath 的 head 部分加上了我们的 framework.jar。

翻阅了网上很多回答博客,均没有看到这类问题,和这种解决办法,花了不少时间,希望可以帮到你。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐