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 为相对位置,需要参照着修改
            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。

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

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值