在做android方案定制开发中,常常会碰到需要调用厂商自己定制sdk拓展的系统接口,而Android studio默认使用的是谷歌官方标准sdk,无法调用厂商私有接口,这时就需要将标准sdk中相关代码替换成厂商的,最常见的framework.jar中的代码,以此为例,将厂商提供的framework编译成framework.jar导入Android Studio,编译时替换掉标准sdk中的framework.jar,从而实现调用厂商私有的接口。
这里已海思Hi3798MV200平台Android N为例,编译出的framework.jar路径为:out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
将其重命名为hisi-android.jar拷贝到 项目libs目录下,
然后在 module 的 build.gradle 文件中添加配置:
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
compileOnly files('libs/hisi-android.jar')
}
//预编译时替换掉sdk中对应的jar
preBuild {
doLast {
def imlFile = file(project.name + ".iml")
// def imlFile = file(".idea\\modules\\app\\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
}
}
}
注意:
使用 compileOnly(默认是 implementation),compileOnly 表示 jar 包只参与编译,不会打包进去。
然后在 整个项目 的 build.gradle 文件中添加配置:
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:D:\\AS\\AndroidStudioProjects\\KTV\\ktv\\k900_kugou_karaok\\libs\\hisi-android.jar')
}
}
这个 task 在编译之前, 自动更改module.iml,将下面代码会移动最后
<orderEntry type="jdk" jdkName="Android API 30 Platform" jdkType="Android SDK" />
才能在编译时使用我们引入的 framework.jar。
至此就可以正常调用厂商私有接口而不会编译报错,但是Android Studio上还是会显示红色,这不影响使用。
参考:https://blog.csdn.net/yzwfeng/article/details/125540849