当前位置:   article > 正文

Android Studio Artic Fox(4.x)添加framwork.jar依赖相关问题_options.bootstrapclasspath.getfiles()语法错误

options.bootstrapclasspath.getfiles()语法错误


目前,Android studio更新了大版本Artic Fox,有幸在被迫安装了这个版本后踩坑,今天记录一篇在添加framework.jar依赖遇到的坑及解决方案,以及抛出未解决的问题向大佬们求助。

添加framework依赖步骤

1. 找到jar包

网上流传最广的jar包目录:

out/target/common/obj/JAVA_LIBRARY/framework_interminate/classes.jar
  • 1

我可以告诉你,从最近几代的Android的目录结构可以看出,编译的中间文件早就不在这里面了,针对较新的平台(按照理论来说,引入soong的Android N及其以后应该都是遵循下方的目录结构了),可以按照如下来找:

Android 9/10:
out/soong/.intermediates/frameworks/base/framework/android_common/combined/framework.jar

Android 11:
out/soong/.intermediates/frameworks/base/framework-minus-apex/android_common/combined/framework-minus-apex.jar
  • 1
  • 2
  • 3
  • 4
  • 5

2. 将上方获取到的framework.jar拷贝到需要引用的模块(module)中

这是我目前自用的版本
在这里插入图片描述

如果你仅有app这一个module,即复制到下面路径内:

<$project>/app/libs/framework.jar
  • 1

或者如下:
在这里插入图片描述
同理,如果单独的一个module在使用,比如module名为framework-ext,则放在这里:

<$project>/framework-ext/libs/framework.jar
  • 1

然后右键framework.jar文件,然后Add as Library ,再选当前的module
在这里插入图片描述

然后修改对应模块的build.gradle,将:implementation files(‘libs/framework.jar’)的引用方式更换为compileOnly files(‘libs/framework.jar’):在这里插入图片描述
compileOnly 命令的意思是:只在编译时有效,不会参与打包

在需要修改的模块的build.gradle中添加编译参数修改

以截止目前最新的Android Studio Preview (Arctick Fox 2020.3.1 Beta 3版本号203.7717.56.2031.7395685)为例:
由于没有了iml中间文件,且-Xbootclasspath/p修改方式不生效;因此Android Studio 3.x的修改方法不适用于Android Studio 4.x上;
经验证,修改bootclasspath的方法是,在需要修改的模块的build.gradle中添加如下编译参数修改:

android {
	...
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            Set<File> fileSet = options.bootstrapClasspath.getFiles()
            List<File> newFileList =  new ArrayList<>();
            //JAVA语法,可连续调用,输入参数建议为相对路径
            newFileList.add(new File("libs/XXX.jar"))
            newFileList.add(new File("libs/framework.jar"))
            //最后将原始参数添加
            newFileList.addAll(fileSet)
            options.bootstrapClasspath = files(
                    newFileList.toArray()
            )
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述

Sync Project with Gradle Files

点击如下两个地方:
在这里插入图片描述

3. 补充情况,如果Android Studio依旧报错,可以手动调整一下iml文件orderEntry顺序

iml文件寻找顺序如图,先在Android Studio左上角选择 project 目录:
在这里插入图片描述
然后如图选择 .idea —> modules —> app :
在这里插入图片描述
在 iml 文件下滑找到一排 orderEntry 找到你添加依赖的framwork ,将其顺序排到第一位,也就是 SDK 之前:
在这里插入图片描述
这样会解决报错问题,但是,因为 iml 文件是自动生成,所以每次重启IDE都要重新改一下!

4. 补充,感谢小草房大佬发现的gradle版本问题

在这里插入图片描述
如图,查看gradle版本,经小草房大佬的验证,6.6至7.3.1皆可解决报错的问题
在这里插入图片描述

5. 补充,代码调整iml文件中framework依赖优先级

在前文,修改编译参数的地方,也就是模块的build.gradle中添加如下代码

gradle.projectsEvaluated {
        System.out.println("Hello")
        //此处需改为自己的路径
        def imlFile = file( getRootDir().path + "/.idea/modules/app/" + "/Logo.app.iml")
        println 'Change ' + imlFile.path + ' order'
        try {
            def parsedXml = (new XmlParser()).parse(imlFile)
            def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' }
            parsedXml.component[1].remove(jdkNode)
            System.out.println("222")
            def sdkString = "Android API " + 31 + " Platform"
            println 'what' + sdkString
            new Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])
            groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))
        } catch (FileNotFoundException e) {
            // nop, iml not found
            println "no iml found"
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

代码会有飘红但不影响运行,注意将路径改为自己的路径!!!
在这里插入图片描述
在这里插入图片描述

如果这样依然不能导入jar包可以联系我,互相探讨,或者有更好的方法也请评论在下方,谢谢!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/313302
推荐阅读
相关标签
  

闽ICP备14008679号