Android Studio 引入源码编译的framework.jar包
背景: 最近在做车载蓝牙开发,是基于
Android 10.0
的Api来做开发,由于Android 10.0很多系统Api被
@hide
了,还有部分函数被删除了,需要修改源码,然后用编译后的
framework.jar
来开发。
我的Android Studio的版本是 Bumblebee
,gradle版本是7.2
,gradle插件是7.1.2
。
- 将framewor.jar包拷贝到工程的目录libs下面,并右键单击jar包
Add as Library
。
- 将 implementation 改为
compileOnly
,compileOnly 表示 jar 包只参与编译,不会打包进去:
dependencies {
// 使用 compileOnly(默认是 implementation),compileOnly 表示 jar 包只参与编译,不会打包进去。
compileOnly files('libs\\framework.jar')
...
}
- 在工程的根目录下打开build.gradle,在文件的最后加入如下代码:
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\framework.jar')
}
}
- 在Module下打开build.gradle,在最后加入如下代码:
preBuild {
doLast {
// def imlFile = file(project.name + ".iml")
// 这是我的工程路径,具体的根据自己的工程来修改
def imlFile = file("../.idea/modules/app/AndroidStudioProjects.BluetoothDemo.app.iml")
println('Change ' + project.name + '.iml order')
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) {
// nop, iml not found
println('iml not found')
}
}
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
Set<File> fileSet = options.bootstrapClasspath.getFiles()
List<File> newFileList = new ArrayList<>();
//"../framework.jar" 为相对位置,需要参照着修改,或者用绝对位置
newFileList.add(new File("libs\\framework.jar"))
newFileList.addAll(fileSet)
options.bootstrapClasspath = files(newFileList.toArray())
}
}
- 并在Module下面的build.gradle里找到defaultConfig加入
multiDexEnabled = true
,dependencies中添加implementation 'androidx.multidex:multidex:2.0.1'
,如下截图:
defaultConfig {
applicationId "com.ben.bluetoothdemo"
...
multiDexEnabled = true
...
}
dependencies {
...
implementation 'androidx.multidex:multidex:2.0.1'
}
- 最后
Clean
工程,然后Rebuild
再次编辑。这样工程就会优先引入framework.jar
中的类文件。
参考文章: