一. 前言
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<File> fileSet = options.bootstrapClasspath.getFiles();
List<File> 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