一. 前言
Android Studio 引入framework.jar 步骤,记录笔记
Android源码编译产生的framework.jar 在不同的版本上生成路径是不同的
Android N/O: 7 和 8 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar Android P/Q: 9 和 10 out/soong/.intermediates/frameworks/base/framework/android_common/combined/framework.jar Android R: 11以上 out/soong/.intermediates/frameworks/base/framework-minus-apex/android_common/combined/framework-minus-apex.jar
二. 操作
2.1 步骤1
复制framework.jar 到工程的libs文件夹中
并在app路径下的build.graddle 文件中修改,见下图:
//修改点一 compileOnly files('libs\\framework.jar')
到这里,但是有个问题,就是和Android SDK中同名的类文件,会优先使用SDK中的类,framework.jar中的类不会优先使用,解决方法:需要进行下面步骤的配置:
2.2 步骤2
同样是在app路径下的build.graddle 文件中修改
//修改点二 gradle.projectsEvaluated { tasks.withType(JavaCompile) { Set fileSet = options.bootstrapClasspath.getFiles(); List newFileList = new ArrayList() newFileList.add(new File("libs/framework.jar")) newFileList.addAll(fileSet) options.bootstrapClasspath = files(newFileList.toArray()) } }
2.3 步骤3
同样是在app路径下的build.graddle 文件中修改,降低Android SDK的使用级别,优先使用framework.jar中的类文件
//修改点三 :调整Android SDK优先级 gradle.buildFinished { //这里可以配置多个modules模块使用framework.jar包 String[] modules = ["app", "mymodule"] for (String m : modules) { def imlFile = file("../.idea/modules/${m}/frameworkjartest.${m}.iml") try { def parsedXml = (new XmlParser()).parse(imlFile) def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' } parsedXml.component[1].remove(jdkNode) def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform" new groovy.util.Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK']) groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile)) } catch (FileNotFoundException e) { e.printStackTrace() } } }
然后sync 编译成功后,就可以找到对应的模块的imi文件,可以看到下图,说明配置ok
三. 备注说明
1. 上面的3个修改点,都是在app模块中的build.graddle 文件中
2. 笔者的AS工程版本信息,亲测可用
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
AS的版本 : Android Studio 4.2.1