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 files('libs\\framework.jar')
...
}
- 在工程的根目录下打开build.gradle,并找到allprojects,加入如下代码:
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\framework.jar')
}
}
- 在Module下打开build.gradle,在最后加入如下代码:
preBuild {
doLast {
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) {
println('iml not found')
}
}
}
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())
}
}
- 并在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 中的类文件。
参考文章:
|