在Android Studio 中开发系统应用,想要使用系统中某些三方app 无法使用的api, 往往会爆红,无法找到对应的方法或者属性
此时,做如下步骤,就可以正常编译。
1. framework.jar 的添加
将系统jar包放到module的libs文件夹下
framework.jar 来源,可以在网上搜索相应版本的jar包,当然,最正确的使在对应的源码产物中获取,
路径为\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar
因为该目录下所有的jar文件名都为classes.jar,为了在AS里便于区分,我重命名为framework.jar
2. Project的build.gradle 文件中添加 gradle.projectsEvaluated
提高编译时lib库的引用优先级
allprojects {
repositories {
google()
jcenter()
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework.jar')
}
}
}
3. module 的 build.gradle 中,添加fw jar包依赖,同时提高其在模块.iml 中的顺序,使其优先于本地自带的sdk
dependencies {
....
compileOnly files('libs/framework.jar') // 添加要使用的fw jar包
}
//将本地sdk 顺序置于模块iml文件的最后,使优先使用自己的fw 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
}
}
}
结语:
如果帮到各位,欢迎点赞支持,谢谢!