android编译 配置-Xbootclasspath/p优先级无效(AndroidStudio升级到4.2.2后失效,或者jenkins 多模块依赖不同framework.jar导致失效)
系统jar包优先级有些Android项目如果需要使用framework.jar(android.jar)去使用hide方法使的编译通过时,网上会给出下列代码,但是某些情况下,这种方式可能会不生效:allprojects {gradle.projectsEvaluated {tasks.withType(JavaCompile) {//../framework.jar 为相对位置,需要参照着修改op
系统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。
翻阅了网上很多回答博客,均没有看到这类问题,和这种解决办法,花了不少时间,希望可以帮到你。
更多推荐
所有评论(0)